Alıştırma - Metin uygulamasına sürekli tanıma konuşması oluşturma

Tamamlandı

Bu alıştırmada, önceki alıştırmada indirdiğiniz örnek ses dosyasının dökümünü almak için sürekli tanıma kullanan bir uygulama oluşturacaksınız.

Metin okuma uygulamanızın kodunu değiştirme

  1. Sağdaki Cloud Shell'de Program.cs dosyasını açın.

    code Program.cs
    
  2. Uygulamayı tek seferlik tanıma yerine sürekli tanıma kullanacak şekilde değiştirmek için try/catch bloğunu aşağıdaki kodla güncelleştirin:

    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. Kodu değiştirmeyi bitirdiğinizde dosyanız aşağıdaki örneğe benzer olmalıdır:

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

    Önceki alıştırmada olduğu gibi, ve değişkenleri için değerleri ilk alıştırmadaki azureKeyazureLocation anahtarınız ve konumunuzla güncelleştirdiğinizden emin olun.

  4. Değişikliklerinizi kaydetmek için Ctrl+S tuşlarına basarak dosyayı kaydedin ve ardından Ctrl+Q tuşlarına basarak düzenleyiciden çıkın.

Uygulamanızı çalıştırma

  1. Uygulamanızı çalıştırmak için sağ taraftaki Cloud Shell'de aşağıdaki komutu kullanın:

    dotnet run
    
  2. Herhangi bir hata görmüyorsanız uygulamanız başarıyla çalıştırılmıştır ve aşağıdaki yanıtların görüntülendiğini görmeniz gerekir:

    Speech recognition started.
    Speech recognition stopped.
    
  3. Dizindeki dosyaların listesini almak için aşağıdaki komutu çalıştırın:

    ls -l
    

    Aşağıdaki örneğe benzer bir yanıt görmeniz ve dosya listesinde Shakespeare.txt görmeniz gerekir:

    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
    

    Metin dosyasının önceki alıştırmanın sonucundan daha büyük olduğunu fark edeceksiniz. Dosya boyutundaki bu farkın nedeni, sürekli konuşma tanımanın ses dosyasının daha fazlasını dönüştürmesidir.

  4. Shakespeare.txt dosyasının içeriğini görüntülemek için aşağıdaki komutu kullanın:

    cat Shakespeare.txt
    

    Aşağıdaki örneğe benzer bir yanıt görmeniz gerekir:

    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.
    

    Örnek WAV dosyasını dinlediyseniz, bu metnin artık sesin tamamını içerdiğini fark edeceksiniz. yöntemini StartContinuousRecognitionAsync()kullandığımızdanSpeechRecognizer, konuşmacı duraklatıldığında bile konuşmayı metin tanımaya devam etti.

Uygulamanızın tanıma sonuçlarını geliştirme

Önceki bölümde, ikinci metin satırının sonuçlarının mükemmel olmadığını fark edeceksiniz; Bu tanıma hatası William Shakespeare'in oyunundaki eski İngilizce kelime dağarcığından kaynaklandı. Bu örnek, tıbbi müşterilerinizin notları ve dikteleri için kullanacağı özel kelime dağarcığına benzer.

Azure AI Konuşma Tanıma, konuşma tanıma altyapısına yabancı olabilecek tümceciklerin listesini belirterek tanıma sonuçlarınızı iyileştirmenize yardımcı olur.

Bu tür bir iyileştirmenin nasıl çalıştığını görmek için aşağıdaki adımları kullanın.

  1. Sağdaki Cloud Shell'de Program.cs dosyasını açın:

    code Program.cs
    
  2. Aşağıdaki iki kod satırı bulun:

    FileStream fileStream = File.OpenWrite(textFile);
    StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8);
    
  3. Aşağıdaki kod satırlarını bu iki satırın hemen arkasına ekleyin. Her iki satırın da önceki satırların girintisi ile eşleştiğinden emin olun:

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

    Bu satırlar, konuşma tanıma altyapısının Shakespeare'in oyunundaki eski İngilizce tümceciği algılamasını sağlar.

  4. Değişikliklerinizi kaydetmek için Ctrl+S tuşlarına basarak dosyayı kaydedin ve ardından Ctrl+Q tuşlarına basarak düzenleyiciden çıkın.

  5. Aşağıdaki komutu kullanarak uygulamanızı yeniden çalıştırın:

    dotnet run
    
  6. Uygulamanız tamamlandığında, Shakespeare.txt dosyasının içeriğini görüntülemek için aşağıdaki komutu kullanın:

    cat Shakespeare.txt
    

    Aşağıdaki örneğe benzer bir yanıt görmeniz gerekir:

    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.
    

    Sonuçlarda tanıma hatasının düzeltildiğini fark edeceksiniz.