Форум ReidS Soft

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Форум ReidS Soft » Flite+hts_engine » Перевод htk book


Перевод htk book

Сообщений 1 страница 16 из 16

1

Здесь дан неполный перевод некоторых глав. Присылайте свои варианты.

Глава 1
Основы HTK

HTK - пакет разработчика для построения Скрытых Моделей Маркова (HMMs). HMMs можно использовать для  моделирования любых временных последовательностей, аналогично ядро HTK разработано как ядро общего назначения. Тем не менее, изначально пакет HTK разрабатывался для создания инструментов обработки речи на основе HMM, для конкретных устройств распознавания. Таким образом, большая часть поддерживаемой инфраструктуры HTK посвящена  этой задаче. Как показано на изображении выше, существует два основных этапа обработки. Во-первых,  обучающие инструментальные средства HTK используются для оценки параметров набора HMMs, путем использования  обучающих высказываний и связанных с ними транскрипций.
Во-вторых, неизвестные высказывания переписываются путем  использования инструментальных средств распознавания HTK.
Основная часть этой книги посвящена описанию механизма этих двух процессов.
Тем не менее, прежде, чем углубляться в детали, необходимо  понимать некоторые основные принципы HMMs. Полезно иметь представление о пакете разработчика, а также представлять, как организованы процессы подготовки и распознавания в HTK.
Эта  первая попытка  предоставить данную информацию в формате книги. В 1-ой главе описаны основные идеи HMMs и их применение для распознавания речи. Следующая глава дает краткий обзор HTK и выделяет основные различия в версии 2.0 и выше для пользователей предыдущих версий. Наконец, в главе 3 первой части руководства описывается процесс создания устройcтва распознавания речи на основе HMM. С этой целью дается описание конструкции небольшого простого словаря для устройства распознавания слитной (или непрерывной) речи.
Вторая часть книги  вновь касается тем, рассмотренных здесь, но дает их подробное описание. Ее можно прочитать  вместе с третьей и заключительной частью книги, оформленной в виде справочника по HTK. Она включает описание каждого инструмента, обобщает использование различных параметров для конфигурирации HTK и содержит список сообщений об ошибках, генерируемых, когда что-нибудь идет неправильно.
Наконец, вам следует учесть, что эта книга только описывает HTK как средство-комплект. В ней отсутствует информация по использования библиотек HTK как среды программирования.

1.1 Общие принципы HMMs

------------------
s1 s2 s3 и т.п.
s1 s2 s3
Речь в виде звука
Речевые Векторы
Понятие: последовательность символов
Параметризация
Распознать
--------------------------
Рис. 1.1  Кодирование/декодирование сообщения

Системы распознавания речи обычно предполагают, что речевой сигнал является реализацией некоторого сообщения, закодированного в виде последовательности одного или нескольких символов (смотрите Рис. 1.1 ). Для того, чтобы произвести обратное действие распознавания основной символьной последовательности, давшей устное высказывание, непрерывный речевой сигнал  преобразуется сначала в последовательность одинаковых дискретных параметрических векторов. Эта последовательность параметрических векторов принята для того, чтобы сформировать точное представление речевого сигнала на том основании, что на протяжении каждого единичного вектора (обычно 10мс или около того), речевой сигнал можно считать неизменным. Хотя это не соответствует истине, это разумная аппроксимация. Типичные параметрические представления  в общем случае - это сглаженные спектры или линейные коэффициенты предсказания плюс различные другие представления, производные от них.
Устройство распознавания должно производить распределение между последовательностями речевых векторов и желаемой основной  символьной последовательностью. Две проблемы делают этот процесс очень трудным. Во-первых, переход от символов к речи не взаимно-однозначный, поскольку другие основные символы могут вызывать аналогичные речевые звуки. Кроме того, есть большие изменения в реальном речевом сигнале из-за изменчивости докладчика, его настроения, среды, и т.п. Во-вторых, границы между символами не могут быть явно определены  из речевого сигнала. Следовательно, возможно не следует рассматривать речевой сигнал как последовательность соединенных статичных образцов.
Вторая проблема незнания точного положения границ каждого слова может быть аннулирована путем  перехода к задаче распознаванию раздельной речи (изолированных слов). Как показано на Рис. 1.2, это подразумевает, что речевой сигнал соответствует единственному основному символу (напр., слову), выбранному из фиксированного словаря. Несмотря на то, что это простая проблема будет отчасти искусственной, тем не менее, она имеет большое разнообразие практических применений. Кроме того, это послужит хорошей основой для освоения основных идей распознавания речи на основе HMM перед работой с более сложным случаем распознавания слитной (непрерывной) речи. Следовательно, вначале рассмотрим задачу распознавания раздельной речи с использованием скрытых марковских моделей.

1.7 Адаптация к диктору.
Хотя, описанные выше технологии подготовки и распознавания могут послужить основой для построения  высокопроизводительных систем распознавания речи, эти системы могут быть улучшены путем подстройки HMMs к характеристикам конкретного диктора. HTK содержит инструментальные средства HERest и HVite для выполнения адаптации с использованием небольшого количества зачисленных или адаптационных данных. Два инструментальных средства отличаются тем, что HERest выполняет offline адаптацию под контролем оператора, в то время как HVite распознает адаптационные данные и использует сгенерированные транскрипции для выполнения адаптации. Обычно, более точная адаптация выполняется под контролем оператора с помощью HERest, но HVite, получив на входе набор хорошо обученных моделей,  может все еще достичь заметного повышения производительности. Подробное описание   адаптации и  использование HTK дано в Главе 9.

Глава 2
Обзор инструментальных стредств HTK

Основные принципы процесса распознавания на основе HMM были изложены в предыдущей главе, где уже было упомянуто большинство ключевых инструментов НТК. В этой главе описывается архитектура программного обеспечения  инструментария HTK. Затем дается краткий обзор всех инструментов (утилит) НТК и способ их совместного использования с целью построения и проверки устройсва распознавания на основе HTK. В интересах существующих пользователей НТК, здесь перечислены основные изменения в последних версиях HTK.
В следующей главе будет описано  использование инструментария HTK на практическом примере построения простой системы распознания слитной речи.

2.1  Архитектура программного обеспечения НТК

Большинство функций HTK встроено в библиотечные модули. Эти модули являются гарантией того, что  каждый инструмент будет иметь одинаковый интерфейс с внешним миром. Они также предоставляют общий ресурс для часто используемых функций. Рис. 2.1 иллюстрирует структуру программного обеспечения типичного инструментария HTK и показывает его входные / выходные интерфейсы.
Пользовательский ввод/вывод и взаимодействие с операционной системой контролируется библиотечным модулем HShell,  управление памятью реализуется в HMem. Математическую поддержку обеспечивает HMath, а операции обработки сигналов, необходимые для анализа речи, реализованы в HSigP. Каждый из типов файлов, необходимых HTK, имеет специальный интерфейсный модуль. HLabel обеспечивает интерфейс для файлов этикеток(маркеров), HLM - для файлов модели языка, HNet - для сетей и решеток, HDict для словарей, HVQ - для VQ кодовых книг и HModel - для определений HMM.

Рис. 2.1

Весь речевой ввод и вывод на уровне звуковых волн реализован через HWave, а на уровне параметризации - через HParm. Также, обеспечивая последовательный интерфейс, HWave и  HLabel поддерживают многочисленные файловые форматы, допускающие импорт данных из других систем. Прямой аудиоввод обеспечивает HAudio, а простая диалоговая графика обеспечивается модулем HGraf. HUtil обеспечивает множество подпрограмм для  манипуляции HMMs, тогда как HTrain и HFB содержат поддержку для различных тренировочных инструментов HTK. HAdapt отвечает за различные инструментальные средства адаптации HTK. Наконец, HRec содержит основные функции, необходимые для процесса распознавания.
Как отмечено в следующей секции, управление поведением этих библиотечных модулей осуществляется простой установкой переменных конфигурации. Подробное описание функций библиотечных модулей дано во второй части этой книги, и важные переменные конфигурации описаны по мере их использования. Для удобства поиска, полный список дан в главе 18.

2.2 Общие Свойства инструментария HTK
Инструментальные средства HTK работают из командной строки с традиционным стилем интерфейса. Каждый инструмент (утилита) имеет множество необходимых аргументов плюс дополнительные аргументы. Последние всегда  имеют префикс - знак "минус". Например, следующая команда должна запустить средство mythical HTK с названием HFoo
HFoo -T 1 -f 34.3 -a -s myfile file1 file2

Эта утилита имеет два основных аргумента с именами file1 и file2, плюс четыре дополнительных аргумента. Опции всегда вводятся с виде единственного символа со значением опции там, где это необходимо. Величина опции всегда отделена от имени опции символом "пробел". Таким образом, в этом примере величина
опции -f является действительным числом, величина опции -T является целым числом и величина опции -s является строкой. Опция -a не имеет величины, и она используется как простой флаг для  добавления или отключения некоторой характеристики утилиты. Опции, чьи имена являются Прописными буквами, имеют одно и то же значение для всех инструментальных средств. Например, опция -T всегда используется для управления  выводом на экран для утилит HTK.
Дополнительно к командным аргументам строки, операция средства может управляться параметрами,
загруженными из файла конфигурации. Например, если выполнена команда HFoo -C config -f 34.3 -a -s myfile file1 file2, утилита HFoo загрузит параметры, указанные в файле конфигурации config во время своей процедуры инициализации. Многочисленные файлы конфигурации могут быть определены путем повтора опции -C, например,
HFoo -C config1 -C config2 -f 34.3 -a -s myfile file1 file2

Параметры Конфигурации  иногда могут использоваться как альтернатива  аргументам командной строки.
Например, опции экранного вывода всегда могут быть устанавливаны в пределах файла конфигурации. Тем не менее, основное назначение файлов конфигурации - точное управление поведением библиотечных модулей, от которых зависят все инструментальные средства HTK.
Хотя этот стиль командной строки работы может показаться старомодным по сравнению с современными
графическим интерфейсом пользавателя, у него есть много преимуществ. В конкретном случае, это упрощает процесс написания сценариев оболочки для управления средствами HTK. Это важно для настраиваемого крупномасштабного системного построения и экспериментирования. Кроме того, определять всех операций базирующихся текстовых команд использования допускает детали системной конструкции или экспериментальной процедуры, которая нужно записывать и подтверждалась.
Наконец, необходимо отметить что короткая справка по командной строке и опциям для любого инструмента HTK можно получать путем простого запуска без аргументов.

2.3 Пакет разработчика
Инструментальные средства HTK наилучшим образом описываются с помощью пошагового построения
распознавателя слитной речи на основе субслов. На Рис. 2.2 показаны 4 основные фазы: подготовка данных, тренировка, испытание и анализ.




2.3.1 Инструментальных средства Подготовки Данных
Для построения набора HMMs потребуется набор файлов с речевыми данными и связанные с ними транскрипции.
Очень часто речевые данные поступают в виде архивов баз данных, часто расположенных на CD-ROM-ах.
Перед их использованием в фазе подготовки, их необходимо преобразовать в подходящую параметрическую форму, а любые связанные транскрипции необходимо преобразовать в правильный формат и использовать необходимые этикетки фонов или слов. Если необходимо записать речь, то может быть использована  утилита HSLab одновременно для записи речи и ручной разметки с любыми необходимыми транскрипциями.
Хотя все инструментальные средства HTK могут "на-лету" параметризировать  звуковой сигнал, на практике   лучше параметризировать данные только один раз. Для этого используют утилиту HCopy. Как видно из названия, HCopy предназначена для копирования одного или более исходных файлов в один выходной файл.
Обычно, HCopy копирует файл целиком, но предусмотрен ряд механизмов  для извлечения сегментов из файлов и конкатенации файлов. Устанавливая подходящие переменные конфигурации, все входные файлы могут быть преобразованы в параметрическую форму так, как они прочитаны. Таким образом, простое копирование каждого файла в этом способе выполняет необходимое кодирование. Можно использовать утилиту HList для того, чтобы проверить содержимое любого речевого файла, а поскольку оно также может "на-лету" преобразовать входной сигнал, с его помощью можно проверить результаты любых преобразований перед обрабаткой больших количеств данных. Транскрипции  также нужно подготовить. Обычно этикетки, используемые в оригинальных исходных транскрипциях, не соответствуют необходимых требованиям, например, из-за различий в используемых фоновых наборах.
Также, фаза подготовки HMM может потребовать, чтобы этикетки были контекстно-зависимым. Средство HLEd является редактором этикеток под управлением сценариев, который предназначен для выполнения необходимых преобразований для разметки файлов. HLEd может соединить файлы в один Файл Основной Разметки MLF, формат которого  обычно более удобен для последующей обработки. Наконец, на этапе подготовки данных, HLStats может собрать и отобразить статистику о файлах этикеток(разметки). Там, где необходимо на этапе подготовки, можно использовать HQuant для формирования VQ codebook для построения дискретной статистической системы на основе HMM.

2.3.2  Инструментальные средства обучения
Второй шаг построения системы должен определить топологию, необходимую для каждой HMM путем записи определения прототипа. HTK позволяет создать HMMs с любой желаемой топологией. Определения HMM могут храниться отдельно, как простые текстовые файлы и, следовательно, их можно редактировать в любом удобном текстовом редакторе. Кроме того, стандартный пакет HTK включает множество примеров прототипов HMM и сценарий для автоматической генерации наиболее общей топологии. За исключением вероятностей перехода, игнорируются все параметры HMM, данные в определении прототипа. Определения прототипа предназначены только для определения общих характеристик и топологии HMM. Фактические параметры будут вычислены позже с помощью инструментов обучения. Значительные величины для вероятности перехода должны быть даны, но  процесс обучения очень нечувствительный к ним. Приемлемая и простая стратегия для выбора этих вероятностей - это сделать равновероятными все переходы из любого состояния.

0

2

Глава 3
Пример использования HTK

3.1 Подготовка данных
Шаги 3.1.1-4 пока можно пропустить.

3.1.5 Шаг 5 - Кодирование Данных
Конечный этап подготовки данных заключается в параметризации звуковой формы речевого сигнала в формате raw в последовательности параметрических векторов. HTK одновременно поддерживает анализ как на основе FFT, так и на основе LPC. Здесь будут использоваться кепстральные коэффициенты (Mel Frequency Cepstral, MFCCs), производные от  спектрального лога FFT.
Кодирование может быть выполнено с помощью утилиты HCopy, сконфигурированной для автоматического преобразования входных данных в набор векторов MFCC. Для того, чтобы сделать это, потребуется файл конфигурации (config), в котором определены все параметры преобразования. Разумные установочные параметры для них - следующие:

# Coding parameters
TARGETKIND = MFCC_0
TARGETRATE = 100000.0
SAVECOMPRESSED = T
SAVEWITHCRC = T
WINDOWSIZE = 250000.0
USEHAMMING = T
PREEMCOEF = 0.97
NUMCHANS = 26
CEPLIFTER = 22
NUMCEPS = 12
ENORMALISE = F

Некоторая из этих настроек  являются настройками по-умолчанию, но здесь они определены явно для полноты.
В двух словах, они определяют, что целевые параметры должны быть MFCC, использующие C0 как энергетический компонент, фреймовый период - 10мсек (HTK использует блоки в  100нсек), выходные данные должны быть сохранены в сжатом формате, и должна быть добавлена контрольная сумма crc. FFT должен использовать окно Хамминга, а сигнал должен иметь предкомпенсацию фазы (preemphasis) первого порядка и предполлагающий использование коэффициента 0.97. Банк фильтров должен иметь 26 каналов и должно быть 12 коэффициентов MFCC  на выходе. Переменная ENORMALISE по умолчанию имеет значение истина (true) и выполняет энергетическую нормализацию в записанных аудиофайлах. Её нельзя использовать с живым звуком и, если целевая система  используется для живого звука, эта переменная должна быть установлена в ложь (false).
Отметим, что нет необходимости в явном создании кодированных файлов данных, так как кодирование оригинальных звуковых файлов может быть выполнено "на-лету" важными инструментальными средствами HTK путем определения соответствующего файла конфигурации (как описано выше). Тем не менее, создание этих файлов уменьшает объем предварительной обработки, необходимой на этапе подготовки данных, тк он сам по-себе может быть трудоемким процессом.
Чтобы запустить HCopy, необходимо создать список для каждого исходного файла и соответствующего выходного файла. Например, первые несколько строк могут выглядеть следующим образом:

/root/sjy/waves/S0001.wav /root/sjy/train/S0001.mfc
/root/sjy/waves/S0002.wav /root/sjy/train/S0002.mfc
/root/sjy/waves/S0003.wav /root/sjy/train/S0003.mfc
/root/sjy/waves/S0004.wav /root/sjy/train/S0004.mfc
(и тд.)

Файлы, содержащие списки файлов называются файлами*3 сценария и по соглашению получают расширение scp (хотя HTK не требует этого). Файлы сценария определены используя стандартную опцию - S и их содержимое читается просто как дополнительные параметры  командной строки. Таким образом, они избегают потребности в командных строках в несколько тысяч аргументов*4.

Допустим, что вышеуказанный сценарий сохранен в файле codetr.scp, тогда обучающие данные могут быть закодированы с помощью команды:

HCopy -T 1 -C config -S codetr.scp

Это проиллюстрировано на Рис. 3.6. Аналогичная процедура используется для кодирования проверочных данные (используйте TARGETKIND = MFCC_0_D_A в config) после того, как все части поступят, чтобы начать обучение  HMMs.




3.2 Создание монофонных моделей HMMs

В этой секции будет описан процесс  создания хорошо-обученного набора монофонных единичных гауссовых моделей  HMMs. Отправным пунктом будет набор идентичных монофонных моделей HMMs, в котором каждое значение и вариация идентичны. Затем эти модели переобучаются, добавляются модель с короткой паузой и немного расширяется модель тишины. Затем монофоны переобучаются.
Некоторые словарные статьи имеют множество произношений. Тем не менее, когда HLEd используется, чтобы расширять текстовый уровень MLF, чтобы создавать фонный уровень MLFs, он произвольно выбирает первое произношение, которое он обнаруживает. Как только созданы разумные монофонные модели HMMs, можно использовать утилиту распознавания  HVite для принудительного выравнивания обучающих данных. Этими средствами, создается новый фонный уровень MLF, в котором выбор произношений зависит от акустического подтверждения. Этот новый MLF может быть использован для  выполнения конечной переоценки монофонных моделей  HMMs.

0

3

Примечание переводчика.
Документация немного устарела, поэтому утилита HCopy.exe выдает ошибку с указанным выше файлом конфигурации.  Следует скачать HTK-3.4.1 и HTK-samples-3.4.1, затем с помощью make-файлов собрать утилиты HTK для Windows.
Условия тестирования:
HTK-samples-3.4.1\samples\bin.win32\HCopy.exe       (316кб, скопирован из HTK-3.4.1)
HTK-samples-3.4.1\samples\bin.win32\codetr.scp  - файл со списком входных и выходных файлов
HTK-samples-3.4.1\samples\bin.win32\HCopy.bat   - командный файл для запуска процесса
HTK-samples-3.4.1\samples\bin.win32\hcopy.conf - исправленный файл конфигурации из каталога \HTK-samples-3.4.1\samples\HTKDemo\toolconfs

Создан подкаталог codingdata в каталоге HTK-samples-3.4.1\samples\HTKDemo\
После запуска командного файла _st5_Coding_Data.bat в подкаталоге codingdata создаются 7 выходных файлов. Сравните их с готовыми демонстрационными файлами из каталога \HTK-samples-3.4.1\samples\HTKDemo\data\store
Каталог со всеми утилитами скопирован в

Важно отметить, что следует устанавливать переменную TARGETKIND  = MFCC_0_D_A во всех файлах конфигурации hcopy.conf, hcompv.conf и прототипе модели proto, иначе утилита hcompv выдаст ошибки (не совпадает формат данных или размер векторов).

файл _st5_Coding_Data.bat
bin.win32\HCopy -T 1 -C hcopy.conf -S codetr.scp
pause

или файл _st5_Coding_Data.bat
SET PATH=bin.win32
HCopy -T 1 -C hcopy.conf -S codetr.scp
pause

файл codetr.scp
tidata\tr1.adc codingdata\tr1.mfc
tidata\tr2.adc codingdata\tr2.mfc
tidata\tr3.adc codingdata\tr3.mfc
tidata\tr4.adc codingdata\tr4.mfc
tidata\tr5.adc codingdata\tr5.mfc
tidata\tr6.adc codingdata\tr6.mfc
tidata\tr7.adc codingdata\tr7.mfc

файл hcopy.conf (для справки)
SOURCEKIND     = WAVEFORM
SOURCEFORMAT   = TIMIT
SOURCERATE     = 625
ZMEANSOURCE    = FALSE

TARGETKIND     = MFCC_0_D_A
#TARGETFORMAT   = HTK
TARGETRATE     = 100000

#SAVECOMPRESSED = TRUE
SAVEWITHCRC    = FALSE

WINDOWSIZE     = 250000.0
#USEHAMMING     = TRUE
#PREEMCOEF      = 0.97

#USEPOWER       = FALSE
NUMCHANS       = 26
#LOFREQ         = -1.0
#HIFREQ         = -1.0

LPCORDER       = 12

CEPLIFTER      = 22
NUMCEPS        = 12

#RAWENERGY      = TRUE
ENORMALISE     = TRUE
#ESCALE         = 1.0
#SILFLOOR       = 50.0

#DELTAWINDOW    = 2
#ACCWINDOW      = 2

#USESILDET      = TRUE
#SPEECHTHRESH   = 0.0
#SILTHRESH      = 0.0
#MEASURESIL     = TRUE

#OUTSILWARN     = TRUE
#SILMEAN        = 0.0
#SILSTD         = 0.0
#AUDIOSIG       = 0
#VQTABLE        = ""


------------------------------------------------------
3.2.1 Шаг 6   - Создание Flat Start монофонов
------------------------------------------------------
Данный шаг описан в руководстве, но следует учесть некоторые поправки.

В каталоге HTKDemo необходимо создать 2 подкаталога proto и hmm0
Прототип модели proto сохраняется в каталоге proto.

Файл proto
~o <VecSize> 39 <MFCC_0_D_A>
~h "proto"
<BeginHMM>
<NumStates> 5
<State> 2
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<State> 3
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<State> 4
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<TransP> 5
0.0 1.0 0.0 0.0 0.0
0.0 0.6 0.4 0.0 0.0
0.0 0.0 0.6 0.4 0.0
0.0 0.0 0.0 0.7 0.3
0.0 0.0 0.0 0.0 0.0
<EndHMM>

Файл hcompv.conf создается путем копирования и переименования hcopy.conf.
Далее вносятся изменения, тк эта утилита использует формат файлов для параметрических векторов.
# SOURCEKIND     = WAVEFORM
# SOURCEFORMAT   = TIMIT
# SOURCERATE     = 625
# ZMEANSOURCE    = FALSE

TARGETKIND     = MFCC_0_D_A
TARGETFORMAT   = HTK
TARGETRATE     = 100000

#SAVECOMPRESSED = TRUE
SAVEWITHCRC    = FALSE

WINDOWSIZE     = 250000.0
USEHAMMING     = TRUE
PREEMCOEF      = 0.97

#USEPOWER       = FALSE
NUMCHANS       = 26
#LOFREQ         = -1.0
#HIFREQ         = -1.0

LPCORDER       = 12

CEPLIFTER      = 22
NUMCEPS        = 12

#RAWENERGY      = TRUE
ENORMALISE     = TRUE
#ESCALE         = 1.0
#SILFLOOR       = 50.0

DELTAWINDOW    = 2
ACCWINDOW      = 2

#USESILDET      = TRUE
#SPEECHTHRESH   = 0.0
#SILTHRESH      = 0.0
#MEASURESIL     = TRUE

#OUTSILWARN     = TRUE
#SILMEAN        = 0.0
#SILSTD         = 0.0
#AUDIOSIG       = 0
#VQTABLE        = ""





файл _st6_HCompV.bat
SET PATH=bin.win32
HCompV -C hcompv.conf -f 0.01 -m -S train.scp -M hmm0 proto\proto
pause

После запуска _st6_HCompV.bat в каталоге hmm0 появятся 2 файла модели.

0

4

Примечание переводчика.
Прежде чем продолжить, рекомендую прочитать файл README.NT и запустить скрипт демонстрации пакета HTK - runDemo.pl .

Файл интерпретатора perl можно взять из пакета Danver. Необходимо скопировать файл miniperl.exe в каталог HTK-samples-3.4.1\samples\HTKDemo  и переименовать в perl.exe

Далее создать несколько отсутствующих подкаталогов в каталоге HTK-samples-3.4.1\samples\HTKDemo как описано в файле  README.NT:
accs
proto
hmms\hmm.0
hmms\hmm.1
hmms\hmm.2
hmms\tmp
test

Далее создается командный файл _perl_test.bat для запуска скрипта демонстрации.
perl.exe runDemo.pl configs\monPlainM1S3.dcf
pause

В моем случае скрипт не смог найти и скопировать необходимые утилиты, поэтому следует скопировать несколько утилит из каталога HTK-3.4.1\htk\bin.win32 в каталог HTK-samples-3.4.1\samples\HTKDemo:
HInit.exe
HERest.exe
HRest.exe
HResults.exe
HVite.exe

Как правило, после этого скрипт отрабатывает правильно.

В каталоге proto создаются прототипы моделей (прототип модели рассматривается на шаге 6 htkbook).

Добрый Ээх

0

5

Удобно, когда пользователи могут посмотреть подробный лог работы программы или скрипта.
В случае необходимости можно перепечатать  команды или данные прямо с экрана.
Но есть более простой способ переназначения вывода с экрана в файл, например, log.txt.
Вывод лога работы в текстовый файл:
perl.exe >log.txt runDemo.pl configs\monPlainM1S3.dcf
pause

Директива переназначения вывода предусмотрена системой DOS для исполняемых файлов.
runDemo.pl - скрипт на языке perl, configs\monPlainM1S3.dcf - параметр скрипта, поэтому не работает конструкция
perl.exe  runDemo.pl configs\monPlainM1S3.dcf >log.txt

0

6

Как и следовало ожидать, дальнейшее создание модели намертво застряло на шаге 6.
HERest -C config -I phones0.mlf -t 250.0 150.0 1000.0 \
-S train.scp -H hmm0/macros -H hmm0/hmmdefs -M hmm1 monophones0

Поэтому предлагаю применить научно исследовательский метод или просто хакнуть демонстрацию.

пришло время вспомнить про лог скрипта демонстрации, где, не смотря на некоторые
различия, все работает.
Если вы уже прочитали htkbook и ряд др. статей на тему распознавания речи, то узнали, что
чаще всего применяются дифонные и трифонные скрытые марковские модели.

Как определить, какие модели HMMs обучаются и тестируются в данной демонстрации?

Необходимо посмотреть результаты проверки полученных моделей в самом конце листинга:

Testing on the test set
HVite -A -C toolconfs\hvite.conf -d hmms\hmm.2 -l test -i recout.mlf -w networks\monLattice

-D -L test -t 300.0 -T 1 -p 5.0 -s 0.0 -S test.scr lists\bcpvocab lists\bcplist

HTK Configuration Parameters[4]
  Module/Tool     Parameter                  Value
#                 BINARYACCFORMAT             FALSE
#                 KEEPDISTINCT               FALSE
#                 SAVEGLOBOPTS                TRUE
#                 TARGETKIND              MFCC_E_D

Read 5 physical / 5 logical HMMs
Read lattice with 8 nodes / 16 arcs
Created network with 15 nodes / 23 links
File: data\test\te1.mfc
S C V N V C C V C C C V N C V L V L V C L V C C C V S C S  ==  [246 frames] -59.5259

[Ac=-14793.4 LM=150.0] (Act=12.9)
File: data\test\te2.mfc
S L C V C V C C V C N C N V V L V V N N C N S V V C V C C V C C V C C C  ==  [278 frames]

-59.6481 [Ac=-16767.2 LM=185.0] (Act=12.9)
File: data\test\te3.mfc
S C V C C V C L L C V S C V N V C V C L V C C S V N C V C N V C V L N L S C S  ==  [418

frames] -58.6500 [Ac=-24715.7 LM=200.0] (Act=13.0)

HTK Configuration Parameters[4]
  Module/Tool     Parameter                  Value
#                 BINARYACCFORMAT             FALSE
                  KEEPDISTINCT               FALSE
                  SAVEGLOBOPTS                TRUE
                  TARGETKIND              MFCC_E_D

-A -s -L labels\bcplabs\mon lists\bcplist recout.mlf
====================== HTK Results Analysis =======================
  Date: Fri Nov 07 14:54:28 2014
  Ref : labels/bcplabs/mon
  Rec : recout.mlf
------------------------ Overall Results --------------------------
SENT: %Correct=0.00 [H=0, S=3, N=3]
WORD: %Corr=63.91, Acc=59.40 [H=85, D=35, S=13, I=6, N=133]
===================================================================

Здесь можно увидеть в командной строке для HVite -w networks\monLattice и -L

labels\bcplabs\mon для HResults.

Следовательно, в данной демонстрации обучаются и тестируются (проверяются) монофонные
скрытые марковские модели.

Содержимое каталога HTKDemo\networks:
monNetwork - задача грамматики для монофонов;
monLattice - соответствующая решетка для монофонов или задача грамматики в низкоуровневом
формате;
triLattice - решетка для трифонов;
lbiLattice - решетка для левой модели;
rbiLattice - решетка для правой модели.

Методика получения решеток из задачи грамматики расписана на шаге 3.1.1 Шаг 1 - Задача
грамматики (3.1.1 Step 1 - the Task Grammar).

Можно выполнить команду
_st1_Task_Grammar.bat
SET PATH=..\..\bin.win32
HParse monNetwork monLattice
pause

Здесь ..\..\bin.win32 означает, что каталог bin.win32 находится в каталоге  HTKDemo .

Теперь смотрим, что распознала утилита HVite:
Created network with 15 nodes / 23 links
File: data\train\tr1.mfc
S C V C V C C V C C V C N C V V C L V C C L V L L V C V L S  ==  [303 frames] -58.4550

[Ac=-17866.9 LM=155.0] (Act=12.9)

Сравните данный вывод с метками HTK из файла \HTKDemo\labels\bcplabs\mon\tr1.lab.
Видно, что горизонтальный ряд, там записан вертикально.

Теперь сравните с файлом \HTKDemo\tidata\tr1.phn меток в формате TIMIT.
В базе меток TIMIT содержится гораздо больше полезной информации.
Как описано в файле README.NT все фоны поделены на 5 классов (C- согласные, V-гласные,
S-тишина и тд).
Поэтому напрашивается вывод, что все фоны в метках демонстрации заменены на букву класса.Это
делается с помощью утилиты Hled и соответстующего скрипта.
Напрашивается вопрос, а почему нельзя получить список фонов из которых состоят обучающие и
проверочные предложения всето набора буков класса?

Можно.

Для этого следует использовать необходимые файлы меток *.lab со всеми фонами в формате
HTK.
У меня пока цифровые интервалы исходных меток *.pch тупо копируются в файлы меток HTK,
поэтому пока пришлось вручную прописывать фоны sh во всех файлах меток из каталога   labels/bcplabs/mon дописывать sh и sh sh в bcplist и bcpvocab соответственно.
После этого можете запускть скрипт и смотреть результат с распознанными фонами sh.

Как определено, что нужно менять файлы bcplist и bcpvocab?
Все написано в руководстве evil book.

Начало  лога :

Proto Config File Read
======================
Parameter         Value
-----------------------

hsKind              p
covKind             d
nStates             3
nStreams            3
sWidths             12 12 2
mixes               1 1 1
parmKind            MFCC_E_D
vecSize             26
outDir              proto
hmmList             lists/bcplist

Writing HMMSet

Writing HMMDef to proto/S
Writing HMMDef to proto/C
Writing HMMDef to proto/V
Writing HMMDef to proto/N
Writing HMMDef to proto/L

Здесь видно, что скрипт записывает 5 файлов с прототипами моделей в каталог proto, а с
список наименований моделей хранится в каталоге lists/bcplist (hmmList    lists/bcplist).
Сам список наименований прототипов моделей - в bcplist, список наименований моделей для
распознавания - в bcpvocab.

Добрый Ээх.

0

7

bcpvocab - словарь.Создание словаря описано в 3.1.2 Step 2 - the Dictionary руководства htkbook. В данном случае вместо слов используются наименования фонов. Для демонстрации монофонной модели это разумный вариант.
Формат словаря WORD [outsym] p1 p2 p3
Пример словаря:
A ah sp
A ax sp
A ey sp
CALL k ao l sp
DIAL d ay ax l sp
EIGHT ey t sp
PHONE f ow n sp
SENT-END [] sil
SENT-START [] sil
SEVEN s eh v n sp
TO t ax sp
TO t uw sp
ZERO z ia r ow sp

Сравните со словарем bcpvocab.

Теперь рассмотрим вопрос генерации меток в формате HTK. Для этого следует обратится к  руководству htkbook.
см. главу 17.10 HLEd
17.10.1 Function
...
The source and target label file formats can be defined using the -G and -P command line
arguments. They can also be set using the configuration variables SOURCELABEL and TARGETLABEL.
The default for both cases is the HTK format.

Т.е. по-умолчанию, для входных и выходных файлов меток выбран формат меток HTK, поэтому Hled не преобразовывает цифровые интервалы. Следовательно, формат должен указываться явно с помощью ключей. Поэтому см. пункт 17.10.2 Use (Использование) и находим следующее:
-G fmt Set the label file format to fmt. Установить входной формат файла меток в fmt.
-P fmt Set the target label format to fmt. Установить выходной формат меток в fmt.
В базе базе TIMIT используются  файлы меток в ее собственном формате, те входной формат TIMIT.

Теперь пришло вр. проверить генерацию меток. Удалите метки в каталоге labels\bcplabs\mon и создайте их заново командой:

..\bin.win32\HLEd -G TIMIT  -l labels\bcplabs\mon edfiles/edlabs.led tidata/tr1.phn tidata/tr2.phn tidata/tr3.phn tidata/tr4.phn tidata/tr5.phn tidata/tr6.phn tidata/tr7.phn tidata/te1.phn tidata/te2.phn tidata/te3.phn
pause 

Перед расширением списка моделей HMMs предлагаю самостоятельно заменить класс S на sp в файлах  lists/bcplist,  lists/bcpvocab, edlabs.led, в файле задачи грамматики, сгенерировать файл решетки и новые файлы меток.

0

8

Пакет HTK позволяет обучать скрытые марковские модели по звуковым файлам без фонетических транскрипций из базы TIMIT, но для этого необходимо иметь тексты обучающих и проверочных данных. Самый простой способ - это посетить страницу
https://catalog.ldc.upenn.edu/LDC93S1W и скачать все бесплатно или за 250$.
Если нет денег, можно определить текст на слух.

Эти способы не подходит для простых программистов из СНГ.
Есть др., продвинутый способ. В каталоге tidata есть файлы транскрипций, а на ресурсе хранится база высказываний и их фонетическая форма. Список документов можно найти на https://catalog.ldc.upenn.edu/docs/LDC93S2/

Определение текстовой формы высказывания для учебных (tr1.adc...tr7.adc) и проверочных данных (te1.adc...te3.adc).
На указанной выше странице даны ссылки на 1-ое обучающее высказывание:

She had your dark suit in greasy wash water all year.

А дальше потребуются следующие файлы:
файлы фонетических транскрипций tr1.pch...te3.pch;
https://catalog.ldc.upenn.edu/docs/LDC93S2/PROMPTS.TXT
https://catalog.ldc.upenn.edu/docs/LDC9 … nelist.txt

Необходимо открыть файл транскрипции tr2.pch и найти в последовательность первых фонем w ay ng gcl в  allphonelist.txt.
В итоге получим индекс файла в базе, равный si564 (см. train/dr1/mcpm0/si564).
Далее выполняется поиск si564 в файле PROMPTS.TXT и находится исходное высказывание tr2:

Wine glass heels are to be found in both high and semi-heights.

0

9

Тексты обучающих высказываний уже готовы. Остается выполнить пошаговую инструкцию из руководства.

Глава 3
Пример использования HTK

Эта последняя  глава данной части руководства описывает процесс создания устройства распознавания для  простых приложений голосового набора. Данное  устройство будет распознавать речь, состоящую  из непрерывных цифровых строк и ограниченного списка имен. Это система на основе слов, так что добавление нового имени в словарь сводится только к модификации словаря произношения и задачи грамматики.
HММ будет гауссовой смесью с непрерывной плотностью связанных состояний трифонов с группировкой (кластеризацией), выполненной на основе  деревьев фонетических решений. (The HMMs will be continuous density mixture Gaussian tied-state triphones with clustering performed using phonetic decision trees.)
Хотя сама задача голосовой набор довольно проста, принцип построения подобной системы является универсальным и будет полезен для широкого спектра приложений. В дополнение к построению простой системы голосового набора также приведены примеры использования более продвинутых опций, таких как, декореляция преобразования, большой декодер лексики и дискриминационное обучение. В этих разделах нет обязательных связей с другими частями учебника, но сделана попытка дать пользователю представление о формате командных строк и шагах, связанных с использованием их параметров.
Система будет построена с нуля, даже в такой степени, что запись тренировочных и проверочных (тестовых) данных будет выполнена с помощью утилиты HSLAB пакета HTK. С целью упрощения, система будет зависимой от диктора, но тот же принцип будет использоваться для построения дикторонезависимой системы. Единственное отличие заключается в том, что выборка данных будет осуществляться из большого количества дикторов, а сложность модели должна быть увеличена соответствующим образом. Построение устройства распознавания речи с нуля включает ряд взаимосвязанных подзадач, и методологически  не очевидно, что это  лучший порядок их представления. В этой презентации, шаги упорядочены хронологически так, что дают методику, которой следует придерживаться при построении подобной системы. Весь процесс описан довольно подробно и дает четкое представление о диапазоне функций, которые выполняет НТК  и, тем самым, мотивирует остальную часть книги.
Дистрибутив программного обеспечения НТК также содержит пример построения системы распознавания для 1000 слов Задачи Управления Морского Ресурса ARPA. Он содержится в каталоге RMHTK дистрибутива HTK. Далее демонстрацию возможностей НТК можно найти в каталоге HTKDemo. Некоторые примеры скриптов, которые могут оказать помощь при работе с учебником, доступны в каталоге HTKTutorial.
На каждом этапе урока, представленном в этой главе, пользователю рекомендуется внимательно прочитать весь раздел перед выполнением команд, а также проконсультироваться в разделе ссылок относительно каждого встроенного инструмента HTK  (глава 17), так чтобы четко понимать все параметры и аргументы командной строки.
1Этап руководства имеет дело с адаптацией моделей, зависящих от диктора,  к новым дикторам

3.1 Подготовки данных
Подготовка данных - первый этап разработки любого проекта  распознавателя. Речевые данные необходимы как на этапе подготовки, так  и на этапе испытания. В создаваемой здесь системе вся  речь будет записана с нуля и для выполнения этих сценариев потребуется  вводить параметры-подсказки для каждого предложения. В случае с тестовыми данными, эти скрипты с параметрами-подсказками также обеспечивают ссылочные транскрипции,  изменяя работу распознавателя, а удобный способ их создания - использование грамматики задачи как произвольного генератора. В случае тренировочных данных, будут использованы быстрые сценарии  вместе со словарем произношения, которые обеспечат начальный фоновый уровень транскрипции, необходимый для запуска процесса обучения HMM. Т.к.  приложение требует, чтобы в  распознаватель могли быть добавлены произвольные имена, необходимы  тренировочные данные с хорошим фонетическим балансом и охватом. Для удобства, быстрые сценарии, необходимые для подготовки, взяты из акустико-фонетической базы данных  TIMIT.
Из вышесказанного следует, что перед записью данных необходимо определить грамматику задачи, создать словарь, который охватит как подготовку, так и испытание, а также определить фоновый набор.

3.1.1 Шаг 1 - Грамматика Задачи
Цель создания системы - обеспечить интерфейс управления голосом для телефонного абонента.
Таким образом, распознаватель должен обрабатывать  строки из цифр, а также персональные списки имен. Пример типичных строк:
Dial three three two six five four
Dial nine zero four one oh nine
Phone Woodland
Call Steve Young

{Набрать три три два шесть пять четыре
Набрать девять нулей четыре один ох девять
Звонит Вудленд
Вызвать Стива Янга}

HTK обеспечивает язык грамматических определений для простых грамматических задач,  таких как эта.
Он состоит из конструкций для  установки переменных определений сопровождающихся регулярным выражением, описывающим распознаваемые слова. Пригодная грамматика для приложения с голосовым набором  может быть следующей:
$digit = ONE | TWO | THREE | FOUR | FIVE |
SIX | SEVEN | EIGHT | NINE | OH | ZERO;
$name = [ JOOP ] JANSEN |
[ JULIAN ] ODELL |
[ DAVE ] OLLASON |
[ PHIL ] WOODLAND |
[ STEVE ] YOUNG;
( SENT-START ( DIAL <$digit> | (PHONE|CALL) $name) SENT-END )

где вертикальные черточки обозначают альтернативы, квадратные скобки - дополнительные пункты, а  угловые скобки - одно или более повторений. Полная грамматика может быть изображена как сеть,  изображенная  на рис. 3.1.

---

---

Фиг. 3.2 Шаг 1
Представление высокого уровня для описанной выше грамматики задачи предусмотрено для удобства пользователя. HTK-распознаватель действительно требует текстовую сеть, которую необходимо определять, используя нотацию низкого уровня, названную Формат Стандартной Решетки HTK (SLF). В этой нотации каждый текстовый пример и каждый переход от слова-к-слову указывается явно. Эта текстовая сеть может создаваться автоматически из грамматики с помощью утилиты HParse. Таким образом, допустим, что файл gram содержит вышеуказанную грамматику. Выполнение директивы HParse gram wdnet создаст эквиалентную текстовую сеть в файле wdnet (смотрите Рис. 3.2).

3.1.2 Шаг 2 - Словарь
Первый шаг в построении словаря - создание отсортированного списка необходимых слов. В  задаче телефонного дозвона, очень легко создать список необходимых слов вручную. Тем не менее, в случае комплексной  задачи  необходимо сформировать список слов из образцовых предложений, предоставленных в  данных для обучения. Кроме того, для формирования стабильной акустических моделей  необходимо  их подготовка на большом наборе предложений, содержащих много слова и предподтительно фонетически сбалансированных. По этим соображениям, данные обучения будут состоять из английских предложений, не имеющих отношения к задаче телефонного опознавания. Ниже будет показан короткий пример создания текстового списка из приглашений предложения. Как отмечено выше, обучающие предложения, приведенные здесь, взяты из некоторых подсказок из базы данных TIMIT. Из соображения  удобства, они перенумерованы. Например, первые несколько пунктов могут быть следующими:

S0001 ONE VALIDATED ACTS OF SCHOOL DISTRICTS
S0002 TWO OTHER CASES ALSO WERE UNDER ADVISEMENT
S0003 BOTH FIGURES WOULD GO HIGHER IN LATER YEARS
S0004 THIS IS NOT A PROGRAM OF SOCIALIZED MEDICINE
etc

затем из них может быть автоматически извлечен  желаемый обучающий список слов (wlist) . Единственное условие, перед использованием HTK необходимо отредактировать текст  с учетом требуемого формата. Например, необходимо заменить все пробелы на символы перевода строк и далее использовать утилиты  UNIX sort и uniq для сортировки слов  в  уникальный набор слов, упорядоченный в алфавитном порядке, с одним словом на строку.  С этой целью можно использовать сценарий prompts2wlist из директории HTKTutorial.
Сам словарь может быть создан из стандартного источника с помощью HDMan. В этом примере будет использован словарь произношений British English BEEP (Британский Английский Сигнал). Его телефонный набор  будет принят без модификации, за исключением того, что будет удалены стресс-маркеры и добавлена  короткая-пауза (sp) в конце каждого произношения. Если словарь содержит любые маркеры тишины, то команда MP объединит sil и sp телефоны в один sil. Эти изменения могут быть применены с помощью HDMan и сценария редактирования (хранимом в global.ded), содержащего три команды:

AS sp
RS cmu
MP sil sil sp

где cmu имеет отношение к стилю маркировки напряжения, в котором уровень лексического напряжения выделяется единичной цифрой, добавленной в конце телефонного имени (например, eh2 означает телефон eh с уровнем напряжения 2).

Рис. 3.3 Шаг 2

Команда

HDMan -m -w wlist -n monophones1 -l dlog dict beep names
создаст новый словарь с именем dict, произведет поиск произношения в исходных словарях beep и names, для каждого слова в wlist (смотри Рис. 3.3).

Здесь, wlist о чем идет речь нужно только, чтобы быть отсортированным списком слова, появляющихся в грамматике задачи данной выше.
Отметьте, что имена является вручную искусственным файлом, содержащим произношения для собственных имен использованных в грамматике задачи. Опция -l указывает HDMan на выход регистрационный файловый dlog, который содержит различную статистику об искусственном словаре. В конкретном, это указывается если есть слово потери. HDMan МОЖЕТ также выход список телефонов использовал, здесь назвавшее monophones1. Как только готовя и данные теста записаны, HMM будет оценен для каждого из этих телефонов.
Общий формат каждой словарной статьи является
WORD [outsym] p1 p2 p3 ....

---------
*Доступно с анонимного ftp  svr-ftp.eng.cam.ac.uk/pub/comp.speech/dictionaries/beep.tar.gz.
Следует отметить, что пункты, начинающие с несогласованных кавычек в начале словаря, должны быть удалены.

который означает, что текстовое СЛОВО произнесено как последовательность телефонов p1 p2 p3.... Строка в квадратных скобках определяет строку на выход когда это слово recognised. Если опущено, тогда само слово выходное. Если включено но пустой, тогда ничто не выходное.
Чтобы видеть, на что похож словарь, приведем несколько данных.

A ah sp
A ax sp
A ey sp
CALL k ao l sp
DIAL d ay ax l sp
EIGHT ey t sp
PHONE f ow n sp
SENT-END [] sil
SENT-START [] sil
SEVEN s eh v n sp
TO t ax sp
TO t uw sp
ZERO z ia r ow sp

Обратите внимание, что функциональные слова, такие как  A и TO имеют множество произношений. Данные для SENT-START
и SENT-END имеют модель тишины sil как их произношения и непроизносимые выходные символы.






ПРИМЕЧАНИЕ
Для демонстрационного примера задачу грамматики необходимо создать из отсортированного списка уникальных слов.
Как написано в руководстве, эта операция выполняется с помощью скрипта HTKTutorial\prompts2wlist (после допилки скрипта).

Словарь. Я  взял готовый словарь cmu07a.dic из проекта pocketsphinx. Первые строки, начинающиеся  с кавычек, скобок и тд, до неопределенного артикля были удалены, все слова приведены к нижнему регистру (тк по сравнению со словарем HTK регистр слов и транскрипций в pocketsphinx сделан с точностью наоборот) и в хексредакторе заменен символ 0A на группу символов (пробел sp и символ 0A).

0

10

Допиленный скрипт prompts2wlist для Windows-систем.

#!/usr/local/bin/perl -w
#use strict;

my ($prompts, $wlist, $line, @line_array, $w, %words, @word_list);

# check usage
if (@ARGV != 2) {
  print "usage: $0 prompts wordlist\n\n";
  exit (0);
}

# read in command line arguments
($prompts, $wlist) = @ARGV;

# open files
open (PROMPTS,"$prompts") || die ("Unable to open prompts $prompts file for reading");
open (WLIST,">$wlist") || die ("Unable to open word list $wlist file for writing");

# process each prompt one at a time
while ($line = <PROMPTS>) {
  chomp ($line);
  print "$line\n";

  open (LAB2, "$line") || die ("Unable to open prompt file $line");
    $promptstring= " ".lc <LAB2>; #add space and to lowercase
    print "prompt = $promptstring\n";

  @line_array=split(/\s+/, $promptstring);
  shift (@line_array);  # discard fileID

  foreach $w (@line_array)  {
    $words{$w} = 1;
  }
}

# put the words in order
@word_list = sort (keys (%words));

#and finally write out to word list file
foreach $w (@word_list) {
  printf(WLIST "%s\n", $w);
}

close(WLIST);
close(PROMPTS);

Командный файл для запуска _Create_wlist.bat
perl ..\HTKTutorial\prompts2wlist lists/promptlist.txt wordlist.txt
pause

Файл lists/promptlist.txt
---------------
tidata/tr1.txt
tidata/tr2.txt
tidata/tr3.txt
tidata/tr4.txt
tidata/tr5.txt
tidata/tr6.txt
tidata/tr7.txt

Файлы tr1.txt ... tr1.txt содержат по одной строке обучающего высказывания (без точек, запятых и др. знаков):
She had your dark suit in greasy wash water all year
Wine glass heels are to be found in both high and semi heights
cartoon features a muskrat and a tadpole
Even I occasionally get the Monday blues
...

Ост-е высказывания сам-но. Каждое высказывание сверялось со звуковым соответс-м файлом. Каждый звуковой файл можно прослушать в Sound Forge. Для этого нужно скопировать файл и изменить расширение на raw, открыть в Sound Forge с пар-ми: mono, 16000, 16b.

А здесь уже готовый перевод
Руководство по HTK, перевод.
http://aprodeus.narod.ru/mmedia.htm

Удачи.

0

11

Если вы были на указанном ресурсе (от киевских националистов* :)) и загрузили архив fst_htk.zip, то уже могли ознакомиться с результатами проверки обученной модели. Ед. недостатком этого проекта является необходимость ручной подготовки файлов.
Автоматизация процесса обучения и прверки скрытых марковских моделей из проекта 
fst_htk.zip .

Итоговый командный файл предподготовки prep_all.bat

perl scripts\_promptslist2gram promptslist.txt gram10
rem HParse gram10 wdnet10
perl scripts\_promptslist2mlf  words.mlf promptslist.txt
HLEd -l wavs -d dict10 -i phones10.mlf scripts/mkphones0.led words.mlf
pause

Каждая команда из этого файла тестировалась отдельно.

Подготовить задачу грамматики:
perl scripts\_promptslist2gram promptslist.txt gram10,
где
gram10 - файл с задачей грамматики,
_promptslist2gram - скрипт (из каталога script) для автогенерации грамматики,
promptslist.txt - файл со списком файлов подсказок для каждого тренировочного звукового

файла.

Файл promptslist.txt
wavs/v0001.txt
wavs/v0002.txt
wavs/v0003.txt
wavs/v0004.txt
wavs/v0005.txt
wavs/v0006.txt
wavs/v0007.txt
wavs/v0008.txt
wavs/v0009.txt
wavs/v0010.txt
wavs/t0001.txt
wavs/t0002.txt
wavs/t0003.txt
wavs/t0004.txt
wavs/t0005.txt
wavs/t0006.txt
wavs/t0007.txt
wavs/t0008.txt
wavs/t0009.txt
wavs/t0010.txt

Этот файл похож на train.scp. Достаточно заменить расширение файлов на txt, вручную или

программно. В перспективе можно исп-ть train.scp с заменой расширения внутри скрипта.

Файлы wavs/v0001.txt...wavs/v0010.txt и wavs/t0001.txt...wavs/t0010.txt содердат по одному

слову odin ... desat соответственно, лучше ставить перевод строки после слова.
Выбор сделан по след. причине. Эти файлы выполняют функции, аналогичные фонетическим меткам

TIMIT, и далее при генерации файла phones10.mlf необходимо указывать названия звуковых

файлов (wav). Можете придумать свой вариант.

В итоге изменилась логика работы скрипта _promptslist2gram.
Файл _promptslist2gram
#!/usr/local/bin/perl -w
#use strict;

my ($prompts, $wlist, $line, @line_array, $w, %words, @word_list);

# check usage
if (@ARGV != 2) {
  print "usage: $0 prompts wordlist\n\n";
  exit (0);
}

# read in command line arguments
($prompts, $wlist) = @ARGV;

# open files
open (PROMPTS,"$prompts") || die ("Unable to open prompts $prompts file for reading");
open (WLIST,">$wlist") || die ("Unable to open word list $wlist file for writing");

# process each prompt one at a time
while ($line = <PROMPTS>) {
  chomp ($line);
  #print "$line\n";

##if prompts is list of files with promt utterances
  open (LAB2, "$line") || die ("Unable to open prompt file $line");
    $promptstring= " ".lc <LAB2>; #add space and to lowercase

         #$promptstring= " ".lc $line; #add space and to lowercase
    #print "prompt = $promptstring\n";

  @line_array=split(/\s+/, $promptstring);
  shift (@line_array);  # discard fileID

  foreach $w (@line_array)  {
    $words{$w} = 1;
  }
}

# put the words in order
@word_list = sort (keys (%words));

print(WLIST "\$wrd =\n");
$string="";

#and finally write out to word list file
foreach $w (@word_list) {
$string = $string.$w." |\n";
}

$string = substr ($string,0,(length($string)-2));
printf(WLIST "%s;\n( <sil \$wrd> sil )\n", $string);

close(WLIST);
close(PROMPTS);


rem HParse gram10 wdnet10 - создание файла решетки. Здесь закоментировано, тк эта команда

выполняется в tst.bat .

perl scripts\_promptslist2mlf  words.mlf promptslist.txt - генерация итогового файла mlf для

всех слов из тренировочных высказываний.

_promptslist2mlf
#!/usr/local/bin/perl -w
#use strict;

my ($mlf, $prompt, $line, $fname, @labs, $w);

# this script makes an mlf out of a list of file names and
# corresponding prompts - ie in the format
# fileid prompt
# fileid prompt
# "        "
# The prompts are automatically converted to upper case.

if (@ARGV != 2) {
  print "usage: $0 mlf promptlist\n\n";
  exit (0);
}

# read in command line arguments
($mlf, $prompt) = @ARGV;

# open MLF file
open (MLF,">$mlf") || die ("Unable to open mlf $mlf file for writing");

print "writing to mlf file $mlf\n";

print MLF ("\#\!MLF\!\#\n");
# open prompt file
open (LAB, "$prompt") || die ("Unable to open prompt file $prompt");
while ($line = <LAB>) {
    #print "$line\n";
open (LAB2, "$line") || die ("Unable to open prompt file $line");
    $promptfile= " ".<LAB2>;
    #print "prompt = $promptfile\n";
  chomp ($line);
  ($fname,@labs) = split(/\s+/,$line);
      #$fname =~ s/\.mfc//g;
  $fname =~ s/\.txt//g;

  print MLF ("\"$fname.lab\"\n");
($fname2,@worlds) = split(/\s+/,$promptfile);

#print "@worlds\n";

  foreach $w (@worlds) {
  ## convert the string to uppercase
#$w = uc $w;
  ## convert the string to lowercase
$w = lc $w;
    printf(MLF "%s\n", $w);
    print "$w\n";
  }
  print MLF (".\n");
}

close (LAB);
close(MLF);
print "writing to $mlf file done\n";

HLEd -l wavs -d dict10 -i phones10.mlf scripts/mkphones0.led words.mlf - создание итогового

файла mlf транскрипций для всех слов тренировочных высказываний.

Осталось автоматизировать генерацию 2 файлов: monophones23 и hmm0\hmmdefs
Необходимо решить вопрос о правильном способе генерации hmm0\hmmdefs с нуля или путем
копирования содержимого файла прототипа модели proto.
monophones23 - уникальный список фонов, алгоритм формирования уже исп-ся для формирования
списка уникальных слов wlist, за исключением того, что необходимо парсить файл phones10.mlf.

0

12

Генерация файла monophones23.

Для поставленной задачи можно взять готовый скрипт prompts2wlist. В этом легко убедиться, выполнив команду:
perl scripts\prompts2wlist phones10.mlf monophones23
После просмотра созданного файла monophones23 и сравнения его с требуемым monophones23 становится понятно, что скрипт должен вырезать или заменить часть ненужных строк на "".  Для этого потребуется функция replace.
Дело в том, что я знаю perl так же хорошо, как китайские иероглифы, но язык perl сильно похож на php, а php - на С, а
функция replace достаточно легко находится в Интернете.

Новый скрипт будет называться mlf2monophlist.
Перед использованиеv в конце скрипта необходимо добавить след. код:
sub replace {
      my ($from,$to,$string) = @_;
      $string =~s/$from/$to/ig;                          #case-insensitive/global (all occurrences)

      return $string;
   }

Далее в исходый  код скрипта (те в переименованную копию prompts2wlist) следует внести некоторые изменения:
переименовать некоторые переменные и изменить код.
# process each prompt one at a time
while (my $line = <MLFS>) {

  chomp ($line);

  # вырезать строку #!MLF!#

  $line = replace("#!MLF!#","",$line);  #del string #!MLF!#

  # вырезать строку с именем метки

#--> del sting with label filename: "wavs/t0001.lab"
if (substr($line,0,1) eq "\""){
  $fr="\"" ;
# здесь я предлагаю разработать код самостоятельно
           # я использовал цикл для генерации шаблона  $fr="\"...............";
#print "fr = ".$fr."\n";
  $line = replace($fr,"",$line);
}#end if
#<--

  # теперь осталось вырезать точку
$point=substr($line,0,1);
if ($point eq ".") {$line = "";}  #del char .

#print $line."\n";

  $line=" ".$line;
  @line_array=split(/\s+/, $line);
  shift (@line_array);  # discard fileID

  foreach $w (@line_array)  {
    $mons{$w} = 1;
  }
}

Файл определений можно сделать вручную :)

0

13

Теперь пришло время проверить тренировочные и проверочные скрипты fst_htk с утилитами HTS,
тк русский синтезатор RHVoice, разработанный  Ольгой Яковлевой, использует модели голосов,
тренированные в пакете HTS. В данный момент выпущен патч HTS 2.2 для HTK 3.4.1.

Ссылки:
-HTK 3.4.1 см. в разделе download http://hts.sp.nitech.ac.jp/?Download
Для загрузки HTK потребуется бесплатная регистрация на стр.
http://htk.eng.cam.ac.uk/register.shtml, пароль будет отправлен по e-mail.
После этого посетите http://htk.eng.cam.ac.uk/download.shtml, и загрузите исходный код HTK

для соответствующей операционной системы.
- HTS-2.2_for_HTK-3.4.1.tar.bz2 (см. в Google)

Для патча потребуются:
каталоги HTK-3.4.1
файл патча HTS-2.2_for_HTK-3.4.1.patch
патчер patch.exe для Windows

Патчер можно загрузить отсюда: http://gnuwin32.sourceforge.net/packages/patch.htm
Дополнительная информация находится здесь:
How apply patch file on windows? http://www.redmine.org/boards/2/topics/4041

Необходимо скопировать все в отдельный каталог, например, HTK и выполнить команду:

patch.exe  --binary -p0 -d . <HTS-2.2_for_HTK-3.4.1.patch

Патчер выведет на экран список измененных файлов.
После этого нужно переименовать каталог HTK-3.4.1 в HTS-2.2 и снова собрать утилиты.
Перед запуском тренировочных криптов на голосовой базе следует проверить работу новых утилит
на примере fst_htk. Проверка показала полную идентичность результатов работы тренировычных и
проверочных скриптов.
Протестировано в Windows XP.

Примечание
Если вводить команду
patch.exe   -p1 -d . <HTS-2.2_for_HTK-3.4.1.patch   ,

патчер выдаст сообщение об ошибке, тк не может найти имя файла.
На команду
patch.exe   -p0 -d . <HTS-2.2_for_HTK-3.4.1.patch
выдает ошибку
"Assertion failed, hunk, file patch.c, line 343," unless the option '--binary' is given.

0

14

Скрипты для автоматической генерации определений hmm
cr_hmmdefs.bat
perl scripts/create_macros proto hmms/hmm0/vFloors hmms/hmm0/macros
perl scripts/create_hmmdefs monophones23 hmms/hmm0/proto hmms/hmm0/hmmdefs
pause

Файл create_macros
#!/usr/local/bin/perl -w
#use strict;

my ($proto, $vFloors, $macros, $line);

# check usage
if (@ARGV != 3) {
  print "usage: $0 proto vFloors macros\n\n";
  exit (0);
}

# read in command line arguments
($proto, $vFloors, $macros) = @ARGV;

# open files
open (VFLOORS,"$vFloors") || die ("Unable to open $vFloors file for reading");
open (MACROS,">$macros") || die ("Unable to open $macros file for writing");

#print(MACROS "~o\n<VecSize> 39 <MFCC_0_D_A>\n");  #debug print

##variant 1
#print(MACROS "~o\n");
#while ($line = <VFLOORS>) {
#  chomp ($line);
#  if (substr($line,0,10) eq "<Variance>" ){
#          #@line_array=split(/\s+/, $line);
#   $line = replace("Variance","VecSize",$line);
#   printf(MACROS "%s\n", $line." <MFCC_0_D_A>");
#  }
#}
#
#close(VFLOORS);
#open (VFLOORS,"$vFloors") || die ("Unable to open $vFloors file for reading");

#variant 2
open (PROTO,"$proto") || die ("Unable to open proto file for reading");
$line = <PROTO>;
printf(MACROS "%s", $line);
close(PROTO);

# process each VFLOORS line one at a time
while ($line = <VFLOORS>) {
  chomp ($line);
  printf(MACROS "%s\n", $line);
}

close(VFLOORS);
close(MACROS);

sub replace {
      my ($from,$to,$string) = @_;
      $string =~s/$from/$to/ig;                          #case-insensitive/global (all occurrences)

      return $string;
   }

0

15

Файл create_hmmdefs
#!/usr/local/bin/perl -w
#use strict;

my ($monophones, $proto, $hmmdefs, $line, $proto_lines, @line_array);

# check usage
if (@ARGV != 3) {
  print "usage: $0 monophones hmms\\hmm0\\proto hmmdefs\n\n";
  exit (0);
}

# read in command line arguments
($monophones, $proto, $hmmdefs) = @ARGV;

# open files
open (MONO,"$monophones") || die ("Unable to open $monophones file for reading");
open (PROTO,"$proto") || die ("Unable to open $proto file for reading");
open (HMMDEFS,">$hmmdefs") || die ("Unable to open $hmmdefs file for writing");

$proto_lines="";

# process each prompt one at a time
while ($line = <PROTO>) {
  #chomp ($line);
  #@line_array=split(/\s+/, $line);
  #shift (@line_array);  # discard fileID
  $proto_lines=$proto_lines.$line;
}

while ($monoline = <MONO>){
$proto_lines2 = $proto_lines;
chomp ($monoline);
$proto_lines2 = replace("proto",$monoline,$proto_lines2);
printf(HMMDEFS "%s", $proto_lines2);
}

close(MONO);
close(PROTO);
close(HMMDEFS);

sub replace {
      my ($from,$to,$string) = @_;
      $string =~s/$from/$to/ig;                          #case-insensitive/global (all occurrences)

      return $string;
   }

Добрый Ээх.

0

16

Чем больше будут копи-пастить, тем быстрее разучатся думать.

0


Вы здесь » Форум ReidS Soft » Flite+hts_engine » Перевод htk book