голосовая связь для python help!

В настоящее время я пытаюсь написать программу голосового чата на python. Все советы / приемы приветствуются, чтобы сделать это.

До сих пор я обнаружил, что pyAudio является оболочкой PortAudio. Поэтому я поэкспериментировал с этим и получил входной поток с моего микрофона для воспроизведения на моих динамиках. Только RAW конечно.

Но я не могу отправить RAW-данные по сети (из-за размера), поэтому я ищу способ их закодировать. И я искал в сети и наткнулся на эту speex-обертку для питона. Кажется, это хорошо, чтобы быть правдой, и поверьте мне, так оно и было.

Вы видите, что в pyAudio вы можете установить размер фрагментов, которые вы хотите взять из вашего входного аудиобуфера, и в этом примере кода по ссылке он установлен на 320. Затем, когда он закодирован, это примерно ~ 40 байт данных на фрагмент, что вполне приемлемо, я думаю. А теперь о проблеме.

Я запускаю пример программы, которая просто берет входной поток, кодирует фрагменты, декодирует их и воспроизводит (без отправки по сети для проверки). Если я просто позволяю своему компьютеру бездействовать и запускаю эту программу, она отлично работает, но как только я что-то делаю, то есть запускаю Firefox или что-то в этом роде, буфер аудиовхода забивается! Он просто растет, а потом все вылетает и выдает ошибку переполнения буфера..

Хорошо, так почему я просто беру 320 байт потока? Я мог бы просто взять 1024 байта или около того, и это уменьшит нагрузку на буфер. НО. Если я даю Speex 1024 байта данных для кодирования/декодирования, он либо падает, либо говорит, что это слишком много для его буфера. ИЛИ он кодирует / декодирует его, но звук очень шумный и «прерывистый», как будто он закодировал только крошечный бит из этого фрагмента 1024, а остальное - статический шум. Так звук звучит как вертолет, лол.

Я провел некоторое исследование, и кажется, что Speex может конвертировать только 320 байт данных за раз, ну и 640 для широкополосного доступа. Но это стандарт? Как я могу решить эту проблему? Как я должен построить свою программу для работы со speex? Я мог бы использовать средний буфер, который берет все доступные данные для чтения из буфера, затем разбивает их на 320 бит и кодирует/декодирует их. Но это занимает немного больше времени и кажется очень плохим решением проблемы.

Потому что, насколько я знаю, нет другого кодировщика для Python, который кодирует звук, чтобы его можно было отправлять по сети в приемлемых небольших пакетах, или? Я гуглю уже три дня.

Также есть эта библиотека pyMedia, я не знаю, хорошо ли ее конвертировать в mp3/ogg для такого программного обеспечения.

Заранее благодарю за прочтение этого, надеюсь, кто-нибудь может мне помочь! (:


person Eric    schedule 10.06.2010    source источник


Ответы (1)


Вы можете попробовать кодирование Хаффмана, это довольно изящная концепция. Я не знаю, насколько быстро вы могли бы это сделать, но я уверен, если бы вы создали свой собственный C /C++, вы можете сделать его намного быстрее.

Конечно, могут быть уже какие-то модули, которые делают именно то, что вам нужно — я просто никогда ими не пользовался, поэтому совершенно не знаю об их существовании.

person Wayne Werner    schedule 10.06.2010