Про звуковую подсистему KolibriOS
Начну с того, что изначально в Колибри, году в 2003, не было звуковой подсистемы. Доставшееся от MenuetOS наследие (напомню, что KolibriOS — это ответвление от MenuetOS, fork, ставшее самостоятельным проектом разработки операционной системы в 2004 году) содержало внедренную в ядро поддержку SB16, которой по факту никто не пользовался, за отсутствием такого железа у большинства пользователей. Так же был плеер звука для воспроизведения WAV файлов, написанный Иваном Поддубным.
Спустя несколько лет, появилась звуковая подсистема Infinity, написанная Сергеем Семёновым (Serge), которая изначально была ориентирована на поддержку звуковых карт стандарта AC97. Причем некоторые кодеки сторонних производителей не работали и дописывались впоследствии, иногда даже без наличия оборудования у самого разработчика. В частности, для поддержки SIS, пришлось более 50 раз перезаписывать болванку CD-RW, так как USB-флешки тогда еще были дорогими, и соответственно не всем доступными. Далее, усилиями нескольких людей была реализована поддержка звуковых карт стандарта HDA. На Хабре присутствует один из разработчиков Asper. Процесс продолжается и по сей день, так как разработка Колибри не прекращалась.
Параллельно с разработкой самой звуковой подсистемы велась разработка программ, ее использующих. Были разработаны аудиоплеер AC97SND и видеоплеер FPlay. Поддержка звука была добавлена в порт игры Doom и эмулятор DOSBox. К сожалению, до порта Quake руки у разработчиков пока еще не дошли, но когда-нибудь и в него звук добавим.
Как видим, поддержка звука была преимущественно реализована для программ, написанных на ЯВУ. И это неудивительно, потому что для них были написаны все нужные обвязочные файлы. Для программ, написанных на ассемблере, не было особой потребности в звуке, да и толкового описания, к сожалению, не было составлено.
Вообще, отсутствие подробной и доступной документации — это проблема любого проекта, а не только Колибри. Дело в том, что затраты на документирование зачастую составляют столько же времени, сколько нужно на написание кода и его отладку. Дело чаще не в лени программистов, а в нехватке времени. В результате, последующим разработчикам приходится либо изучать готовый код и вникать в то, как он работает, либо дергать разработчика, добиваясь хоть какого-нибудь описания для дальнейшего использования. Были получены некоторые не систематизированные ответы от нашего главного разработчика звуковой подсистемы (Serge), на основе которых создана простенькая документация на wiki проекта.
Про разработку речевого движка
Идею я вынашивал уже давно. Еще в подростковом возрасте мне была интересна тема синтезаторов речи, но ресурсов, чтобы заниматься этим, практически не было. Когда у меня в 8-м классе школы появился БК-0010, то на нем был речевой движок «Говорун». Вообще, это было достижением для такого компьютера — впихнуть в 8 Кб и данные, и код, при том что всего там 16 Кб памяти ОЗУ, а также получить из однобитного магнитофонного выхода достаточно разборчивую речь. Программист этой программы, Зальцман Юрий, был вообще неординарным человеком, и много чего разрабатывал как программного, так и аппаратно-программного для БК-0010. Впрочем, речь в статье не об этом, а отступление было сделано лишь для того, чтобы показать, откуда произрастают предпосылки к созданию речевого движка для Колибри. К слову, на Хабре было две статьи про этот бытовой компьютер: МикроЭВМ БК 0010-01 и Бытовой компьютер БК-0010-01. Дубль два.
Изучив тему программной реализации речевого движка, я выявил следующие варианты:
1) Произношение по буквам
Преимущества: легкость реализации, малое количество сэмплов.
Недостатки: низкое качество речи, трудно воспринимаемое неподготовленным слушателем.
2) Произношение по слогам
Преимущества: повышенное качество речи.
Недостатки: реализация труднее, чем в п.1, большое количество сэмплов.
3) Произношение по словам
Преимущество: максимальное качество воспроизведения.
Недостатки: реализация нереальна для одиночного разработчика, потому что количество сэмплов для русского языка порядка 120 тысяч, а если учитывать все падежи и прочие особенности, то вообще практически нереальна для реализации.
Поскольку третий вариант по уровню сложности неподъемный для одиночного разработчика, да даже большая организация вряд ли возьмется за такое, то я решил остановиться на втором варианте. Впрочем, первая версия реализации (для себя) делалась вообще по первому варианту. Преимущество же второго метода в том, что можно его постепенно реализовывать, добавляя более сложные семплы в 4 и более звуко-символов.
Поскольку реализация была на ассемблере, то связываться с MP3 и прочими форматами не было особого желания, да и качество разборчивости синтезированной речи могло пострадать от сжатия с потерями. По этим причинам был использован старый добрый WAV.
Порывшись в сети, я нашел готовый сформированный список возможных слогов русского языка. Список был довольно внушительным — 6357 слогов.
Про подготовку семплов
Для создания семплов требовалось их чем-то записывать. Многие встроенные звуковые платы имеют микрофонный вход, но, к сожалению, зачастую очень хорошо ловят «наводки» от других цепей самого же компьютера, в результате этот звенящий шум убивает всю идею записи звука. К тому же, хорошего микрофона у меня под рукой не было. По этой причине, были изучены имевшиеся под рукой более мобильные средства записи: видеокамера, смартфон и даже фотоаппарат (функция диктофона).
Камера Sony, как средство записи звука, отпала первой: запись на MiniDV и сброс через IEEE1394 — не самое быстрое занятие. У фотоаппарата Pentax в режиме диктофона выявилась проблема — частота записанного звука была только 8 кГц, что может быть приемлемым для разборчивости речи, но для отдельных семплов не подходит. Оставался только смартфон Gigabyte S1200, и, как выяснилось, микрофон у него весьма хороший, а звук записывается в AAC формате.
Далее, записанные файлы очищались от фонового шума, а он всегда есть — я же не имею возможность записывать в звукоизолированном помещении, вроде тех что имеются в студии звукозаписи. Для редактирования и очистки мне хватило возможностей программы Audacity
Про написание движка
Движок написан на ассемблере FASM. Вообще, это одна из моих принципиальных позиций. Все, что я могу написать для Колибри — я пишу на FASM. Однако, я реалист и понимаю, что некоторые вещи реализовать на ассемблере достаточно сложно. Случаи лени у программиста я не рассматриваю — это отдельный вопрос.
Версия 0.1 была сделана 25 апреля 2012, на тот момент программа читала только по буквам. Семплы были не самым лучшим образом подготовлены, потому качество речи было весьма посредственным.
Пример v01.mp3
Версия 0.2 была выпущена 3 мая 2012 и cодержала скорее косметические изменения. Был уменьшен размер семплов и ускорен темп речи.
Пример v02.mp3
Версия 0.3 была написана 19 мая 2012 и содержала двухбуквенные семплы, количество семплов более 300. Версия не выкладывалась, поскольку имела некоторые недоработки.
Пример v03.mp3
Версия 0.4 была выпущена 22 мая 2012 и содержит следующие изменения:
1) Используются слоги до двух букв. Всё, что не совпадает, формируется из букв.
2) Слово предварительно формируется в буфер PCM из букв и найденных слогов.
3) Семплы сгруппированы в отдельном подгружаемом файле, который собственно и составляет голос. В будущем, если будут другие голоса, можно будет заменять их. Семплы 22 кГц, моно, 16 бит.
Размер исполняемого файла составляет 3829 байт, размер файла с семплами 4,66 Мб.
Пример: lukomorie.mp3
Эпилог
Конечной функцией программы является вывод звука, по этой причине GUI у нее отсутствует. Однако, это не мешает написанию стороннего GUI, использующего движок, и вызову движка из других программ, например, словарей или текстовых редакторов. Разумеется, это потребует написания связующего кода. В настоящий момент программа принимает при запуске только один параметр — путь к воспроизводимому файлу с текстом.
К сожалению, из-за отсутствия времени разработка приостановилась. В проекте KolibriOS много идей и задач и, как и везде, острая нехватка исполнителей-программистов. Однако, работа будет продолжена в будущем.
Тема форума, в которой ведется обсуждение Проект: Речевой движок
Автор: Mario_Z