Übung – Erstellen einer Spracherkennungsanwendung mit kontinuierlicher Erkennung

Abgeschlossen

In dieser Übung erstellen Sie eine Anwendung, die die kontinuierliche Erkennung verwendet, um die Audiodatei des Beispiels zu transkribieren, das Sie in der vorherigen Übung heruntergeladen haben.

Ändern des Codes für Ihre Sprachsyntheseanwendung

  1. Öffnen Sie in der Cloud Shell-Instanz rechts die Datei Program.cs.

    code Program.cs
    
  2. Aktualisieren Sie den try/catch-Block mit folgendem Code, um die Anwendung so zu ändern, dass die kontinuierliche Erkennung anstelle der Einzelerkennung verwendet wird:

    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);
    }
    
  3. Wenn Sie den Code geändert haben, sollte Ihre Datei wie das folgende Beispiel aussehen:

    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);
    }
    

    Stellen Sie sicher, dass Sie wie bei der vorherigen Übung die Werte für die Variablen azureKey und azureLocation mit Ihrem Schlüssel und dem Speicherort aus der ersten Übung aktualisieren.

  4. Drücken Sie STRG+S, um die Datei und somit Ihre Änderungen zu speichern. Drücken Sie dann STRG+Q, um den Editor zu beenden.

Ausführen der Anwendung

  1. Um Ihre Anwendung auszuführen, führen Sie in der Cloud Shell-Instanz rechts den folgenden Befehl aus:

    dotnet run
    
  2. Wenn Sie keine Fehlermeldungen sehen, wurde Ihre Anwendung erfolgreich ausgeführt, und Ihnen sollten die folgenden Antworten angezeigt werden:

    Speech recognition started.
    Speech recognition stopped.
    
  3. Führen Sie den folgenden Befehl aus, um eine Liste der Dateien in diesem Verzeichnis abzurufen:

    ls -l
    

    Sie sollten eine Antwort wie im folgenden Beispiel und die Datei Shakespeare.txt in der Liste der Dateien sehen:

    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
    

    Sie werden feststellen, dass die Textdatei größer als das Ergebnis der vorherigen Übung ist. Dieser Unterschied in der Dateigröße ist darauf zurückzuführen, dass die kontinuierliche Spracherkennung einen größeren Teil der Audiodatei konvertiert hat.

  4. Sie können den Inhalt der Datei Shakespeare.txt mit dem folgenden Befehl anzeigen:

    cat Shakespeare.txt
    

    Es wird eine Antwort ähnlich wie im folgenden Beispiel angezeigt:

    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.
    

    Wenn Sie sich die WAVE-Beispieldatei angehört haben, werden Sie feststellen, dass dieser Text jetzt die gesamten Audiodaten enthält. Da wir die StartContinuousRecognitionAsync()-Methode des SpeechRecognizer verwendet haben, wurde die Spracherkennung auch dann fortgesetzt, wenn der Sprecher pausierte.

Verbessern der Erkennungsergebnisse Ihrer Anwendung

Im vorigen Abschnitt haben Sie bemerkt, dass die Ergebnisse für die zweite Textzeile nicht perfekt waren. Dieser Erkennungsfehler ist auf das alte englische Vokabular in dem Stück von William Shakespeares zurückzuführen. Dieses Beispiel ist vergleichbar mit dem Fachvokabular, das Ihre medizinischen Kunden für ihre Notizen und Diktate verwenden.

Mit Azure KI Speech können Sie die Erkennungsergebnisse verbessern, indem Sie eine Liste von Begriffen angeben, die der Spracherkennungsengine möglicherweise unbekannt sind.

Um ein Beispiel für diese Art der Verbesserung in Aktion zu sehen, verwenden Sie die folgenden Schritte.

  1. Öffnen Sie in der Cloud Shell-Instanz rechts die Datei Program.cs:

    code Program.cs
    
  2. Suchen Sie die folgenden beiden Codezeilen:

    FileStream fileStream = File.OpenWrite(textFile);
    StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8);
    
  3. Fügen Sie die folgenden Codezeilen hinter diesen beiden Zeilen hinzu:

    var phraseList = PhraseListGrammar.FromRecognizer(speechRecognizer);
    phraseList.AddPhrase("thou seest");
    

    Anhand dieser Zeilen kann die Spracherkennungsengine die alte englische Phrase aus Shakespeares Stück erkennen.

  4. Drücken Sie STRG+S, um die Datei und somit Ihre Änderungen zu speichern. Drücken Sie dann STRG+Q, um den Editor zu beenden.

  5. Führen Sie Ihre Anwendung mithilfe des folgenden Befehls erneut aus:

    dotnet run
    
  6. Wenn Ihre Anwendung fertig ist, zeigen Sie mit dem folgenden Befehl den Inhalt der Datei Shakespeare.txt an:

    cat Shakespeare.txt
    

    Es wird eine Antwort ähnlich wie im folgenden Beispiel angezeigt:

    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.
    

    Sie werden feststellen, dass der Erkennungsfehler in den Ergebnissen behoben wurde.