Cvičení – vytvoření řeči na textovou aplikaci s průběžným rozpoznáváním

Dokončeno

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

  1. V Cloud Shellu napravo otevřete soubor Program.cs .

    code Program.cs
    
  2. 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);
    }
    
  3. 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 a azureLocation umístění z prvního cvičení.

  4. Pokud chcete uložit změny, uložte soubor stisknutím ctrl+S a stisknutím ctrl+Q ukončete editor.

Spusťte aplikaci

  1. Ke spuštění aplikace použijte následující příkaz v Cloud Shellu napravo:

    dotnet run
    
  2. 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.
    
  3. 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.

  4. 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() metodu SpeechRecognizer, ř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ě.

  1. V Cloud Shellu napravo otevřete soubor Program.cs :

    code Program.cs
    
  2. Vyhledejte následující dva řádky kódu:

    FileStream fileStream = File.OpenWrite(textFile);
    StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8);
    
  3. 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.

  4. Pokud chcete uložit změny, uložte soubor stisknutím ctrl+S a stisknutím ctrl+Q ukončete editor.

  5. Znovu spusťte aplikaci pomocí následujícího příkazu:

    dotnet run
    
  6. 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í.