Голосовое общение для помощи Python!
В настоящее время я пытаюсь написать программу Voicechat на 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 ответ
Вы можете попробовать кодирование Хаффмана, это довольно изящная концепция. Я не знаю, как быстро вы могли бы это сделать, но я уверен, что если бы вы создали свой собственный модуль C / C++, вы могли бы сделать это намного быстрее.
Конечно, могут быть уже некоторые модули, которые делают именно то, что вам нужно - я просто никогда не использовал их, поэтому я совершенно не знаю об их существовании.