【发布时间】:2022-01-12 19:47:31
【问题描述】:
我正在尝试使用不同的 dtype(显然是位/样本)绘制我的语音信号。所以我试图用 dtype = 'int16' 来捕捉我的声音,情节很有意义。但是我尝试使用 dtype = 'int8' 以相同的音量说话,而我的情节是零线。
为什么会这样?
想到的一个想法是,8 位的量化器可能有更大的死区,因此对于相同的输入语音电平,量化器将值降低到 0。当然,我对量化器的类型做了一个假设。我还没有看到量化器是否是统一的死区。
下面是我的代码和我的情节
import matplotlib.pyplot as plt
import numpy as np
import sounddevice as sd
Fs = 8000 # Sampling frequency
duration = 5 # Recording duration in seconds
voice = sd.rec(frames=duration * Fs, samplerate=Fs, channels=1, dtype='int16') # Capture the voice
# frames indicate indirectly the duration of record, dtype is 16 bits per sample.
sd.wait() # close after recording finish
time = np.linspace(0, len(voice - 1) / Fs, len(voice - 1)) # split x axis in voice-1 points
print(voice) # points have 1/Fs distance each other
plt.plot(time, voice) # plot in seconds
plt.title("Voice Signal")
plt.xlabel("Time [seconds]")
plt.ylabel("Voice amplitude")
plt.show()
这是我的语音数组 https://www.mediafire.com/file/7bbfbz0jltszmb6/16bit.csv/file https://www.mediafire.com/file/k627wmbeayutc20/8bit.csv/file
【问题讨论】:
-
sd.rec是否支持 8 位录制?大多数音频设备仅支持 16 位及以上。您是否尝试过转换为 8 位而不是直接在其中录制?另外,原始音频的幅度和最大样本值是多少?如果它真的很安静,那么当转换为 8 位时,所有内容都可能会被切断。不过似乎不太可能。 -
你好随机。感谢您的即时回复。我对这个领域非常陌生,之前我不知道支持16位及以上采样的设备。我没有尝试进行转换,因为练习的目的只是记录和绘制一些声音,但我能够搜索到这个。当您说原始音频的幅度时,您是指存储值的 numpy 数组“语音”吗?当我使用 8 位时,所有元素都为零,并且使用 16 位它们是可接受的非零。中断可能是不可能的原因,也许是不兼容
-
是的,我就是这个意思;以 16 位存储值的数组可能表明问题所在。 16 位音频的值可以从 -32768 到 32767,而 8 位的值可以从 -128 到 127。如果第一个图中的值真的从 -60 到 60,在 32767 中,那只有 0.2%的最大音量。这意味着如果您要将其转换为 8 位,即使是 60 的值也会被转换为 0.46,它会被四舍五入为零。因此,您的录音可能太安静了。数组的 16 位版本中的值将作为可能发生的事情的线索。
-
不小心附上了第一张图片,显示的信号真的太安静了。我现在附上一个新的情节,我说话正常并且非常靠近麦克风。所以现在值是 32,767 中的 20,000,这是一个相当大的百分比。我还附上了两个包含两个实验(16 位和 8 位)的语音数组的 csv 文件
-
好的,如果您以 16 位记录,然后将数组转换为 8 位,这样行吗?您必须事先将值标准化为 127,但我不明白为什么这不是问题。您还没有准确解释为什么要使用 8 位,或者为什么要直接录制为该格式,而不是在之后从 16 转换为 8。
标签: python signal-processing multimedia quantization python-sounddevice