Python 语音通信帮助!

0 投票
1 回答
645 浏览
提问于 2025-04-15 23:48

我现在正在尝试用Python写一个语音聊天程序。任何建议和技巧都非常欢迎。

到目前为止,我发现pyAudio是PortAudio的一个封装。我试着玩了一下,成功地把麦克风的输入流播放到了我的扬声器上。当然,这只是原始数据。

但是,我不能直接把原始数据通过网络发送(因为数据量太大了),所以我在寻找一种编码的方法。我在网上搜索时,偶然发现了这个Python的speex封装。看起来太好用了,但相信我,结果并不是这样。

在pyAudio中,你可以设置从音频缓冲区获取数据的块大小,而在链接中的示例代码中,这个大小被设置为320。然后编码后,每个块大约只有40字节的数据,这样的大小我觉得还算可以。现在问题来了。

我启动了一个示例程序,它只是获取输入流,编码这些块,解码后再播放(因为在测试,所以没有发送到网络)。如果我让电脑闲着运行这个程序,它工作得很好,但一旦我做其他事情,比如打开Firefox,音频输入缓冲区就会变得很拥堵!它会不断增长,最后崩溃并给我一个缓冲区溢出的错误。

好吧,我为什么只取320字节的流呢?我可以取1024字节,这样可以减轻缓冲区的压力。但是,如果我给speex 1024字节的数据进行编码/解码,它要么崩溃并说这个数据太大了,要么它编码/解码了,但声音非常嘈杂且“断断续续”,就像只编码了那1024块中的一小部分,剩下的都是静态噪音。所以听起来就像直升机的声音,哈哈。

我做了一些研究,发现speex一次只能处理320字节的数据,宽带模式下是640字节。这是标准吗?我该如何解决这个问题?我应该如何构建我的程序来与speex配合?我可以使用一个中间缓冲区,读取所有可用数据,然后把这些数据分成320字节的块进行编码/解码。但这样会花费更多时间,似乎是个很糟糕的解决方案。

因为据我所知,Python中没有其他编码器可以将音频编码成可以通过网络发送的较小数据包,对吧?我已经搜索了三天了。

另外,还有一个pyMedia库,我不知道它是否适合将音频转换为mp3/ogg格式,用于这种软件。

感谢你提前阅读这些,希望有人能帮我!(:

1 个回答

0

你可以试试霍夫曼编码,这个概念挺有意思的。我不太确定它的速度能有多快,但如果你自己做一个C/C++模块,应该能让它变得更快。

当然,可能已经有一些模块可以完全满足你的需求——我只是没用过,所以对它们的存在一无所知。

撰写回答