有没有办法在 Windows 语音合成器说话时显示音频波?

Posted

技术标签:

【中文标题】有没有办法在 Windows 语音合成器说话时显示音频波?【英文标题】:Is there a way to display an audio wave as Windows Speech Synthesizer speaks? 【发布时间】:2015-09-18 22:29:35 【问题描述】:

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

【问题讨论】:

要回答这个问题需要教程或书籍或非常长的答案,这在此处都是题外话。您已经使用了哪些概念?你使用图书馆吗?使用设备/驱动程序有多熟悉?您使用哪个 Microsoft API 进行语音合成?我曾经使用过 MSSAPI,例如保存 WAV 文件而不是说话。然后您可以播放和显示 WAV 文件。也许今天有更好的方法,所以让人们知道您正在使用什么以及您已经尝试过什么。 【参考方案1】:

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

WASAPI

现在 WASAPI 不太适合被托管应用程序调用。您可能需要 PInvoke 功能。但你很幸运!有一个包含该 API 的托管库:

CSCore

它提供了许多有用的对象来播放音频缓冲区和流。您可以通过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

为了让您顺利上路,请查看此*** 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 在内部这样做,因为浮点样本更适合混合不同的音频源。

【讨论】:

以上是关于有没有办法在 Windows 语音合成器说话时显示音频波?的主要内容,如果未能解决你的问题,请参考以下文章

使用 SSML 说话时如何跳过部分文本

有没有办法通过 ms 说话人识别将 MS 语音与文本接口?

ROS:语音识别与合成,让机器人会说话

有没有办法在更新列表中的 DOM 时显示 JSON 数据?

自然语言处理NLP之自然语言生成文本相似性看图说话说话生图语音合成自然语言可视化

有没有办法在下载时显示正确的切换图例?