yandex-cloud/cloudapi

pcm -> ogg

kudep opened this issue · 4 comments

kudep commented

Есть ли у вас пример на питоне для потокового распознования (https://github.com/yandex-cloud/docs/blob/master/ru/speechkit/stt/streaming.md), который включает перекодирование из pcm в opus и оборачивание в контейнер ogg, но без использования внешних файлов/файловой системы. В вашем примере, показано с использованием внешнего файла https://github.com/yandex-cloud/docs/blob/master/ru/speechkit/stt/streaming.md#%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B-examples .

Я правильно понимаю, что вопрос именно в использовании/не использовании внешних файлов как источника распознавания?

В примере, что вы указали, файл используется только из соображений удобства, в нём не важно, откуда берутся данные:

    # Прочитать аудиофайл и отправить его содержимое порциями.
    with open(audio_file_name, 'rb') as f:
        data = f.read(CHUNK_SIZE)
        while data != b'':
            yield stt_service_pb2.StreamingRecognitionRequest(audio_content=data)
            data = f.read(CHUNK_SIZE)

Так, например, куски data можно получать любым необходимым вам способом. Ключевое это формирование StreamingRecognitionRequest из полученных данных.

kudep commented

Да, все правильно. В примере используется внешний файл, данные которого уже находятся в контейнере ogg. Такой файл легко можно сделать с помощью

import soundfile as sf
sf.write("/tmp/123.ogg", pcm_buffer, 16000, format="OGG")

Но вовремя потоковой передачи аудио сигнала в формате pcm, кажется не правильным использовать промежуточное сохранение в файл. Значит нужно переводить pcm в opus + ogg походу. Мои поиски готового решения ничего особо полезного не дали, хотел уточнить есть ли у вас возможно какие-то примеры. Я сейчас использую напрямую LINEAR16_PCM но упираюсь в пропускную способность канала передачи данных.

Вообщем, ищу готовое решение для конвертации из pcm в opus + ogg со всеми заголовками контейнера и т.п.
Для конвертации в opus сейчас использую https://github.com/OnBeep/opuslib , но вот по ogg пока ничего у меня нет.

e11ni commented

Добрый день!
У нас есть поддержка LPCM 16bit signed, с SampleRate = 8000/16000/48000, если у вас один из этих форматов вы можете использовать Yandex Speechkit без конвертации в ogg opus.
Примера с перекодированием, к сожалению, нет.
В документации soundfile пишут что write принимает на вход либо имя файла либо python file объект:

        file : str or int or file-like object
            The file to open.  This can be a file name, a file
            descriptor or a Python file object (or a similar object with
            the methods ``read()``/``readinto()``, ``write()``,
            ``seek()`` and ``tell()``).

то есть можно сделать, например, так:

import io
f = io.BytesIO()
sf.write(f, pcm_buffer, 16000, format="OGG")

data = f.getbuffer()
kudep commented

Спасибо большое, помогли, проблема решена