Передача аудио-чанков в опцию асинхронной транскрипции Google - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь передать аудиоблоки, полученные с помощью chunks.get(in_data) из функции обратного вызова PyAudio, в Асинхронная запись Google Speech .

Кроме того, я использую модуль Python multiprocessing для обработкиэти куски один за другим, используя Threadpool с одним рабочим:

pool = ThreadPool(processes=1, initializer=initGoogleCloud, initargs=(audio_rate, credentials_json, lang_code, asr_narrowband, preferred_phrases, show_all))  
async_result = pool.apply_async(GoogleCloud, (self.detect_chunk_buffer.get()))
return_text = async_result.get()
def initGoogleCloud(SAMPLERATE, credentials_json, lang_code, is_narrowband, preferred_phrases, show_all):
    assert isinstance(lang_code, str), "lang_code must be a string."
    try:
        from google.cloud import speech
        from google.cloud.speech import enums
        from google.cloud.speech import types
        from google.oauth2 import service_account
    except ImportError:
        print('google.cloud failed to import.')

    if is_narrowband is True:
        use_enhanced = True
        model = 'phone_call'
    else:
        use_enhanced = False
        model = 'default'

    # Configurations for Google Cloud
    with open('tmp_credentials.json', 'w') as fp:
        json.dump(credentials_json, fp)
    google_credentials = service_account.Credentials.from_service_account_file('tmp_credentials.json')

    client = speech.SpeechClient(credentials=google_credentials)
    config = types.RecognitionConfig(
        encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,
        sample_rate_hertz=SAMPLERATE,
        language_code=lang_code,
        use_enhanced=use_enhanced,
        model=model)
    streaming_config = types.StreamingRecognitionConfig(config=config, interim_results=True)

def GoogleCloud(audio_chunk):
    byte_chunk = b''.join(audio_chunk)
    audio = types.RecognitionAudio(byte_chunk)
    operation = client.long_running_recognize(config, audio)

    #Waiting for operation to complete...
    response = operation.result(timeout=90)

    # Processing response
    return listen_print_loop(responses)

Вывод: TypeError: GoogleCloud () принимает 1 позиционный аргумент, но 2048 получили прерывание прерывания: 6

Кажется, что chunk.get() извлекает всю аудиопоследовательность в качестве аргумента.Есть ли способ передать один чанк в очередь для обработки?

Мой формат PyAudio pyaudio.paInt16.

1 Ответ

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

Чтобы "упаковать" аудиоблок в аргумент, я изменил async_result = pool.apply_async(GoogleCloud, (self.detect_chunk_buffer.get()))

Для audio_chunk = [self.detect_chunk_buffer.get()], который упаковывает его в список перед отправкой в ​​качестве аргумента async_result = pool.apply_async(rttASR.GoogleCloud, args=(audio_chunk)).

Это работает и похоже на мой self.detect_chunk_buffer.get() (содержащий аудио-блок paInt16 из обратного вызова PyAudio in_data) не требует дополнительной кодировки base64.

...