Exercício: criar um aplicativo de conversão de fala em texto de reconhecimento contínuo

Concluído

Neste exercício, você criará um aplicativo que usa o reconhecimento contínuo para transcrever o arquivo de áudio de exemplo baixado no exercício anterior.

Modificar o código do aplicativo de conversão de texto em fala

  1. No Cloud Shell à direita, abra o arquivo Program.cs.

    code Program.cs
    
  2. Atualize o bloco try/catch com o seguinte código para modificar o aplicativo e usar o reconhecimento contínuo em vez do reconhecimento de disparo único:

    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. Depois que você modificar o código, o arquivo deverá se parecer com o seguinte exemplo:

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

    Assim como no exercício anterior, atualize os valores das variáveis azureKey e azureLocation com a chave e o local do primeiro exercício.

  4. Para salvar suas alterações, pressione Ctrl+S para salvar o arquivo e, em seguida, pressione Ctrl+Q para sair do editor.

Execute seu aplicativo.

  1. Para executar o aplicativo, use o seguinte comando no Cloud Shell à direita:

    dotnet run
    
  2. Quando nenhum erro é exibido, isso significa que o aplicativo foi executado com sucesso e que você verá as seguintes respostas exibidas:

    Speech recognition started.
    Speech recognition stopped.
    
  3. Execute o seguinte comando para obter uma lista de arquivos no diretório:

    ls -l
    

    Você verá o arquivo Shakespeare.txt na lista de arquivos e verá uma resposta como a do seguinte exemplo:

    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
    

    Note que o arquivo de texto é maior que o resultado do exercício anterior. Essa diferença de tamanho do arquivo ocorre porque o reconhecimento de fala contínuo converteu mais do arquivo de áudio.

  4. Para exibir o conteúdo do arquivo Shakespeare.txt, use o seguinte comando:

    cat Shakespeare.txt
    

    Você verá uma resposta como no seguinte exemplo:

    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.
    

    Se você ouvir o arquivo WAV de exemplo, notará que esse texto agora contém a totalidade do áudio. Como você usou o método StartContinuousRecognitionAsync() do SpeechRecognizer, o reconhecimento da conversão de fala em texto continuou mesmo quando o locutor pausou.

Melhorar os resultados de reconhecimento do aplicativo

Na seção anterior, os resultados da segunda linha de texto não eram perfeitos. Este erro de reconhecimento é devido ao antigo vocabulário em inglês na peça de William Shakespeare. O exemplo é análogo ao vocabulário especializado que clientes médicos usam para anotações e ditados.

A Fala de IA do Azure permite que você ajude a melhorar os resultados do reconhecimento especificando uma lista de frases que podem não ser familiares ao mecanismo de reconhecimento de fala.

Para ver um exemplo desse tipo de melhoria em ação, siga as etapas a seguir.

  1. No Cloud Shell à direita, abra o arquivo Program.cs:

    code Program.cs
    
  2. Localize as seguintes duas linhas de código:

    FileStream fileStream = File.OpenWrite(textFile);
    StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8);
    
  3. Adicione as seguintes linhas de código após essas duas linhas. Verifique se ambas as linhas correspondem ao recuo das linhas anteriores:

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

    Essas linhas permitem que o mecanismo de reconhecimento de fala detecte a antiga frase em inglês da peça de Shakespeare.

  4. Para salvar suas alterações, pressione Ctrl+S para salvar o arquivo e, em seguida, pressione Ctrl+Q para sair do editor.

  5. Execute novamente o aplicativo usando o seguinte comando:

    dotnet run
    
  6. Quando o aplicativo terminar a execução, use o seguinte comando para visualizar o conteúdo do arquivo Shakespeare.txt:

    cat Shakespeare.txt
    

    Você verá uma resposta como no seguinte exemplo:

    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.
    

    Note que o erro de reconhecimento foi corrigido nos resultados.