Amazon Transcribe Python API: Обработчик событий обрабатывает аудио только после окончания потока

(Не получил ответа в повторном посте AWS, поэтому пытаюсь здесь)

Я отправляю потоковые аудиоданные из браузера в виде блоба через websocket. В бэкенде я использую Django Channels' AsyncWebsocketConsumer для получения данных, затем отправляю их в Amazon Transcribe и пытаюсь ответить браузеру с расшифровкой в режиме почти реального времени.

Я могу отправить транскрипцию для одного блоба, но не могу отправить ее в потоковом режиме. Я вижу, что обработчик события срабатывает только при завершении потока, что навело меня на мысль, что, возможно, я неправильно использую либо asyncio, либо transcribe API.

Что я пробовал до сих пор, кроме кода ниже:

Создан отдельный поток для каждого звукового чанка. Возникает ошибка amazon_transcribe.exceptions.InternalFailureException: Произошла внутренняя ошибка. брошена.

  1. Используется функция asyncio.gather для группировки stream.input_stream.send_audio_event функцию и функцию handler.handle_events. Обработчик не вызывается.
  2. Используется asyncio.create_task(handler.handle_events) для создания неблокирующего задания для обработчика. Обработчик не вызывается и также не ждал 15 секунд. Задача была выполнена немедленно.
stream_client = TranscribeStreamingClient(region="us-west-2")

class AWSTranscriptHandler(TranscriptResultStreamHandler):
    def __init__(self, transcript_result_stream):
        self.channel_layer = get_channel_layer()
        self.channel_name = "test"
        super().__init__(transcript_result_stream)

    async def handle_transcript_event(self, transcript_event: TranscriptEvent):
        results = transcript_event.transcript.results
        for result in results:
            if not (result.is_partial):
                for alt in result.alternatives:
                    await self.channel_layer.send(
                        self.channel_name,
                        {"type": "send_transcript", "message": alt.transcript},
                    )


class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        await self.accept()
        await self.send(
            text_data=json.dumps(
                {"type": "connection_established", "channel_name": self.channel_name}
            )
        )
        self.stream = await stream_client.start_stream_transcription(
            language_code="en-US",
            media_sample_rate_hz=48000,
            media_encoding="ogg-opus",
        )
        self.handler = AWSTranscriptHandler(self.stream.output_stream)

    async def disconnect(self, close_code):
        await self.stream.input_stream.end_stream()

    async def receive(self, text_data=None, bytes_data=None):
        if bytes_data:
            await self.stream.input_stream.send_audio_event(audio_chunk=bytes_data)
            await self.handler.handle_events()

    async def send_transcript(self, event):
        await self.send(
            text_data=json.dumps({"type": "transcript", "message": event["message"]})
        )
Вернуться на верх