如何在 C# 中使用原始音频样本创建波形流?
Posted
技术标签:
【中文标题】如何在 C# 中使用原始音频样本创建波形流?【英文标题】:How to create a wave STREAM out of raw audio samples in C#? 【发布时间】:2011-02-20 22:55:39 【问题描述】:【问题讨论】:
@Jake:“原始音频”=Internet 上 99% 的 MPEG 的音轨怎么样? 您想使用 C# 读取 .wav 文件吗? 我已经实现了一个由 mic/preamp/adc 电路组成的设备,它正在捕获语音命令 - 数字化音频在 fpga 上处理并通过 Eth 发送到 PC。 UDP 接收器正在提取 16 位样本(每个数据包 64 个)。采样等的特征是已知的(当然)。我现在需要将这些样本转换为某种波流,以便将其输入到语音识别程序中。谢谢。 【参考方案1】:这是一个很好的用 C# 读写 WAV 文件的示例项目:
http://www.codeproject.com/KB/audio-video/Concatenation%5FWave%5FFiles.aspx
假设您的“原始音频”是一个短(2 字节)整数数组,这是一个简单的任务。 WAV 文件的标头是 44 字节(见注释),因此您首先写出标头(使用示例中的代码),然后是数据。
注意:并非所有 WAV 文件都是“规范的”,这意味着它们并非都有一个 44 字节的标头,后跟数据。 WAV 格式实际上是一种 RIFF 格式,这意味着它们可以包含各种不同的数据,并且标题不一定在开头。但是,这些都不重要,因为您只是在编写 WAV 文件。
更新:如果语音识别程序需要一个流(而不是文件路径),那么很容易像这样创建MemoryStream
:
byte[] bytes = System.IO.File.ReadAllBytes("c:\whatever.wav");
System.IO.MemoryStream stream = new System.IO.MemoryStream(bytes);
或者您可以完全避免文件 I/O,并首先将您的 WAV 文件创建为内存字节数组,然后从中创建 MemoryStream
。
【讨论】:
非常感谢您的回答!我已经阅读了有关规范 WAV 文件格式等的信息。链接中的代码/项目对此很有用。那么流呢,你能告诉一些关于流的事情吗?此外,这个文件(如果最终文件而不是流?!)将被语音识别程序读取 - 所以标题等确实很重要。 @refugee:我假设语音识别程序将流作为输入,并持续监视流中的新数据。您可能需要包含有关此程序的更多详细信息以及它期望的输入类型。 WAV 文件 的头部包含一个指示后面数据大小的值 - 如果程序期望一个开放式流,这将不适用。可能是您的语音识别程序需要一个初始调用,告诉它流数据将采用什么格式,然后是数据的实际流。以上是关于如何在 C# 中使用原始音频样本创建波形流?的主要内容,如果未能解决你的问题,请参考以下文章
Windows Vista/7:如何对输出音频混合进行采样?