Skip to content

The goal is to help people who can't or don't want to read

Notifications You must be signed in to change notification settings

fallra1n/text-reproducer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Text Reproducer

The goal is to help people who can't or don't want to read


Начало Работы

  • Клонируйте

    git clone [email protected]:fallra1n/text-reproducer.git
    
  • Установка зависимостей

    (P.S)Только один(в первый) раз!
    chmod +x req_install.sh
    
    ./req_install.sh
    

    (P.S) не хотел писать "pip install req...", так как это не сработает из-за спецефичных пакетов, для начала нужно поставить различные библиотеки на машину типо libspeak1(если это убунту) или espeak(для arch), поэтому в будущем это скрипт будет изменен!

  • Запуск тестов

    (P.S)Только один(в первый) раз!
    chmod +x run_test.sh
    
    ./run_test.sh
    
  • Запуск приложения

    (P.S)Только один(в первый) раз!
    chmod +x run_app.sh
    
    ./run_app.sh
    
  • Урааа, мы открылись!


Теперь про функционал и инструменты

  • Для воспроизведения текста используется библиотека pyttsx3.

  • Для графики используется библиотека tkinter.

После запуска приоложения у нас запускается окошко:

  • Итак, мы можем выбрать файл для воспроизведения нажав кнопку 'Выбрать файл'.

  • Кнопка по середине запускает текущий файл и при воспроизведении сменяется на кнопку паузы(и наоборот).

  • Нижняя кнопка прерывает текущее воспроизведение.

  • [Дисклеймер №1] Если вы нажимаете кнопку выбрать файл, то вы объязательно должны выбрать его, а не нажать 'cancel', т.е продолжить слушать текущий файл не получится, если вы поставили его на паузу, а потом в холостую выбрали файл.


Теперь про внутренную реализацию

  • Кнопка выбрать файл функционирует средствами Tkinter'a.

  • Итак, воспроизведение каждого файла происходит в отдельном процессе, этот процесс создается и запускается в функции play_text в файле src/app/widgets_handlers.py:

    new_process = multiprocessing.Process(target=run, args=(last_file_path, ))
    new_process.start()
    
  • Для того, чтобы поставить воспроизведение на паузу мы используем сигнал 'SIGSTOP'.

    if last_process_pid != -1:
        os.kill(last_process_pid, signal.SIGSTOP)
    

    А будить мы будем c помощью сигнала 'SIGCONT' (code):

    elif last_process_pid != -1:
        os.kill(last_process_pid, signal.SIGCONT)
    
  • Для остановки воспроизведения мы используем сигнал 'SIGKILL'(просто убиваю запущенный процесс):

    if last_process_pid != -1:
        os.kill(last_process_pid, signal.SIGKILL)
    

Теперь про структуру

 <project>
  |-- src
  |   |-- app
  |   |   |-- app.py
  |   |   |-- widgets_handlers.py
  |   |
  |   |-- back
  |   |   |-- text_reproducer.py
  |   |   |-- session.py
  |   |
  |   |-- main.py
  |
  |-- tests
  |   |-- test_paths.py
  |
  |-- README <- мы тут
  • В app.py объявлен класс App, который реализует графику и кнопки с помощью tkinter'а в своих методах.

  • В main.py создается экземпляр класса App после вызывается метод Run, в котором все инициализируется и запускается окошко.

  • К каждой кнопке подвешивается свой хэндлер, все хэндлеры и вспомогательные функции объявлены в файле widgets_handlers.py.

  • В файле back/session.py реализуется класс Session, который в своем методе воспроизводит переданный файл с помощью библиотеки pyttsx3.

  • В обработчике кнопки старт создается процесс, в который для исполнения передается функция Run из файла back/text_reproducer.py в котором создается обеъкт класса Session и вызывается метод Run.

About

The goal is to help people who can't or don't want to read

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published