Пяудио В.С. Арекорд.Интерполяция между аудиоданными, записанными этими двумя методами? - PullRequest
0 голосов
/ 14 мая 2019

Ранее я записывал данные с помощью сценария pyaudio и строил вокруг них модель логистической регрессии.Модель работала хорошо.Недавно я начал использовать команду arecord для записи аудиофайлов, а остальная часть конвейера осталась прежней.Но модель запустила с ошибкой в этих вновь записанных аудиофайлах.Примечания:

1) Частота дискретизации одинакова для обоих случаев.

2) Pyaudio представляет данные в INT, тогда как arecord представляет данные в формате FLOAT.

3) Сценарии pyaudio определяют FORMAT как pyaudio.paFloat32, но когда я сохраняю его с помощью wavfile, он представляет аудиоданные в INT.Это не проблема, но заявить, что я знаю об этом.(Пример приведен ниже)

4) Приведенный ниже скрипт pyaudio не будет работать без некоторых модификаций.Это просто, чтобы показать, как я использую pyaudio для записи аудио.

Чтение аудиофайлов через scipy.io показывает, что они представляют аудиоданные очень по-разному ,

Pyaudio: [-1133117440 -1130037248 -1130004480 ... 1004470272 -1178599424 -1136001024] арекорд: [0.00079346 -0.00039673 -0.00579834 ... -0.0017395 -0.00161743 -0.00131226 * *1009*пока не найдено каких-либо простых методов интерполяции для преобразования формата аудиоданных, записанных с помощью Arecord, в формат представления данных, записанных с помощью pyaudio.

Pyaudio Script:

CHANNELS = 1
RATE = 44100
CHUNKS = RATE
RECORD_SECONDS = 86400

audio = pyaudio.PyAudio()
FORMAT = pyaudio.paFloat32
stream = audio.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True,frames_per_buffer=CHUNK, input_device_index=4)
duration = int(RATE / CHUNK * RECORD_SECONDS)
i = 0
while(i <= duration):
    data = stream.read(CHUNK, exception_on_overflow=False)
    if(len(data) >= CHUNK):
        self.queue.put(data)
        i = i + 1
stream.stop_stream()
stream.close()
audio.terminate()

data = self.queue.get()
FORMAT = pyaudio.paFloat32
audio = pyaudio.PyAudio()
filename = "example.wav"
waveFile = wave.open(filename, 'wb')
waveFile.setnchannels(CHANNELS)
waveFile.setsampwidth(audio.get_sample_size(FORMAT))
waveFile.setframerate(RATE)
waveFile.writeframes(b''.join(data))
waveFile.close()

Команда ARECORD:

arecord --max-file-time 3600 -f FLOAT_LE -c 1 -r 44100 -t wav -D plughw:1,0 -V mono -i --use-strftime /wav_path/wav_filename
...