【问题标题】:Azure Speech SDK Speech-to-Text to Stream Audio SegmentsAzure Speech SDK Speech-to-Text 流式传输音频片段
【发布时间】:2021-06-08 21:53:37
【问题描述】:

我一直在使用 Azure 的 Speech-To-Text 服务,发现 here,使用从内存流中识别的方法。基本上我打算做的只是将音频的某些片段流式传输到服务,但我不完全确定如何做到这一点。假设我有一个长度为 5 分钟的视频,我的目标是仅流式传输前 30 秒,甚至只是从音频文件中的 1 分钟标记到 3 分钟标记,我需要在以下代码中启用或更改什么这样做?

我尝试使用 CreatePullStream() 而不是 CreatePushStream() 在几秒钟内提供标记,但它没有产生我上面描述的目标。如果有人知道,请告诉我如何实现这一点,非常感谢!

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

class Program 
{
    async static Task FromStream(SpeechConfig speechConfig)
    {
        var reader = new BinaryReader(File.OpenRead("audioFile.wav"));
        using var audioInputStream = AudioInputStream.CreatePushStream();
        using var audioConfig = AudioConfig.FromStreamInput(audioInputStream);
        using var recognizer = new SpeechRecognizer(speechConfig, audioConfig);

        byte[] readBytes;
        do
        {
            readBytes = reader.ReadBytes(1024);
            audioInputStream.Write(readBytes, readBytes.Length);
        } while (readBytes.Length > 0);

        var result = await recognizer.RecognizeOnceAsync();
        Console.WriteLine($"RECOGNIZED: Text={result.Text}");
    }

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription("<paste-your-subscription-key>", "<paste-your-region>");
        await FromStream(speechConfig);
    }
}

【问题讨论】:

    标签: c# .net azure azure-cognitive-services


    【解决方案1】:

    您可以使用NAudio.Wave 来剪切您的源.wav 文件。例如,如果您想识别 .wav 文件的 1 分钟 - 3 分钟内容,请尝试以下代码:

    using System;
    using System.IO;
    using System.Threading.Tasks;
    using Microsoft.CognitiveServices.Speech;
    using Microsoft.CognitiveServices.Speech.Audio;
    using NAudio.Wave;
    
    class Program
    {
        async static Task FromStream(SpeechConfig speechConfig)
        {
    
            var inputAudioPath = @"<path>";
            var outputAudioPath = @"<path>";
            var startAt = new TimeSpan(0, 1, 0); //start at 1 min
            var duration = new TimeSpan(0,2,0); //cut 1-3 min audio, it lasts 2 mins
    
            CutAudio(inputAudioPath, outputAudioPath, startAt, duration);
    
            var reader = new BinaryReader(File.OpenRead(outputAudioPath));
            var audioInputStream = AudioInputStream.CreatePushStream();
            var audioConfig = AudioConfig.FromStreamInput(audioInputStream);
            var recognizer = new SpeechRecognizer(speechConfig, audioConfig);
    
            byte[] readBytes;
            do
            {
                readBytes = reader.ReadBytes(1024);
                audioInputStream.Write(readBytes, readBytes.Length);
            } while (readBytes.Length > 0);
    
            var result = await recognizer.RecognizeOnceAsync();
            Console.WriteLine($"RECOGNIZED: Text={result.Text}");
        }
    
    
        public static void CutAudio(String inputPath,String destPath,TimeSpan startAt, TimeSpan duration) {
    
            using (var reader = new AudioFileReader(inputPath))
            {
                reader.CurrentTime = startAt; // jump forward to the position we want to start from
                WaveFileWriter.CreateWaveFile16(destPath, reader.Take(duration));
            }
        }
    
    
        async static Task Main(string[] args)
        {
    
    
            var speechConfig = SpeechConfig.FromSubscription("<key>", "<region>");
            await FromStream(speechConfig);
        }
    }
    

    结果:

    顺便说一句,如果你想识别长音频,请参阅this official doc 和我之前的帖子here

    【讨论】:

    • 有没有办法实现这个方法而不必每次都创建一个新的音频文件?我了解您在此处实施的方法,这绝对是其中一种方法,但我只是想将音频文件的某些片段流式传输到 Speech-To-Text 服务。因为假设除了从 1 分钟到 3 分钟的流式传输之外,我还计划流式传输音频文件的最后 30 秒。我觉得最好只提供我想要发送的特定间隔。@Stanley
    • @AfricanMamba,抱歉,不确定,我在我的项目中使用这种方式:创建所需的 .wav 文件并在使用后删除它们。
    • @AfricanMamba,怎么样?您的问题解决了吗?
    • 很遗憾,我的问题还没有解决。感谢您的帮助,但我需要找到一种方法来实现该方法,而无需生成新的音频文件或对其进行操作。我一直在寻找如何仅流式传输部分音频,但我还没有发现它。感谢您入住。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 2023-01-21
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多