Övning – Skapa ett tal till textprogram för kontinuerlig igenkänning

Slutförd

I den här övningen skapar du ett program som använder kontinuerlig igenkänning för att transkribera exempelljudfilen som du laddade ned i föregående övning.

Ändra koden för text till tal-programmet

  1. Öppna filen Program.cs i Cloud Shell till höger.

    code Program.cs
    
  2. Uppdatera try/catch-blocket med följande kod för att ändra programmet så att det använder kontinuerlig igenkänning i stället för enkel igenkänning:

    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. När du har ändrat koden bör filen likna följande exempel:

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

    Precis som i föregående övning kontrollerar du att du uppdaterar värdena för variablerna azureKey och azureLocation med din nyckel och plats från den första övningen.

  4. Spara ändringarna genom att trycka på Ctrl+S för att spara filen och sedan trycka på Ctrl+Q för att avsluta redigeraren.

Köra ditt program

  1. Om du vill köra ditt program använder du följande kommando i Cloud Shell till höger:

    dotnet run
    
  2. Om du inte ser några fel har programmet körts och du bör se följande svar:

    Speech recognition started.
    Speech recognition stopped.
    
  3. Kör följande kommando för att hämta en lista över filer i katalogen:

    ls -l
    

    Du bör se ett svar som i följande exempel och du bör se Shakespeare.txt i listan med filer:

    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
    

    Du kommer att märka att textfilen är större än resultatet av föregående övning. Den här skillnaden i filstorlek beror på att den kontinuerliga taligenkänningen konverterade mer av ljudfilen.

  4. Om du vill visa innehållet i filen Shakespeare.txt använder du följande kommando:

    cat Shakespeare.txt
    

    Du bör se ett svar som i följande exempel:

    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.
    

    Om du lyssnade på WAV-exempelfilen skulle du märka att texten nu innehåller hela ljudet. Eftersom vi använde StartContinuousRecognitionAsync() metoden för SpeechRecognizerfortsatte tal-till-text-igenkänningen även när talaren pausade.

Förbättra programmets igenkänningsresultat

I föregående avsnitt ser du att resultatet för den andra textraden inte var perfekt. detta fel i erkännande berodde på den gamla engelska vokabulären i William Shakespeares pjäs. Det här exemplet motsvarar den specialiserade vokabulär som dina medicinska klienter kommer att använda för sina anteckningar och dikteringar.

Med Azure AI Speech kan du förbättra dina igenkänningsresultat genom att ange en lista med fraser som kanske inte är bekanta med taligenkänningsmotorn.

Om du vill se ett exempel på den här typen av förbättring i praktiken använder du följande steg.

  1. Öppna filen Program.cs i Cloud Shell till höger:

    code Program.cs
    
  2. Leta upp följande två kodrader:

    FileStream fileStream = File.OpenWrite(textFile);
    StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8);
    
  3. Lägg till följande kodrader direkt efter dessa två rader. Kontrollera att båda raderna matchar indraget för föregående rader:

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

    Dessa rader gör det möjligt för taligenkänningsmotorn att upptäcka den gamla engelska frasen från Shakespeares pjäs.

  4. Spara ändringarna genom att trycka på Ctrl+S för att spara filen och sedan trycka på Ctrl+Q för att avsluta redigeraren.

  5. Kör programmet igen med hjälp av följande kommando:

    dotnet run
    
  6. När programmet är klart använder du följande kommando för att visa innehållet i den Shakespeare.txt filen:

    cat Shakespeare.txt
    

    Du bör se ett svar som i följande exempel:

    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.
    

    Du ser att igenkänningsfelet har åtgärdats i resultatet.