Exercice – Créer une application de reconnaissance vocale en continu
Dans cet exercice, vous allez créer une application qui utilise la reconnaissance continue pour transcrire l’exemple de fichier audio que vous avez téléchargé dans l’exercice précédent.
Modifier le code de votre application de synthèse vocale
Dans Cloud Shell à droite, ouvrez le fichier Program.cs.
code Program.cs
Mettez à jour le bloc try/catch avec le code suivant pour modifier l’application afin d’utiliser une reconnaissance continue au lieu d’une reconnaissance ponctuelle :
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); }
Quand vous avez terminé de modifier le code, votre fichier doit ressembler à l’exemple suivant :
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); }
Comme avec l’exercice précédent, veillez à mettre à jour les valeurs des variables
azureKey
etazureLocation
avec vos clé et emplacement du premier exercice.Pour enregistrer vos modifications, appuyez sur Ctrl+S pour enregistrer le fichier, puis sur Ctrl+Q pour quitter l’éditeur.
Exécuter votre application
Pour exécuter votre application, utilisez la commande suivante dans Cloud Shell à droite :
dotnet run
Si vous ne voyez aucune erreur, c’est que votre application s’exécute correctement, et vous devez normalement voir les réponses suivantes :
Speech recognition started. Speech recognition stopped.
Exécutez la commande suivante pour obtenir la liste des fichiers du répertoire :
ls -l
Vous devez voir une réponse comme l’exemple suivant, avec Shakespeare.txt figurant dans la liste des fichiers :
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
Vous remarquerez que le fichier texte est plus volumineux que le résultat de l’exercice précédent. Cette différence de taille du fichier est due au fait que la reconnaissance vocale continue a appliqué une conversion au fichier audio.
Pour voir le contenu du fichier Shakespeare.txt, utilisez la commande suivante :
cat Shakespeare.txt
Vous devez normalement voir une réponse similaire à l’exemple suivant :
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.
Si vous avez écouté l’exemple de fichier WAV, vous remarquerez que ce texte contient maintenant l’intégralité de l’audio. Comme nous avons utilisé la méthode
StartContinuousRecognitionAsync()
deSpeechRecognizer
, la reconnaissance vocale a continué même quand l’orateur a fait une pause.
Améliorer les résultats de la reconnaissance de votre application
Dans la section précédente, vous avez remarqué que les résultats de la deuxième ligne de texte n’étaient pas parfaits : cette erreur dans la reconnaissance était due au vocabulaire anglais ancien dans la pièce de William Shakespeare. Cet exemple est analogue au vocabulaire spécialisé que vos clients médicaux utiliseront pour leurs notes et leurs dictées.
Azure AI Speech vous permet d’améliorer vos résultats de reconnaissance en spécifiant une liste des expressions susceptibles de ne pas être connues du moteur de reconnaissance vocale.
Pour voir un exemple de ce type d’amélioration en action, utilisez les étapes suivantes.
Dans Cloud Shell à droite, ouvrez le fichier Program.cs :
code Program.cs
Recherchez les deux lignes de code suivantes :
FileStream fileStream = File.OpenWrite(textFile); StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8);
Ajoutez les lignes de code suivantes directement après ces deux lignes. Assurez-vous que l’indentation des deux lignes correspond à celle des lignes précédentes :
var phraseList = PhraseListGrammar.FromRecognizer(speechRecognizer); phraseList.AddPhrase("thou seest");
Ces lignes permettent au moteur de reconnaissance vocale de détecter l’expression anglaise ancienne de la pièce de Shakespeare.
Pour enregistrer vos modifications, appuyez sur Ctrl+S pour enregistrer le fichier, puis sur Ctrl+Q pour quitter l’éditeur.
Réexécutez l’application en utilisant la commande suivante :
dotnet run
Une fois votre application terminée, utilisez la commande suivante pour visualiser le contenu du fichier Shakespeare.txt :
cat Shakespeare.txt
Vous devez normalement voir une réponse similaire à l’exemple suivant :
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.
Vous remarquerez que l’erreur de reconnaissance est corrigée dans les résultats.