1. Работа со звуком при создании словарных баз: общие сведения
Обычные словарные базы в формате sdc (словари и разговорники) могут содержать в себе озвучку слов как в списках слов, так и в переводах статей. Также можно создать полностью звуковую базу, которая будет содержать только список озвученных слов без переводов.
Чтобы встроить озвучку в базу sdc, нужно сначала специальным образом подготовить исходные звуковые файлы, сконвертировав их в наш внутренний формат звуковых файлов с расширением *.spx. Далее эти *.spx файлы можно указывать как источник озвучки в различных частях исходных xml-файлов словаря. Все такие звуковые файлы компилятор будет встраивать в базу sdc.
Звуковые файлы c расширением .spx основаны на стороннем формате кодирования speex и сами по себе представляют контейнер, т.е. .spx внутри может содержать как сжатый именно speex-кодеком звук, так и wav или mp3, которые просто обернуты в speex-оболочку ради единообразия. Выбор того, какой из вариантов использовать обычно основывается на следующей логике:
- у нас нет никаких специальных требований по звуку, нужен просто звук “как везде” – используем сжатие в spx (он дает достаточно неплохое качество при маленьком объеме); самый распространенный вариант
- звук в spx нас не устраивает по качеству при этом хочется золотой середины по размеру файла между spx и wav – используем mp3. Этот вариант практически не используется, размер файлов будет в 2…10 раз больше spx
- звук в spx/mp3 не устраивает по качеству – используем оригинальный wav. Этот вариант также очень редок, т.к. размер файлов может быть неоправданно большим (объем исходного wave звука может в 50-100 раз превышать spx)
В любом из этих случаев, упаковкой и при необходимости конвертацией исходных звуковых файлов в формат spx занимается утилита SpeexCompressor. Но перед тем, как конвертировать SpeexCompressor-ом, может потребоваться адаптация исходных звуковых файлов, так как конвертер имеет некоторые ограничения на входные данные (к примеру, частота дискретизации исходного файла отличается от допустимых конвертером значений) или же просто исходный звук нуждается в коррекции. Для этого используется несколько самостоятельных утилит.
2. Декодирование mp3 звука
Чаще всего исходные данные звука приходят в форматах wav и mp3. Но именно для сжатия в spx на вход мы должны передавать только wav файлы, т.е. mp3 нужно предварительно декодировать. Для этого можно использовать:
- lame.exe
Как вариант его можно использовать в батнике командной строки примерно в таком виде: lame.exe -V9.8 -b24 -B32 –vbr-new -m m -q0 –resample 22.05 <input_file> <output_file>
В этом примере звук декодируется в mono 22.05 kHz wave
- AIMP Audio Converter
Имеет графический интерфейс, в котором можно задать выходной формат (WAVE), частоту дискретизации (22050), количество каналов (mono) и глубину звука (16 бит). Умеет принимать на вход как произвольный набор файлов, так и папку.
- mpg123
Использовалась при наличии проблем с AIMP Converter-ом. Взять можно на официальном сайте.
Пример использования: mpg123.exe -q -w “wav_spec\additive.wav” -r 22050 “mp3\additive.mp3”.
3. Изменение настроек звука перед конвертацией
Иногда исходный звук не подходит по частоте дискретизации или отдельные файлы в составе архива сильно выбиваются по громкости – требуется ресэмплинг и/или нормализация. Одним из способов решения этой проблемы является использование утилиты SoX.
Консольная утилита SoX может преобразовывать различные форматы аудиофайлов в другие форматы. В процессе преобразования она также может применять к этим файлам различные эффекты. SoX может работать с форматами Ogg Vorbis, MP3, WAV, AIFF, VOC, SND, AU, GSM и некоторыми другими. Найти подробную документацию, примеры использования, а также скачать утилиту, можно на сайте SoX. Приведем пару примеров для наглядности:
1) пакетно изменяем частоту дискретизации всех wav-файлов в текущей папке с помощью SoX, сохраняя результат в папку “converted” :
mkdir converted
FOR %%A IN (%*) DO sox.exe %%A “converted/%%~nxA” rate -v 44100
2) делаем нормализацию звука исходного файла до нужного уровня -2dBFS:
sox.exe −−norm=−2 in.wav out.wav
4. SPXCompressor
Утилита SPXCompressor.exe предназначена для конвертации исходных звуковых файлов некоторых распространенных форматов в некий внутренний формат для хранения в базе sdc.
Общий ход работы программы следующий:
- на вход программы подаются звуковые файлы в одном из допустимых входных форматов;
- на выходе всегда получаются сконвертированные файлы с теми же именами, но с расширением *.spx
Общий формат запуска утилиты следующий:
SPXCompressor.exe <input folder> <output folder> [/spx|/wav|/mp3] [/c{1-10}] [/f{11|22}] [/n{N}] [/smart-{spx|wav}] [/spak-add:file] [/spak-add-rp:file]
Рассмотрим подробнее перечисленные параметры:
<input folder>
Обязательный параметр. Указывает путь к каталогу с исходными звуковыми файлами, которые нужно сконвертировать. Допускаются абсолютные и относительные пути. Файлы обрабатываются нерекурсивно, то есть только в указанном каталоге без учета вложенных каталогов.
<output folder>
Обязательный параметр. Указывает путь к каталогу для сохранения сконвертированных *.spx файлов.
[/spx|/wav|/mp3/ogg]
Необязательный параметр. По-умолчанию /spx. Можно указать один из флагов /spx, /wav или /mp3, который фактически определяет допустимый входной формат звуковых файлов, а также метод сжатия для получения сконвертированных файлов. Рассмотрим их подробнее.
/spx
Из <input folder> обрабатываются все файлы с расширением *.wav. Файлы сжимаются с использованием кодека speex, оптимизированного в основном для сжатия голосовых звуковых данных, с потерей качества и со значительным уменьшением размера файла. Качество сжатия можно регулировать (см. параметр /c).
/wav
Из <input folder> обрабатываются все файлы с расширением *.wav. Файлы не сжимаются, как в случае со /spx, но может быть уменьшена частота выходного файла – в этом случае происходит потеря качества и уменьшение размера выходного файла (см. параметр /f). Если понижения частоты не происходит – не происходит потери качества и уменьшения размера выходного файла.
/mp3
Из <input folder> обрабатываются все файлы с расширением *.mp3. Файлы не сжимаются, потери качества и уменьшения размера выходного файла не происходит.
/ogg
Из <input folder> обрабатываются все файлы с расширением *.ogg. Файлы не сжимаются, потери качества и уменьшения размера выходного файла не происходит.
[/c{1-10}]
Необязательный параметр. По-умолчанию /c4. Имеет смысл только для случая /spx, в остальных случаях игнорируется. Этот параметр указывает качество сжатия, по-умолчанию используется рекомендуемое значение /c4 – приемлемый баланс между качеством голосовых данных и размером выходного файла. /c1 – наихудшее качество и минимальный размер файла, /c10 – наилучшее качество и максимальный размер файла. Обычно подбирается прослушиванием итоговых файлов с оценкой качества, чаще всего используются значения /c4…7
[/f{11|22}]
Необязательный параметр. По-умолчанию /f22. Имеет смысл только для случая /spx и /wav, в остальных случаях игнорируется. Этот параметр указывает частоту дискретизации выходного файла, которая может быть либо 11 kHz (/f11), либо 22 kHz (/f22). По-умолчанию используется рекомендуемое значение 22 kHz. Если частота входного файла меньше запрошенной частоты выходного, или частота входного файла не кратна 11 kHz – такой входной файл не сконвертируется и будет сообщено об ошибке. Отсюда следует, что при использовании параметров /spx и /wav частота входного файла должна быть 44 kHz, 22 kHz или 11 kHz. Если при соблюдении всех этих условий запрошенная частота выходного файла меньше частоты входного – происходит понижение частоты и потеря качества с уменьшением размера файла.
[/n{N}]
Необязательный параметр. По-умолчанию /n100. Имеет смысл только для случая /spx и /wav, в остальных случаях игнорируется. С помощью этого параметра можно изменить амплитуду выходных звуковых данных (фактически громкость), в качестве значения указывается количество процентов от амплитуды исходного звукового потока. По-умолчанию используется значение /n100 – то есть амплитуда остается без изменения. Этот параметр не влияет на качество и размер выходного файла.
[/smart-{spx|wav}]
Необязательный параметр. По-умолчанию не используется. Имеет смысл только для случая /spx и /wav, в остальных случаях игнорируется. Указание одного из параметров /smart-spx или /smart-wav включает так называемый «умный» режим обработки файлов. В этом режиме особым образом обрабатываются файлы, продолжительность звучания которых превышает 5 секунд, остальные файлы обрабатываются в соответствие с прочими указанными параметрами, перечисленными выше. Эти изменения в способе сжатия направлены на ускорение декодирования звука на конечных устройствах в оболочках.
/smart-spx
Для указанных файлов принудительно устанавливается выходной формат /spx и принудительно устанавливается выходная частота 11 kHz, остальные переданные параметры (качество, громкость) не меняются.
/smart-wav
Для указанных файлов принудительно устанавливается выходной формат /wav и принудительно устанавливается выходная частота 22 kHz, остальные переданные параметры не меняются.
/spak-add:file
Все выходные файлы добавляются в контейнер озвучек SpeexPack с именем file (имя файла может содержать относительный или абсолютный путь). Если файла с указанным именем не существует, то он будет создан. Все пути для добавляемых выходных файлов будут начинаться от папки «output folder» (будут включать папку «output folder»), например: «output folder\sound001.spx», «output folder\path\to\en\sound002.spx», «output folder\path\to\uk\sound003.spx».
/spak-add-rp:file
Этот параметр аналогичен параметру /spak-add:file, но в данном случае пути добавляемых выходных файлов не будут включать папку «output folder» (-rp – Relative Path), то есть кусок пути «output folder» будет удаляться из имени файла при добавлении в контейнер: «sound001.spx», «path\to\en\sound002.spx», «path\to\uk\sound003.spx».
На этом описание параметров закончено. Если в процессе конвертации какого-либо файла произошла ошибка, выводится сообщение об ошибке и продолжается конвертация остальных файлов. Выходной файл не создается.
5. Общие замечания по обработке звука и использованию параметров сжатия
Как упоминалось в начале статьи, если важен небольшой размер выходных звуковых файлов (а в итоге и базы sdc в целом), нужно использовать метод сжатия /spx в ущерб качеству звука в зависимости от настроек самого качества сжатия (параметр /c). Если качество звука важнее, нужно использовать метод сжатия /wav с возможной потерей качества в зависимости от частоты, или /mp3 – вообще без потерь качества.
Некоторую гибкость дает также «умный» режим сжатия.
Также нужно отметить, что звук, сжатый методом /spx, декодируется в ядре в целом дольше, чем звук, сжатый с помощью остальных методов; хотя это скорее формальное ограничение – ряд накладных расходов на пути от нажатия кнопки в ui до собственно декодирования обычно нивелирует разницу (т.к. сами файлы небольшие – 1…15 сек – и процесс так или иначе происходит быстро)
С точки зрения хранения звуков и последующей сборки очень удобен SpeexPack.
6. Добавление озвучки в базу sdc
Для добавления озвучки в базу используется тег метаданных <sound> (рекомендуется ознакомиться с его описанием)
При добавлении озвучки в словарь или разговорник озвучка может быть встроенной или внешней. В случае встроенной озвучки содержимое звуковых файлов *.spx добавляется непосредственно в базу sdc и при использовании в ядре данные читаются из нее же. В случае внешней озвучки база sdc не содержит непосредственно звуковых данных для озвучивания конкретного тега <sound>, вместо этого тег <sound> ссылается на внешнюю звуковую базу, и при использовании такой озвучки в ядре оболочка должна открывать внешнюю звуковую базу и использовать озвучку из нее.
Формальное описание тега <sound> и всех его параметров находится выше, а здесь рассмотрим его использование на конкретных примерах.
7. Озвучка в переводе
Встроенная
<tag1>text<tag1><sound url="sound1.spx"></sound>…
<sound url="EN\sound2.spx" />…
<sound url="GB\sound3.spx" />…
Тег озвучки располагается прямо в тексте перевода, на месте тега <sound> оболочка должна будет вставить иконку, при клике на которую будет воспроизведен звук. Звуковые файлы *.spx встраиваются непосредственно в базу sdc.
В файле проекта *.sproj в разделе <Articles> нужно указать путь к каталогу, в котором компилятор будет искать все используемые в переводах звуковые файлы *.spx, например:
<Articles>
...
<SoundFolder>..\Source\Sound</SoundFolder>
...
</Articles>
Указать можно только один тег <SoundFolder>. Пути в теге <SoundFolder> могут быть абсолютными или относительными. Пути в атрибуте url тега <sound> вычисляются относительно пути, указанного в теге <SoundFolder>.
Внешняя
<sound dictid="55FС" listidx="1" key="Russian Federation" />
Тег озвучки ссылается на внешнюю звуковую базу с DICT_ID 55FС, список слов с номером 1 и слово «Russian Federation» в этом списке слов. При отображении перевода на месте тега <sound> оболочка должна будет вставить иконку, при клике на которую будет воспроизведен звук. Для этого оболочка должна будет открыть звуковую базу с указанным DICT_ID (атрибут dictid), перейти на список слов с указанным номером (атрибут listidx) и выполнить в этом списке слов поиск по тексту указанного слова (атрибут key). Найденное слово будет содержать требуемую озвучку (см. следующий пункт «Озвучка в списке слов»). В файле проекта *.sproj дополнительно ничего указывать не надо, т.к. файлы внутрь базы не встраиваются.
8. Озвучка в списке слов
Озвучка может располагаться не в самом переводе, а озвучивать какое-либо слово из списка слов. Общее устройство исходного xml-файла словаря, содержащего список слов, описано в статье Устройство xml файла списка слов. Рассмотрим на конкретных примерах добавление озвучки в список слов.
Встроенная
<article id="0"><sound url="00.spx" /><wl-name>word1</wl-name><id>0</id></article>
<article id="1"><sound url="01.spx" /><wl-name>word2</wl-name><id>1</id></article>
Тег озвучки располагается в описании конкретного слова в списке слов. Оболочка должна предоставить механизм (специальная кнопка или что-нибудь еще), позволяющий воспроизвести озвучку для выбранного слова в списке слов. Звуковые файлы *.spx встраиваются непосредственно в базу sdc.
В файле проекта *.sproj в разделе <List> нужно указать путь к каталогу, в котором компилятор будет искать все звуковые файлы *.spx для данного списка слов, например:
<List>
...
<SoundFolder>..\Source\Sound</SoundFolder>
...
</List>
Указать можно только один тег <SoundFolder>. Пути в теге <SoundFolder> могут быть абсолютными или относительными. Пути в атрибуте url тега <sound> вычисляются относительно пути, указанного в теге <SoundFolder>.
Внешняя
<article id="1"><sound dictid="55FF" listidx="2" key="Heinlein" /><wl-name>Robert Anson Heinlein</wl-name><id>1</id></article>
В этом случае внешняя озвучка имеет тот же смысл, что и внешняя озвучка в переводе. Тег озвучки ссылается на внешнюю звуковую базу с DICT_ID 55FF, список слов с номером 2 и слово «Heinlein» в этом списке слов. Оболочка должна предоставить механизм (специальная кнопка или что-нибудь еще), позволяющий воспроизвести озвучку для выбранного слова в списке слов. Для этого оболочка должна будет открыть звуковую базу с указанным DICT_ID (атрибут dictid), перейти на список слов с указанным номером (атрибут listidx) и выполнить в этом списке слов поиск по тексту указанного слова (атрибут key). Найденное слово будет содержать требуемую озвучку.