Google речь в текстовом API с одним высказыванием - PullRequest
0 голосов
/ 07 октября 2018

Я пытался написать простую программу для обработки речи в текст.Я использовал Google API для этого.Благодаря этому источнику я смог преобразовать его и записать в текстовый файл.Но с этим мне нужно установить секунды для прослушивания.Я хочу, чтобы программа поняла, что речь закончилась.Насколько я знаю, это можно сделать, если для single_utterance задано значение true.Но я не знаю, как изменить свой код.Ниже я выкладываю код.

static async Task<object> StreamingMicRecognizeAsync(int seconds)
    {
        if (NAudio.Wave.WaveIn.DeviceCount < 1)
        {
            MessageBox.Show("No microphone!");
            return -1;
        }
        var speech = SpeechClient.Create();
        var streamingCall = speech.StreamingRecognize();

        await streamingCall.WriteAsync(
            new StreamingRecognizeRequest()
            {
                StreamingConfig = new StreamingRecognitionConfig()
                {
                    Config = new RecognitionConfig()
                    {
                        Encoding =
                        RecognitionConfig.Types.AudioEncoding.Linear16,
                        SampleRateHertz = 16000,
                        LanguageCode = "tr-TR",
                    },
                    InterimResults = false,
                    SingleUtterance = true,

                }

            });
        // Print responses as they arrive.
        Task printResponses = Task.Run(async () =>
        {
            while (await streamingCall.ResponseStream.MoveNext(
                default(CancellationToken)))
            {
                foreach (var result in streamingCall.ResponseStream
                    .Current.Results)
                {


                    foreach (var alternative in result.Alternatives)
                    {
                        Console.WriteLine(alternative.Transcript);

                        if (result.IsFinal) {

                            Console.WriteLine(alternative.Transcript);

                            // writing results to a text file

                             using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\env\output.txt", false))
                             {
                                 file.WriteLine(alternative.Transcript);
                             }
                        }
                    }

                }
            }
        });
        // Read from the microphone and stream to API.
        object writeLock = new object();
        bool writeMore = true;
        var waveIn = new NAudio.Wave.WaveInEvent();
        waveIn.DeviceNumber = 0;
        waveIn.WaveFormat = new NAudio.Wave.WaveFormat(16000, 1);
        waveIn.DataAvailable +=
            (object sender, NAudio.Wave.WaveInEventArgs args) =>
            {
                lock (writeLock)
                {
                    if (!writeMore) return;
                    streamingCall.WriteAsync(
                        new StreamingRecognizeRequest()
                        {
                            AudioContent = Google.Protobuf.ByteString
                                .CopyFrom(args.Buffer, 0, args.BytesRecorded)
                        }).Wait();
                }
            };


        waveIn.StartRecording();

        await Task.Delay(TimeSpan.FromSeconds(seconds));
        // Stop recording and shut down.
        waveIn.StopRecording();
        lock (writeLock) writeMore = false;
        await streamingCall.WriteCompleteAsync();
        await printResponses;
        Environment.Exit(Environment.ExitCode);

        return 0;
    }

1 Ответ

0 голосов
/ 04 января 2019

Ответ может быть немного запоздалым, но вот как я это сделал:

                Config = new RecognitionConfig()
            {
                Encoding =
                RecognitionConfig.Types.AudioEncoding.Linear16,
                SampleRateHertz = 16000,
                LanguageCode = "tr-TR",
            },
            InterimResults = false,
            SingleUtterance = true,

1) Вы устанавливаете флаг единственное высказывание = true, как указано выше.

2) Создайте переменную, например, var translationEnded = false;перед выполнением задачи

3) В цикле результатов захватить событие (пример ниже)

Task printResponses = Task.Run(async () =>
    {
        while (await streamingCall.ResponseStream.MoveNext(
            default(CancellationToken)))
        {
            if (streamingCall.ResponseStream.Current.SpeechEventType ==
 StreamingRecognizeResponse.Types.SpeechEventType.EndOfSingleUtterance)
            {
                recognitionEnded = true;
                Debug.WriteLine("End of detection");
            }

            foreach (var result in streamingCall.ResponseStream
                .Current.Results)
            {
                foreach (var alternative in result.Alternatives)
                {
                    Debug.WriteLine(alternative.Transcript);
                }
            }
        }
    });

4) После StartRecording просто подождать, пока Параметр translationEnded установит значение true (пример ниже)

         Debug.WriteLine("Speak now.");
         waveIn.StartRecording();
         while(!recognitionEnded) {; }
         waveIn.StopRecording();
         Debug.WriteLine("End of recording");
...