Упражнение. Создание преобразования речи непрерывного распознавания в текстовое приложение
В этом упражнении вы создадите приложение, использующее непрерывное распознавание для транскрибирования примера аудиофайла, скачанного в предыдущем упражнении.
Изменение кода для приложения преобразования текста в речь
В Cloud Shell справа откройте файл Program.cs .
code Program.cs
Обновите блок try/catch со следующим кодом, чтобы изменить приложение, чтобы использовать непрерывное распознавание вместо однократного распознавания:
try { FileInfo fileInfo = new FileInfo(waveFile); if (fileInfo.Exists) { var speechConfig = SpeechConfig.FromSubscription(azureKey, azureLocation); using var audioConfig = AudioConfig.FromWavFileInput(fileInfo.FullName); using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig); var stopRecognition = new TaskCompletionSource<int>(); FileStream fileStream = File.OpenWrite(textFile); StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8); speechRecognizer.Recognized += (s, e) => { switch(e.Result.Reason) { case ResultReason.RecognizedSpeech: streamWriter.WriteLine(e.Result.Text); break; case ResultReason.NoMatch: Console.WriteLine("Speech could not be recognized."); break; } }; speechRecognizer.Canceled += (s, e) => { if (e.Reason != CancellationReason.EndOfStream) { Console.WriteLine("Speech recognition canceled."); } stopRecognition.TrySetResult(0); streamWriter.Close(); }; speechRecognizer.SessionStopped += (s, e) => { Console.WriteLine("Speech recognition stopped."); stopRecognition.TrySetResult(0); streamWriter.Close(); }; Console.WriteLine("Speech recognition started."); await speechRecognizer.StartContinuousRecognitionAsync(); Task.WaitAny(new[] { stopRecognition.Task }); await speechRecognizer.StopContinuousRecognitionAsync(); } } catch (Exception ex) { Console.WriteLine(ex.Message); }
После завершения изменения кода файл должен выглядеть следующим образом:
using System.Text; using Microsoft.CognitiveServices.Speech; using Microsoft.CognitiveServices.Speech.Audio; string azureKey = "ENTER YOUR KEY FROM THE FIRST EXERCISE"; string azureLocation = "ENTER YOUR LOCATION FROM THE FIRST EXERCISE"; string textFile = "Shakespeare.txt"; string waveFile = "Shakespeare.wav"; try { FileInfo fileInfo = new FileInfo(waveFile); if (fileInfo.Exists) { var speechConfig = SpeechConfig.FromSubscription(azureKey, azureLocation); using var audioConfig = AudioConfig.FromWavFileInput(fileInfo.FullName); using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig); var stopRecognition = new TaskCompletionSource<int>(); FileStream fileStream = File.OpenWrite(textFile); StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8); speechRecognizer.Recognized += (s, e) => { switch(e.Result.Reason) { case ResultReason.RecognizedSpeech: streamWriter.WriteLine(e.Result.Text); break; case ResultReason.NoMatch: Console.WriteLine("Speech could not be recognized."); break; } }; speechRecognizer.Canceled += (s, e) => { if (e.Reason != CancellationReason.EndOfStream) { Console.WriteLine("Speech recognition canceled."); } stopRecognition.TrySetResult(0); streamWriter.Close(); }; speechRecognizer.SessionStopped += (s, e) => { Console.WriteLine("Speech recognition stopped."); stopRecognition.TrySetResult(0); streamWriter.Close(); }; Console.WriteLine("Speech recognition started."); await speechRecognizer.StartContinuousRecognitionAsync(); Task.WaitAny(new[] { stopRecognition.Task }); await speechRecognizer.StopContinuousRecognitionAsync(); } } catch (Exception ex) { Console.WriteLine(ex.Message); }
Как и в предыдущем упражнении, убедитесь, что вы обновляете значения для
azureKey
значений иazureLocation
переменных с помощью ключа и расположения из первого упражнения.Чтобы сохранить изменения, нажмите клавиши CTRL+S , чтобы сохранить файл, а затем нажмите клавиши CTRL+Q , чтобы выйти из редактора.
Запуск приложения
Чтобы запустить приложение, используйте следующую команду в Cloud Shell справа:
dotnet run
Если вы не видите никаких ошибок, приложение успешно запущено, и вы увидите следующие ответы:
Speech recognition started. Speech recognition stopped.
Выполните следующую команду, чтобы получить список файлов в каталоге:
ls -l
Вы увидите ответ, как в следующем примере, и вы увидите Shakespeare.txt в списке файлов:
drwxr-xr-x 3 user user 4096 Oct 1 11:11 bin drwxr-xr-x 3 user user 4096 Oct 1 11:11 obj -rw-r--r-- 1 user user 2926 Oct 1 11:11 Program.cs -rw-r--r-- 1 user user 412 Oct 1 11:11 Shakespeare.txt -rwxr-xr-x 1 user user 978242 Oct 1 11:11 Shakespeare.wav -rw-r--r-- 1 user user 348 Oct 1 11:11 speech to text.csproj
Вы заметите, что текстовый файл больше результата предыдущего упражнения. Это различие в размере файла обусловлено тем, что непрерывное распознавание речи преобразует больше звукового файла.
Чтобы просмотреть содержимое файла Shakespeare.txt , используйте следующую команду:
cat Shakespeare.txt
Вы увидите ответ, как показано в следующем примере:
The following quotes are from Act 2, scene seven of William Shakespeare's play as you like it. Though CS we are not all alone unhappy. This wide and universal theater presents more woeful pageants than the scene wherein we play in. All the world's a stage and all the men and women merely players. They have their exits and their entrances, and one man in his time plays many parts, his act being seven ages.
Если вы прослушивали образец WAV-файла, вы заметите, что этот текст теперь содержит весь звук. Так как мы использовали
StartContinuousRecognitionAsync()
метод распознаванияSpeechRecognizer
текста, речь продолжается даже при приостановке говорящего.
Улучшение результатов распознавания приложения
В предыдущем разделе вы заметите, что результаты для второй строки текста не были идеальными; эта ошибка в распознавании была вызвана старым английским словарем в пьесе Уильяма Шекспира. Этот пример аналогичен специализированному словарю, который ваши медицинские клиенты будут использовать для своих заметок и диктовок.
Распознавание речи в Azure позволяет улучшить результаты распознавания, указав список фраз, которые могут быть незнакомы подсистеме распознавания речи.
Чтобы просмотреть пример этого типа улучшения в действии, выполните следующие действия.
В Cloud Shell справа откройте файл Program.cs :
code Program.cs
Найдите следующие две строки кода:
FileStream fileStream = File.OpenWrite(textFile); StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8);
Добавьте следующие строки кода непосредственно после этих двух строк. Убедитесь, что обе строки соответствуют отступу предыдущих строк:
var phraseList = PhraseListGrammar.FromRecognizer(speechRecognizer); phraseList.AddPhrase("thou seest");
Эти строки позволяют механизму распознавания речи обнаруживать старую английскую фразу из пьесы Шекспира.
Чтобы сохранить изменения, нажмите клавиши CTRL+S , чтобы сохранить файл, а затем нажмите клавиши CTRL+Q , чтобы выйти из редактора.
Повторно запустите приложение с помощью следующей команды:
dotnet run
По завершении приложения используйте следующую команду, чтобы просмотреть содержимое файла Shakespeare.txt :
cat Shakespeare.txt
Вы увидите ответ, как показано в следующем примере:
The following quotes are from Act 2, scene seven of William Shakespeare's play as you like it. Thou seest, we are not all alone unhappy. This wide and universal theater presents more woeful pageants than the scene wherein we play in. All the world's a stage and all the men and women merely players. They have their exits and their entrances, and one man in his time plays many parts, his act being seven ages.
Вы заметите, что ошибка распознавания исправлена в результатах.