我正在尝试在python中编写一个语音聊天程序。欢迎所有提示/技巧。
到目前为止,我发现pyAudio是PortAudio的包装器。所以我玩了一下,从我的麦克风输入一个输入流,播放到我的扬声器。当然只有RAW。
但我不能通过netowrk发送RAW数据(由于大小duh),所以我正在寻找一种编码方式。我搜索了网络,偶然发现this speex-wrapper蟒蛇。这似乎是好的,相信我,它是。
您可以在pyAudio中看到,您可以设置要从输入音频缓冲区获取的块的大小,并在链接上的示例代码中,将其设置为320.然后,当它被编码时,它就像~40字节的数据每块,我猜这是相当可以接受的。现在解决这个问题。
我启动了一个示例程序,它只接受输入流,对块进行编码,对它们进行解码并播放它们(不通过网络进行测试)。如果我只是让我的电脑闲置并运行这个程序它运行得很好,但是一旦我做了什么,即启动Firefox或其他东西,音频输入缓冲区就会全部堵塞!它只是增长然后全部崩溃并在缓冲区上给我一个溢出错误..
好的,为什么我只拿320字节的流?我可以采取1024字节或其他东西,这将很容易对缓冲区施加压力。但。如果我给spext 1024字节的数据进行编码/解码,它会崩溃并说它对于它的缓冲区来说太大了。或者它对它进行编码/解码,但是声音非常嘈杂并且“波涛汹涌”,好像它只编码了1024块的一小部分,其余的是静态噪声。所以声音听起来就像一架直升机,哈哈。
我做了一些研究,似乎speex只能在时间转换320字节的数据,而且640转换为宽带。但这是标准吗? 我该如何解决这个问题?我应该如何构建我的程序来使用speex?我可以使用一个中间缓冲区,它从缓冲区中读取所有可用数据,然后将其以320位进行块化并对它们进行编码/解码。但这需要更长的时间,似乎是问题的一个非常糟糕的解决方案..
因为据我所知,没有其他编码音频的python编码器可以通过网络以可接受的小包发送,或者?我现在一直在谷歌上搜索三天了。
还有这个pyMedia库,我不知道它是否适合转换为mp3 / ogg这种软件。
提前感谢您阅读本文,希望有人可以帮助我! (:
答案 0 :(得分:0)
你可以尝试Huffman encoding,这是一个非常简洁的概念。我不知道你能做多快,但我确定你是否创建了自己的C/ C++模块,你可以让它更快。
当然,可能已经有一些模块可以完全满足您的需求 - 我从未使用它们,所以我完全没有意识到它们的存在。