有没有办法在 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 语音合成器说话时显示音频波?的主要内容,如果未能解决你的问题,请参考以下文章