Я пытаюсь передать аудиоблоки, полученные с помощью 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
.