【发布时间】:2017-03-21 18:03:42
【问题描述】:
我正在尝试在 c# 中实现 VAD(语音活动检测)算法,因为我没有找到任何适合此目的的库。 我不使用波形文件,而只使用内存流,就像这样:
NAudio.Wave.WaveFileWriter waveWriter;
Stream s1 = new MemoryStream();
WaveInEvent waveSource = new WaveInEvent();
waveSource.WaveFormat = new NAudio.Wave.WaveFormat(16000, 16, 1);
waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
waveWriter = new NAudio.Wave.WaveFileWriter(s1, waveSource.WaveFormat);
waveSource.StartRecording();
Console.ReadLine();
waveSource.StopRecording();
s1.Position = 0;
var bytes = streamToArray(s1);
我将按照tutorial 进行操作,第一步是将输入信号拆分为 10 毫秒帧。我知道如何从文件输入中执行此操作,但是如何使用字节数组执行类似的操作? 谢谢你的回答!
更新:
我测试了这些方法:
1.
short[] sdata = new short[(int)Math.Ceiling(bytes.Length / 2.0)];
Buffer.BlockCopy(bytes, 0, sdata, 0, bytes.Length);
2.
for (var i = 0; i < bytes.Length; i += 2)
{
var b1 = (short)bytes[i];
var b2 = (short)bytes[i + 1];
sListData.Add((short)(b1 | b2 << 8));
}
当我将输出数组与使用 Big Endian 的方法进行比较时,它们都是相等的。
所以BlockCopy做这项工作,但只有当 BE 合适时。
【问题讨论】:
标签: c# audio stream memorystream