pcm -> ogg
kudep opened this issue · 4 comments
Есть ли у вас пример на питоне для потокового распознования (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 из полученных данных.
Да, все правильно. В примере используется внешний файл, данные которого уже находятся в контейнере 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 пока ничего у меня нет.
Добрый день!
У нас есть поддержка 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()
Спасибо большое, помогли, проблема решена