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

想象一个像这样的数组:

[-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()将每个数字转换为字节并播放,它只会产生噪音。当我将其转换回浮点数以查看发生了什么时,它的值与原始浮点数不同。

最佳答案

首先,您需要知道值的最大范围。给定您的值,可能是-2000.02000.0,但我不知道,所以我的猜测很可能是错误的。通常,浮点音频信号中的数字范围从-1.01.0。显然,您拥有更大的值(value)。如果有理由,可以,但是如果没有原因,则应该将信号缩放到从-1.01.0的范围。许多应用程序和库都使用此约定。

然后,您需要知道正确的目标格式。从您的问题中无法得知。例如,您的目标格式可能以“little endian”字节顺序为带符号的16位整数。

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

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

关于python - 如何从阵列产生声音信号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39169933/

10-15 23:37