Oefening: een toepassing voor continue herkenning van spraak naar tekst maken
In deze oefening maakt u een toepassing die gebruikmaakt van continue herkenning om het voorbeeldaudiobestand dat u in de vorige oefening hebt gedownload, te transcriberen.
De code voor uw tekst-naar-spraaktoepassing wijzigen
Open in Cloud Shell aan de rechterkant het bestand Program.cs .
code Program.cs
Werk het try/catch-blok bij met de volgende code om de toepassing te wijzigen zodat continue herkenning wordt gebruikt in plaats van eenmalige herkenning:
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); }
Wanneer u klaar bent met het wijzigen van de code, moet het bestand er ongeveer uitzien zoals in het volgende voorbeeld:
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); }
Net als bij de vorige oefening moet u ervoor zorgen dat u de waarden voor de
azureKey
enazureLocation
variabelen bijwerkt met uw sleutel en locatie uit de eerste oefening.Als u de wijzigingen wilt opslaan, drukt u op Ctrl+S om het bestand op te slaan en drukt u vervolgens op Ctrl+Q om de editor af te sluiten.
Uw toepassing uitvoeren
Gebruik de volgende opdracht in Cloud Shell aan de rechterkant om uw toepassing uit te voeren:
dotnet run
Als er geen fouten worden weergegeven, is uw toepassing uitgevoerd en ziet u de volgende antwoorden:
Speech recognition started. Speech recognition stopped.
Voer de volgende opdracht uit om een lijst met bestanden op te halen in de map:
ls -l
Als het goed is, ziet u een antwoord zoals in het volgende voorbeeld en ziet u de Shakespeare.txt in de lijst met bestanden:
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
U ziet dat het tekstbestand groter is dan het resultaat van de vorige oefening. Dit verschil in bestandsgrootte is omdat de continue spraakherkenning meer van het audiobestand heeft geconverteerd.
Gebruik de volgende opdracht om de inhoud van het bestand Shakespeare.txt weer te geven:
cat Shakespeare.txt
Als het goed is, ziet u een antwoord zoals in het volgende voorbeeld:
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.
Als u naar het WAV-voorbeeldbestand hebt geluisterd, ziet u dat deze tekst nu de volledige audio bevat. Omdat we de methode van de
StartContinuousRecognitionAsync()
SpeechRecognizer
, de spraak naar tekstherkenning voortgezet, zelfs wanneer de spreker onderbroken.
De herkenningsresultaten van uw toepassing verbeteren
In de vorige sectie ziet u dat de resultaten voor de tweede tekstregel niet perfect waren; deze fout in erkenning was te wijten aan de oude Engelse vocabulaire in William Shakespeares spel. Dit voorbeeld is vergelijkbaar met de gespecialiseerde vocabulaire die uw medische cliƫnten zullen gebruiken voor hun notities en dicteren.
Met Azure AI Speech kunt u uw herkenningsresultaten verbeteren door een lijst met woordgroepen op te geven die mogelijk onbekend zijn met de spraakherkenningsengine.
Als u een voorbeeld van dit type verbetering in actie wilt zien, gebruikt u de volgende stappen.
Open in Cloud Shell aan de rechterkant het bestand Program.cs :
code Program.cs
Zoek de volgende twee regels code:
FileStream fileStream = File.OpenWrite(textFile); StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8);
Voeg de volgende regels code toe na deze twee regels:
var phraseList = PhraseListGrammar.FromRecognizer(speechRecognizer); phraseList.AddPhrase("thou seest");
Met deze regels kan de spraakherkenningsengine de oude Engelse woordgroep detecteren uit het spel van Shakespeare.
Als u de wijzigingen wilt opslaan, drukt u op Ctrl+S om het bestand op te slaan en drukt u vervolgens op Ctrl+Q om de editor af te sluiten.
Voer uw toepassing opnieuw uit met behulp van de volgende opdracht:
dotnet run
Wanneer uw toepassing is voltooid, gebruikt u de volgende opdracht om de inhoud van het Bestand Shakespeare.txt weer te geven:
cat Shakespeare.txt
Als het goed is, ziet u een antwoord zoals in het volgende voorbeeld:
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.
U ziet dat de herkenningsfout is opgelost in de resultaten.