如何在 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# 中使用原始音频样本创建波形流?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 PCM 音频样本流转换为音量?

Windows Vista/7:如何对输出音频混合进行采样?

在 Windows 中更改原始波形数据的音高

如何给音频降噪

如何使用 SpeechSynthesizer C# 将音频流写入响应

波形音频缓冲区