如何从阵列产生声音信号?

时间:2016-08-26 15:37:43

标签: python audio byte

我正在开展一个需要进行声音处理的项目。我知道如何录制声音并将信号转换为浮点数以便处理它。问题是,我不知道如何将这些数字转换回字节以播放最终处理过的声音。

想象一下像这样的数组:

[-954.04373976038096, -289.02199657142637, 603.07726299005469, 558.24833180011706, -252.49007227640698, -884.07367717525278, -754.89044791362232]

我需要将它转换为与此类似的东西,才能播放声音:

[b'\x92\xffQ\xffO\xff\xad\xff\x12\x00\xfc\xfff\xff\xe4\xfe\xee\xfeC\xffA']

如果我使用bytes()将每个数字转换为字节并播放,那么我只会得到噪音。当我将它转换回浮点数以查看发生了什么时,它的值与原始浮点数不同。

1 个答案:

答案 0 :(得分:0)

首先,您需要知道值的最大范围。鉴于您的价值,可能是-2000.02000.0,但我不知道,所以我的猜测很可能是错误的。通常,浮点音频信号中的数字范围为-1.01.0。显然,你有更大的价值观。如果你有理由,那就没关系,但如果没有,你应该把你的信号扩展到从-1.01.0的范围。许多应用程序和库都使用此约定。

然后,您需要知道正确的目标格式。从你的问题中无法知道这一点。例如,您的目标格式可能是“little endian”字节顺序的16位整数。

要转换值,首先必须将所有输入值除以最大可能(绝对)值。如果您的数据范围为-1.01.0,则此操作为无操作。然后,将这些值乘以目标格式的最大数量。如果您的目标格式是16位整数,那就是2**1532768。实际上,最大的有符号16位整数少一个(因为0也需要存储),即32767,所以你应该使用这个值来避免溢出。结果值已经正确,但它们仍然是浮点值。所以你应该将它们转换为int。最后,您可以将这些整数值转换为bytes,例如使用struct模块。在那里,您必须确保指定正确的format string,例如'<h'为little-endian签名的16位数字。

说了这么多,使用声音I / O库可能会更容易,为您进行必要的转换,例如sounddevice模块。您仍然需要将浮点值缩放到-1.01.0的范围,但其余的可以自动完成。如果您使用NumPy数组,它甚至更简单,但它也适用于普通的Python缓冲区。