Cvičení – vytvoření řeči na textovou aplikaci s průběžným rozpoznáváním
V tomto cvičení vytvoříte aplikaci, která pomocí průběžného rozpoznávání přepíše ukázkový zvukový soubor, který jste stáhli v předchozím cvičení.
Úprava kódu pro text do aplikace speech
V Cloud Shellu napravo otevřete soubor Program.cs .
code Program.cs
Aktualizujte blok try/catch následujícím kódem a upravte aplikaci tak, aby místo jednorázového rozpoznávání používala průběžné rozpoznávání:
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); }
Po dokončení úpravy kódu by se soubor měl podobat následujícímu příkladu:
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); }
Stejně jako v předchozím cvičení nezapomeňte aktualizovat hodnoty pro
azureKey
proměnné pomocí klíče aazureLocation
umístění z prvního cvičení.Pokud chcete uložit změny, uložte soubor stisknutím ctrl+S a stisknutím ctrl+Q ukončete editor.
Spusťte aplikaci
Ke spuštění aplikace použijte následující příkaz v Cloud Shellu napravo:
dotnet run
Pokud se nezobrazí žádné chyby, vaše aplikace se úspěšně spustila a měly by se zobrazit následující odpovědi:
Speech recognition started. Speech recognition stopped.
Spuštěním následujícího příkazu získejte seznam souborů v adresáři:
ls -l
Měla by se zobrazit odpověď podobná následujícímu příkladu a měli byste vidět Shakespeare.txt v seznamu souborů:
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
Všimněte si, že textový soubor je větší než výsledek předchozího cvičení. Tento rozdíl ve velikosti souboru spočívá v tom, že průběžné rozpoznávání řeči převádělo více zvukového souboru.
Pokud chcete zobrazit obsah souboru Shakespeare.txt , použijte následující příkaz:
cat Shakespeare.txt
Měla by se zobrazit odpověď podobná následujícímu příkladu:
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.
Pokud jste si poslechli ukázkový soubor WAV, všimli byste si, že tento text teď obsahuje celý zvuk. Vzhledem k tomu, že jsme použili
StartContinuousRecognitionAsync()
metoduSpeechRecognizer
, řeč na rozpoznávání textu pokračovala i v případě, že reproduktor pozastavil.
Zlepšení výsledků rozpoznávání aplikace
V předchozí části si všimnete, že výsledky druhého řádku textu nebyly dokonalé; tato chyba při rozpoznávání byla způsobena starým anglickým slovníkem ve hře Williama Williama. Tento příklad je podobný specializované slovní zásobě, kterou budou vaši zdravotní klienti používat pro své poznámky a diktování.
Azure AI Speech umožňuje zlepšit výsledky rozpoznávání zadáním seznamu frází, které nemusí být pro modul pro rozpoznávání řeči neznámé.
Pokud chcete zobrazit příklad tohoto typu vylepšení v akci, postupujte následovně.
V Cloud Shellu napravo otevřete soubor Program.cs :
code Program.cs
Vyhledejte následující dva řádky kódu:
FileStream fileStream = File.OpenWrite(textFile); StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8);
Přidejte následující řádky kódu přímo za tyto dva řádky. Ujistěte se, že oba řádky odpovídají odsazení předchozích řádků:
var phraseList = PhraseListGrammar.FromRecognizer(speechRecognizer); phraseList.AddPhrase("thou seest");
Tyto řádky umožňují stroji pro rozpoznávání řeči rozpoznat starou anglickou frázi ze hry Shakespeara.
Pokud chcete uložit změny, uložte soubor stisknutím ctrl+S a stisknutím ctrl+Q ukončete editor.
Znovu spusťte aplikaci pomocí následujícího příkazu:
dotnet run
Po dokončení aplikace pomocí následujícího příkazu zobrazte obsah souboru Shakespeare.txt :
cat Shakespeare.txt
Měla by se zobrazit odpověď podobná následujícímu příkladu:
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.
Všimněte si, že ve výsledcích je opravena chyba rozpoznávání.