голосовое общение для помощи Python! - PullRequest
0 голосов
/ 10 июня 2010

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

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

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

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 10 июня 2010

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

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

...