Python sounddevice.rec(), dtype = ‘int8’ квантование до нулевой проблемы

#python #signal-processing #multimedia #quantization #python-sounddevice

#python #обработка сигналов #Мультимедиа #квантование #python-sounddevice

Вопрос:

Я пытаюсь построить свой голосовой сигнал с разными dtypes (очевидно, с битами / сэмплами). Итак, я попытался записать свой голос с помощью 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

Комментарии:

1. sd.rec Поддерживает ли вообще 8-битную запись? Большинство аудиоустройств поддерживают только 16-разрядные и выше. Вы пробовали конвертировать в 8-битный вместо записи непосредственно в него? Кроме того, каковы амплитудные и максимальные значения выборки исходного звука? Если это действительно очень тихо, то возможно, что при преобразовании в 8-битный все будет отключено. Хотя это кажется маловероятным.

2. Привет, случайный. Спасибо за немедленный ответ. Я очень новичок в этой области, я раньше не знал, что есть также устройства, которые поддерживают 16-битную и выше выборку. Я не пытался выполнять преобразования, потому что цель упражнения — просто записать и отобразить некоторый голос, но я могу это найти. Когда вы говорите амплитуду исходного звука, вы имеете в виду массив numpy ‘voice’, который хранит значения?. Когда я использую 8 бит, все элементы равны нулю, и они приемлемы ненулевыми при использовании 16 бит. Отключение, возможно, является невозможной причиной, возможно, все дело в несовместимости

3. Да, это то, что я имел в виду; массив, в котором хранятся значения в 16-битном формате, может указывать на то, в чем проблема. значения 16-битного аудио могут варьироваться от -32768 до 32767, тогда как 8-битные значения могут варьироваться от -128 до 127. Если значения на первом графике действительно варьируются от -60 до 60, из 32767, это всего лишь 0,2% от максимальной громкости. Это означает, что если бы вы преобразовали это в 8-битное значение, даже значение 60 было бы преобразовано в 0,46, что округлилось бы до нуля. Таким образом, возможно, что ваша запись слишком тихая. Значения в 16-разрядной версии массива будут подсказкой о том, что может происходить.

4. Случайно я прикрепил первое изображение, показывающее действительно слишком тихий сигнал. Теперь я прикрепляю новый сюжет, где я говорю нормально и очень близко к микрофону. Итак, теперь значения составляют 20 000 из 32 767, что является довольно большим процентом. Я также прилагаю два csv-файла, содержащих голосовые массивы для обоих экспериментов (16-битный и 8-битный)

5. Итак, если вы записываете в 16-битном формате, а затем преобразуете массив в 8-битный, это работает? Вам нужно было бы заранее нормализовать значения, чтобы они были равны 127, но я не понимаю, почему это не было бы проблемой. Вы не объяснили точно, почему вы используете 8 бит или почему вы хотите записывать прямо в этот формат, а не просто конвертировать из 16 в 8 после.

Ответ №1:

Это проблема базовой библиотеки PortAudio и / или используемого хост-API. В зависимости от того, какое устройство из списка устройств выбрано, оно может работать, а может и не работать. Для меня некоторые устройства создают значения мусора, в то время как другие работают нормально. Для меня (в Linux), uint8 кажется, работает лучше, чем int8 .

Если вы хотите, чтобы проблема была исправлена, вы должны создать проблему в https://github.com/PortAudio/portaudio .

Как упоминалось в комментариях, 8-битные сэмплы в любом случае используются редко, что может объяснить, почему они поддерживаются так плохо. Если вы просто хотите поиграть, вероятно, проще всего использовать значение по умолчанию dtype , которое дает вам числа с плавающей запятой в диапазоне от -1.0 до 1.0.