【问题标题】:Python sounddevice.rec(), dtype ='int8' quantizes to zero problemPython sounddevice.rec(), dtype ='int8' 量化为零问题
【发布时间】: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


【解决方案1】:

这是底层 PortAudio 库和/或所使用的主机 API 的问题。 根据从设备列表中选择的设备,它可能工作也可能不工作。 对我来说,一些设备会产生垃圾值,而另一些则可以正常工作。 对我来说(在 Linux 上),uint8 似乎比 int8 工作得更好。

如果你想解决问题,你应该在https://github.com/PortAudio/portaudio创建一个问题。

正如 cmets 中提到的,8 位样本无论如何都很少使用,这可能解释了为什么它们的支持如此糟糕。 如果您只是想玩玩,使用默认的dtype 可能是最简单的方法,它为您提供范围从-1.0 到1.0 的浮点数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 2021-07-03
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2020-01-10
    相关资源
    最近更新 更多