0

我目前正在尝试用 python 编写语音聊天程序。欢迎所有提示/技巧来做到这一点。

到目前为止,我发现 pyAudio 是 PortAudio 的包装器。所以我玩弄了它,并从我的麦克风获得了一个输入流,以回放到我的扬声器。当然只有RAW。

但是我不能通过网络发送 RAW 数据(由于大小 duh),所以我正在寻找一种对其进行编码的方法。我在网上搜索并偶然发现了这个用于 python的 speex-wrapper 。这似乎是真的,相信我,确实如此。

您在 pyAudio 中看到,您可以设置要从输入音频缓冲区中获取的块的大小,在链接上的示例代码中,它设置为 320。然后当它被编码时,每个块大约 40 个字节的数据,我猜这是可以接受的。现在解决问题。

我启动了一个示例程序,它只获取输入流,对块进行编码,解码并播放它们(由于测试不通过网络发送)。如果我只是让我的计算机空闲并运行这个程序,它会很好用,但是一旦我做某事,即启动 Firefox 或其他东西,音频输入缓冲区就会全部堵塞!它只是增长然后它全部崩溃并在缓冲区上给我一个溢出错误..

好的,那为什么我只占用 320 字节的流?我可以只占用 1024 字节之类的东西,这样可以减轻缓冲区的压力。但。如果我给 speex 1024 字节的数据进行编码/解码,它要么崩溃,要么说那对于它的缓冲区来说太大了。或者它对其进行编码/解码,但声音非常嘈杂且“断断续续”,就好像它只编码了 1024 块的一小部分,其余的是静态噪声。所以声音听起来像直升机,哈哈。

我做了一些研究,似乎 speex 一次只能转换 320 字节的数据,而且宽带可以转换 640 字节。但这是标准吗?我该如何解决这个问题?我应该如何构建我的程序以使用 speex?我可以使用一个中间缓冲区,它将所有可用数据从缓冲区中读取,然后将其分成 320 位并对其进行编码/解码。但这需要更长的时间,而且似乎是一个非常糟糕的问题解决方案。

因为据我所知,没有其他 Python 编码器可以对音频进行编码,因此它可以通过网络以可接受的小包发送,或者?我已经在谷歌上搜索了三天。

还有这个pyMedia库,我不知道这种软件转换成mp3/ogg是否好。

在此先感谢您阅读本文,希望任何人都可以帮助我!(:

4

1 回答 1

0

您可以尝试Huffman encoding,这是一个非常简洁的概念。我不知道你能做到多快,但我敢肯定,如果你创建了自己的C/ C++模块,你可以让它更快。

当然,可能已经有一些模块可以完全满足您的需求——我只是从未使用过它们,所以我完全不知道它们的存在。

于 2010-06-10T12:44:49.710 回答