Ćwiczenie — tworzenie ciągłej rozpoznawania mowy do aplikacji tekstowej

Ukończone

W tym ćwiczeniu utworzysz aplikację, która używa ciągłego rozpoznawania do transkrypcji przykładowego pliku audio pobranego w poprzednim ćwiczeniu.

Modyfikowanie kodu dla aplikacji zamiany tekstu na mowę

  1. W usłudze Cloud Shell po prawej stronie otwórz plik Program.cs .

    code Program.cs
    
  2. Zaktualizuj blok try/catch przy użyciu następującego kodu, aby zmodyfikować aplikację tak, aby korzystała z ciągłego rozpoznawania zamiast rozpoznawania pojedynczego strzału:

    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 zakończeniu modyfikowania kodu plik powinien przypominać następujący przykład:

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

    Podobnie jak w poprzednim ćwiczeniu, upewnij się, że wartości zmiennych azureKey i azureLocation są aktualizowane przy użyciu klucza i lokalizacji z pierwszego ćwiczenia.

  4. Aby zapisać zmiany, naciśnij Ctrl+S , aby zapisać plik, a następnie naciśnij Ctrl+Q , aby zakończyć działanie edytora.

Uruchamianie aplikacji

  1. Aby uruchomić aplikację, użyj następującego polecenia w usłudze Cloud Shell po prawej stronie:

    dotnet run
    
  2. Jeśli nie widzisz żadnych błędów, aplikacja została pomyślnie uruchomiona i powinna zostać wyświetlona następująca odpowiedź:

    Speech recognition started.
    Speech recognition stopped.
    
  3. Uruchom następujące polecenie, aby uzyskać listę plików w katalogu:

    ls -l
    

    Powinna zostać wyświetlona odpowiedź podobna do poniższego przykładu. Powinna zostać wyświetlona Shakespeare.txt na liście plików:

    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
    

    Zauważysz, że plik tekstowy jest większy niż wynik poprzedniego ćwiczenia. Ta różnica w rozmiarze pliku polega na tym, że ciągłe rozpoznawanie mowy przekonwertowało więcej pliku audio.

  4. Aby wyświetlić zawartość pliku Shakespeare.txt , użyj następującego polecenia:

    cat Shakespeare.txt
    

    Powinna zostać wyświetlona odpowiedź podobna do poniższego przykładu:

    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.
    

    Jeśli nasłuchujesz przykładowego pliku WAV, zauważysz, że ten tekst zawiera teraz całą zawartość dźwięku. Ponieważ użyliśmy StartContinuousRecognitionAsync() metody SpeechRecognizer, rozpoznawanie mowy do tekstu było kontynuowane nawet wtedy, gdy głośnik został wstrzymany.

Ulepszanie wyników rozpoznawania aplikacji

W poprzedniej sekcji zauważysz, że wyniki drugiego wiersza tekstu nie były idealne; ten błąd w uznaniu wynikał ze starego słownictwa angielskiego w sztuce Williama Szekspira. Ten przykład jest analogiczny do specjalistycznego słownictwa, którego klienci medyczni będą używać do swoich notatek i dyktowania.

Usługa Azure AI Speech pozwala zwiększyć wyniki rozpoznawania, określając listę fraz, które mogą być nieznane aparatowi rozpoznawania mowy.

Aby zapoznać się z przykładem tego typu ulepszeń w działaniu, wykonaj następujące kroki.

  1. W usłudze Cloud Shell po prawej stronie otwórz plik Program.cs :

    code Program.cs
    
  2. Znajdź następujące dwa wiersze kodu:

    FileStream fileStream = File.OpenWrite(textFile);
    StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8);
    
  3. Dodaj następujące wiersze kodu bezpośrednio po tych dwóch wierszach. Upewnij się, że oba wiersze są zgodne z wcięciem poprzednich wierszy:

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

    Te wiersze umożliwiają aparatowi rozpoznawania mowy wykrywanie starej angielskiej frazy z sztuki Szekspira.

  4. Aby zapisać zmiany, naciśnij Ctrl+S , aby zapisać plik, a następnie naciśnij Ctrl+Q , aby zakończyć działanie edytora.

  5. Uruchom ponownie aplikację przy użyciu następującego polecenia:

    dotnet run
    
  6. Po zakończeniu pracy aplikacji użyj następującego polecenia, aby wyświetlić zawartość pliku Shakespeare.txt :

    cat Shakespeare.txt
    

    Powinna zostać wyświetlona odpowiedź podobna do poniższego przykładu:

    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.
    

    Zauważysz, że błąd rozpoznawania został naprawiony w wynikach.