Как программно обучить SpeechRecognitionEngine и конвертировать аудио файл в текст на c# или vb.net
можно ли программно обучить распознаватель, дающий .помахать вместо того, чтобы говорить с микрофоном?
если да, то как это сделать? в настоящее время у меня есть код, который выполняет распознавание аудио в 0.WAV и file и записывает распознанный текст на консоль.
Imports System.IO
Imports System.Speech.Recognition
Imports System.Speech.AudioFormat
Namespace SampleRecognition
Class Program
Shared completed As Boolean
Public Shared Sub Main(ByVal args As String())
Using recognizer As New SpeechRecognitionEngine()
Dim dictation As Grammar = New DictationGrammar()
dictation.Name = "Dictation Grammar"
recognizer.LoadGrammar(dictation)
' Configure the input to the recognizer.
recognizer.SetInputToWaveFile("C:UsersMEv02.wav")
' Attach event handlers for the results of recognition.
AddHandler recognizer.SpeechRecognized, AddressOf recognizer_SpeechRecognized
AddHandler recognizer.RecognizeCompleted, AddressOf recognizer_RecognizeCompleted
' Perform recognition on the entire file.
Console.WriteLine("Starting asynchronous recognition...")
completed = False
recognizer.RecognizeAsync()
' Keep the console window open.
While Not completed
Console.ReadLine()
End While
Console.WriteLine("Done.")
End Using
Console.WriteLine()
Console.WriteLine("Press any key to exit...")
Console.ReadKey()
End Sub
' Handle the SpeechRecognized event.
Private Shared Sub recognizer_SpeechRecognized(ByVal sender As Object, ByVal e As SpeechRecognizedEventArgs)
If e.Result IsNot Nothing AndAlso e.Result.Text IsNot Nothing Then
Console.WriteLine(" Recognized text = {0}", e.Result.Text)
Else
Console.WriteLine(" Recognized text not available.")
End If
End Sub
' Handle the RecognizeCompleted event.
Private Shared Sub recognizer_RecognizeCompleted(ByVal sender As Object, ByVal e As RecognizeCompletedEventArgs)
If e.[Error] IsNot Nothing Then
Console.WriteLine(" Error encountered, {0}: {1}", e.[Error].[GetType]().Name, e.[Error].Message)
End If
If e.Cancelled Then
Console.WriteLine(" Operation cancelled.")
End If
If e.InputStreamEnded Then
Console.WriteLine(" End of stream encountered.")
End If
completed = True
End Sub
End Class
End Namespace
редактировать
Я понимаю, что использование мастера обучения полезно для этого
выполнено путем открытия распознавания речи, нажав кнопку Пуск кнопка- > Панель управления - >простота доступа - >распознавание речи
.
как пользовательское обучение распознаванию речи с помощью пользовательских wav или даже mp3-файлов?
при использовании мастера обучения (UI тренировки панели управления) учебные файлы хранятся в {AppData}LocalMicrosoftSpeechFilesTrainingAudio.
Как я могу использовать или сделать пользовательское обучение вместо использования мастера обучения?
Панель управления речью создает записи реестра для учебных аудиофайлов в разделе HKCUSoftwareMicrosoftSpeechRecoProfilesTokens{ProfileGUID}{00000000-0000-0000-0000-0000000000000000}Files
должны ли быть помещены записи реестра, созданные кодом?
причина этого в том, что я хочу настроить поезд с моими собственными файлами wav и списком слов и фраз, а затем перенести все в другие системы.
2 ответов
вы можете создать пользовательское обучение с помощью SAPI engine (не управляемый api)
здесь ссылке о том, как это сделать (хотя и немного расплывчато)
конечно, можно обучить SAPI с помощью C#. вы можете использовать обертки speechlib вокруг SAPI для доступа к API режима обучения из C#.вот!--2-- > @Eric Brown ответил на процедуру
- создайте распознаватель inproc и свяжите соответствующий аудиовход.
- убедитесь, что вы сохраняете звук для ваших распознаваний; он понадобится вам позже.
- создайте грамматику, содержащую текст для обучения.
-
установить грамматика состояние приостановить распознаватель при возникновении распознавания. (Это также помогает при обучении из аудиофайла.)
когда происходит распознавание:
получить распознанный текст и сохранить аудио.
- создайте объект stream с помощью CoCreateInstance (CLSID_SpStream).
- создайте обучающий аудиофайл с помощью ISpRecognizer:: GetObjectToken и ISpObjectToken:: GetStorageFileName и привяжите его к потоку (используя ISpStream:: BindToFile ).
- скопируйте сохраненный звук в объект stream.
- QI объект stream для интерфейса ISpTranscript и используйте ISpTranscript:: AppendTranscript для добавления распознанного текста в поток.
- обновите грамматику для следующего высказывания, возобновите распознаватель и повторяйте, пока вы не закончите учебный текст.
другой вариант может быть обучение sapi один раз с желаемым выходом, а затем получить профили с кодом и транспортируйте это в другие системы, следующий код возвращает объект ISpeechObjectTokens.:
метод GetProfiles возвращает выбор пользователя доступны профили речи. Профили сохраняются в конфигурации речи база данных в виде серии токенов, каждый из которых представляет один профиль. GetProfiles извлекает все доступные маркеры профиля. Этот возвращаемый список является объектом ISpeechObjectTokens. Дополнительные или более подробная информация о токенах доступно в методах связано с ISpeechObjectTokens. Поиск токенов может быть продолжен уточнено с помощью поиска RequiredAttributes и OptionalAttributes атрибуты. Только маркеры, соответствующие указанным RequiredAttributes атрибуты поиска. Из тех жетонов, которые соответствуют RequiredAttributes ключ, OptionalAttributes перечисляет устройства в порядке сопоставление OptionalAttributes. Если атрибуты поиска не предлагаются, все жетоны не возвращаются. Если аудиоустройства не соответствуют критерий, GetAudioInputs возвращает пустой выбор, то есть Коллекция ISpeechObjectTokens с ISpeechObjectTokens:: количество свойство нуля. см. раздел маркеры объектов и параметры реестра для списка SAPI 5-определенными атрибутами.
Public SharedRecognizer As SpSharedRecognizer
Public theRecognizers As ISpeechObjectTokens
Private Sub Command1_Click()
On Error GoTo EH
Dim currentProfile As SpObjectToken
Dim i As Integer
Dim T As String
Dim TokenObject As ISpeechObjectToken
Set currentProfile = SharedRecognizer.Profile
For i = 0 To theRecognizers.Count - 1
Set TokenObject = theRecognizers.Item(i)
If tokenObject.Id <> currentProfile.Id Then
Set SharedRecognizer.Profile = TokenObject
T = "New Profile installed: "
T = T & SharedRecognizer.Profile.GetDescription
Exit For
Else
T = "No new profile has been installed."
End If
Next i
MsgBox T, vbInformation
EH:
If Err.Number Then ShowErrMsg
End Sub
Private Sub Form_Load()
On Error GoTo EH
Const NL = vbNewLine
Dim i, idPosition As Long
Dim T As String
Dim TokenObject As SpObjectToken
Set SharedRecognizer = CreateObject("SAPI.SpSharedRecognizer")
Set theRecognizers = SharedRecognizer.GetProfiles
For i = 0 To theRecognizers.Count - 1
Set TokenObject = theRecognizers.Item(i)
T = T & TokenObject.GetDescription & "--" & NL & NL
idPosition = InStrRev(TokenObject.Id, "\")
T = T & Mid(TokenObject.Id, idPosition + 1) & NL
Next i
MsgBox T, vbInformation
EH:
If Err.Number Then ShowErrMsg
End Sub
Private Sub ShowErrMsg()
' Declare identifiers:
Dim T As String
T = "Desc: " & Err.Description & vbNewLine
T = T & "Err #: " & Err.Number
MsgBox T, vbExclamation, "Run-Time Error"
End
End Sub