有没有办法像Windows语音合成器那样显示音频波?

时间:2015-09-18 22:29:36

标签: c# audio real-time speech-synthesis

我正在制作一个使用Windows语音识别的程序来监听命令,我正在使用语音合成器来提供实时反馈。我想知道是否可以使用合成器的结果来创建音频波(类似于录制语音时Audacity中的内容),当合成器继续时,它将实时显示说话。我试图发挥能够看到'节目谈话,而不仅仅是听到它。我不知道从哪里开始,任何建议/帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

从Windows Vista开始,您可以通过以下方式捕获当前音频会话的音频缓冲区:

现在,托管应用程序调用WASAPI并不好。你可能需要PInvoke funktions。但你很幸运!有一个托管库包装API:

它提供了许多有用的对象来播放音频缓冲区和流。您可以通过nuget

加载到项目中

要创建用于捕获 live 音频缓冲区的Stream,您需要执行以下操作:

            using (WasapiCapture capture = new WasapiLoopbackCapture()) {                    
                capture.Initialize();                    
                using(MemoryStream mstr = new MemoryStream())
                using (WaveWriter wvWriter = new WaveWriter(mstr, capture.WaveFormat)) { 
                     capture.DataAvailable += 
                           (object sender, DataAvailableEventArgs e) => {                                    
                                wvWriter.Write(e.Data, e.Offset, e.ByteCount);
                                // Do some stuff with that Data!
                           }
                }
            }

要了解如何创建您在流中输入的WaveForm数据,可能需要查看一些教程。 (提示:询问 Google

为了让您继续前行,请查看此stackoverflow question或此CodeProject article

另请注意,大多数教程都介绍了如何创建标准44.1 kHz 16位立体声PCM音频格式的波形。 Windows喜欢将其音频缓冲为88 kHz 32位IEEE_FLOAT立体声PCM音频格式。这意味着您每秒钟将拥有88,000个32位样本,这些样本将对应于2个通道,其float值范围为0.0到1.0。 (而不是-32k到+ 32k integer值)

Windows 内部,因为浮点样本更适合混合不同的音频源。