2017-01-09 17 views
8

Я использую pyaudio для записи своего голоса в виде wav-файла. Я использую следующий код:Создание подходящих файлов WAV для Google Speech API

def voice_recorder(): 
    FORMAT = pyaudio.paInt16 
    CHANNELS = 2 
    RATE = 22050 
    CHUNK = 1024 
    RECORD_SECONDS = 4 
    WAVE_OUTPUT_FILENAME = "first.wav" 

    audio = pyaudio.PyAudio() 

    # start Recording 
    stream = audio.open(format=FORMAT, channels=CHANNELS, 
        rate=RATE, input=True, 
        frames_per_buffer=CHUNK) 
    print "konusun..." 
    frames = [] 

    for i in range(0, int(RATE/CHUNK * RECORD_SECONDS)): 
     data = stream.read(CHUNK) 
     frames.append(data) 
    #print "finished recording" 


    # stop Recording 
    stream.stop_stream() 
    stream.close() 
    audio.terminate() 

    waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb') 
    waveFile.setnchannels(CHANNELS) 
    waveFile.setsampwidth(audio.get_sample_size(FORMAT)) 
    waveFile.setframerate(RATE) 
    waveFile.writeframes(b''.join(frames)) 
    waveFile.close() 

Я использую следующий код для Google Speech API, который в основном преобразует речь в файл WAV в текст: https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/speech/api-client/transcribe.py

Когда я пытаюсь импортировать файл WAV, который генерируется pyaudio в коде Google, я получаю следующее сообщение об ошибке:

googleapiclient.errors.HttpError: <HttpError 400 when requesting https://speech.googleapis.com/v1beta1/speech:syncrecognize?alt=json returned "Invalid Configuration, Does not match Wav File Header. 
Wav Header Contents: 
Encoding: LINEAR16 
Channels: 2 
Sample Rate: 22050. 
Request Contents: 
Encoding: linear16 
Channels: 1 
Sample Rate: 22050."> 

Я использую следующий обходной путь для этого: я преобразования файлов WAV в MP3 с FFmpeg, после того, как потом я преобразование MP3-файл снова wav с sox:

def wav_to_mp3(): 
    FNULL = open(os.devnull, 'w') 
    subprocess.call(['ffmpeg', '-i', 'first.wav', '-ac', '1', '-ab', '6400', '-ar', '16000', 'second.mp3', '-y'], stdout=FNULL, stderr=subprocess.STDOUT) 

def mp3_to_wav(): 
    subprocess.call(['sox', 'second.mp3', '-r', '16000', 'son.wav']) 

API Google работает с данным WAV, но поскольку качество слишком сильно ухудшается, оно не работает хорошо.

Итак, как я могу создать совместимый с Google файл WAV с помощью pyaudio на первом шаге?

ответ

4

Преобразование файлов WAV в FLAC файл с avconv и отправить его в Google Speech API решена проблема

subprocess.call(['avconv', '-i', 'first.wav', '-y', '-ar', '48000', '-ac', '1', 'last.flac'])