Акустическое обучение с использованием SAPI 5.3 Speech API - PullRequest
9 голосов
/ 18 ноября 2008

Используя Microsoft SAPI 5.3 Speech API для Vista, как вы программно выполняете обучение акустической модели RecoProfile? Более конкретно, если у вас есть текстовый файл и аудиофайл пользователя, говорящего на этом тексте, какую последовательность вызовов SAPI вы бы использовали для обучения профиля пользователя с использованием этого текста и звука?

Обновление:

Больше информации об этой проблеме я до сих пор не решил: Вы вызываете ISpRecognizer2.SetTrainingState (TRUE, TRUE) в «начале» и ISpRecognizer2.SetTrainingState (FALSE, TRUE) в «конце». Но до сих пор неясно, когда эти действия должны произойти по сравнению с другими действиями.

Например, вам нужно совершать различные вызовы, чтобы установить грамматику с текстом, соответствующим вашему аудио, и другие вызовы, чтобы подключить аудио, и другие вызовы к различным объектам, чтобы сказать: «Вы готовы идти сейчас «. Но каковы взаимозависимости - что должно произойти до чего еще? И если вы используете аудиофайл вместо системного микрофона для ввода, делает ли это относительную синхронизацию менее прощающей, потому что распознаватель не будет продолжать сидеть, слушая, пока динамик не поймет правильно?

1 Ответ

15 голосов
/ 06 октября 2009

Внедрение обучения SAPI является относительно трудным делом, и документация на самом деле не говорит вам, что вам нужно знать.

ISpRecognizer2 :: SetTrainingState переключает распознаватель в режим обучения или из него.

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

Движок действительно не выполняет никаких адаптаций, пока вы не выйдете из режима обучения, и вы не установили флаг fAdaptFromTrainingData.

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

Эти файлы также должны быть помечены, чтобы двигатель знал, что было сказано.

Так как ты это делаешь? Вам нужно использовать три менее известных API-интерфейса SAPI. В частности, вам нужно получить маркер профиля, используя ISpRecognizer :: GetObjectToken и SpObjectToken :: GetStorageFileName , чтобы правильно найти файл.

Наконец, вам также нужно использовать ISpTranscript для создания правильно помеченных аудиофайлов.

Чтобы собрать все это вместе, вам нужно сделать следующее (псевдокод):

Создание распознавателя inproc и привязка соответствующего аудиовхода.

Убедитесь, что вы сохраняете аудио для своего распознавания; это понадобится тебе позже.

Создание грамматики, содержащей текст для обучения.

Установите состояние грамматики для приостановки распознавателя, когда происходит распознавание. (Это также помогает в обучении из аудиофайла.)

Когда происходит распознавание:

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

Создание объекта потока с использованием CoCreateInstance (CLSID_SpStream).

Создайте обучающий аудиофайл, используя ISpRecognizer :: GetObjectToken и ISpObjectToken :: GetStorageFileName , и привяжите его к потоку (используя ISpStream :: BindToFile ).

Скопируйте сохраненный звук в объект потока.

QI объект потока для интерфейса ISpTranscript и использование ISpTranscript :: AppendTranscript для добавления распознанного текста в поток.

Обновите грамматику для следующего высказывания, возобновите распознавание и повторяйте, пока не закончите обучение.

...