#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.