gpt4 book ai didi

c# - 将音频信号从内存流分别拆分为帧。字节数组 [C#]

转载 作者:行者123 更新时间:2023-12-03 01:46:51 26 4
gpt4 key购买 nike

我正在尝试在 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第一步是将输入信号拆分为 10ms 帧。我知道如何从文件输入中执行此操作,但是如何使用字节数组执行类似的操作?
感谢您的回答!

更新:

我测试了这些方法:

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 是适当的。

最佳答案

不是 100% 确定这是否是您的意思,但是:
假设音频流参数为 16kbp,每个样本 16 位,单 channel ,如果 16000 个样本是一秒,那么 10ms 是 16000/100 = 160 个样本,这是一个非常快速的计算。现在 16 位是 2 个字节,这给了我们 160 * 2 = 320 个字节。
所以每 320 个字节是 10ms。
您可以使用 Array.Copy - https://msdn.microsoft.com/en-us/library/z50k9bft(v=vs.110).aspx将 block od 数据复制到单独的数组。

只是下面的一些代码:

var int8Array = 新字节 [] { 0x04, 0x02, 0x08, 0xA1 };

var int16ArrayLE = new List<short>();
var int16ArrayBE = new List<short>();

for(var i=0;i<int8Array.Length;i+=2)
{
var b1 = (short)int8Array[i];
var b2 = (short)int8Array[i+1];
int16ArrayLE.Add((short)((b1 << 8) + b2));
int16ArrayBE.Add((short)(b1 + (b2 << 8)));
}

在 .net 中,短类型是 16 位整数,字节是 8 位整数。为了可读性,代码有点明确。我展示了 2 种可能的转换 - Little Endian 和 Big Endian。前者的第一个字节在后者的第二个字节中更重要。字节顺序取决于流格式,两者都可以。

关于c# - 将音频信号从内存流分别拆分为帧。字节数组 [C#],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42934880/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com