Присоединение файлов .wav без записи на диск в Python - PullRequest
0 голосов
/ 24 мая 2018

У меня есть список файлов .wav в двоичном формате (они поступают из веб-сокета), которые я хочу объединить в один двоичный файл .wav, чтобы затем выполнить распознавание речи с ним.Я смог заставить его работать со следующим кодом:

audio = [binary_wav1, binary_wav2,..., binary_wavN] # a list of .wav binary files coming from a socket
audio = [io.BytesIO(x) for x in audio]

# Join wav files
with wave.open('/tmp/input.wav', 'wb') as temp_input:
    params_set = False
    for audio_file in audio:
        with wave.open(audio_file, 'rb') as w:
            if not params_set:
                temp_input.setparams(w.getparams())
                params_set = True
            temp_input.writeframes(w.readframes(w.getnframes()))

# Do speech recognition
binary_audio = open('/tmp/input.wav', 'rb').read())
ASR(binary_audio)

Проблема в том, что я не хочу записывать файл '/tmp/input.wav' на диск.Есть ли способ сделать это без записи какого-либо файла на диск?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Общее решение для файла, но никогда не помещать его на диск - это поток.Для этого мы используем библиотеку io, которая является библиотекой по умолчанию для работы с потоками в памяти.Кажется, вы даже уже использовали BytesIO ранее в своем коде.

audio = [binary_wav1, binary_wav2,..., binary_wavN] # a list of .wav binary files coming from a socket
audio = [io.BytesIO(x) for x in audio]

# Join wav files

params_set = False
temp_file = io.BytesIO()
with wave.open(temp_file, 'wb') as temp_input:
    for audio_file in audio:
        with wave.open(audio_file, 'rb') as w:
            if not params_set:
                temp_input.setparams(w.getparams())
                params_set = True
            temp_input.writeframes(w.readframes(w.getnframes()))

#move the cursor back to the beginning of the "file"
temp_file.seek(0)
# Do speech recognition
binary_audio = temp_file.read()
ASR(binary_audio)

note У меня нет файлов .wav, чтобы попробовать это.Библиотека wave должна правильно обрабатывать разницу между реальными файлами и буферизованными потоками.

0 голосов
/ 24 мая 2018

С помощью scipy и numpy вы можете читать файлы wav как массивы numpy, а затем вносить необходимые изменения.

from scipy.io import wavfile
import numpy as np

# load files
_, arr1 = wavfile.read('song.wav')
_, arr2 = wavfile.read('Aaron_Copland-Quiet_City.wav')

print(arr1.shape)
print(arr2.shape)

>>> (1323001,)
>>> (1323000,)

# make new array by concatenating two audio waves
new_arr = np.hstack((arr1, arr2))
print(new_arr.shape)

>>> (2646001,)

# save new audio wave
wavfile.write('new_audio.wav')
...