我目前正在尝试用python编写语音聊天程序。欢迎使用所有提示/技巧。
到目前为止,我发现pyaudio是portaudio的包装。所以我到处玩,从我的麦克风得到一个输入流,回放到我的扬声器。当然只有生的。
但是我不能通过网络发送原始数据(由于大小是duh),所以我正在寻找一种编码方法。我在网上搜索,然后绊倒了
this speex-wrapper
用于Python。这似乎是真的,相信我,是真的。
在pyaudio中,您可以设置要从输入音频缓冲区中提取的块的大小,在链接上的示例代码中,它被设置为320。然后,当它被编码时,每一块大约有40字节的数据,我想这是可以接受的。现在来解决这个问题。
我启动了一个示例程序,它只获取输入流,对块进行编码,对它们进行解码并播放它们(而不是通过网络发送测试)。如果我只是让我的电脑闲置并运行这个程序,它会很好地工作,但是一旦我做了一些事情,比如启动火狐或者其他什么,音频输入缓冲区就会被阻塞!它只是增长,然后所有的崩溃,并在缓冲区上给我一个溢出错误。
好吧,那我为什么只取流的320字节呢?我可以只取1024字节或者其他一些字节,这样可以减轻缓冲区的压力。但是。如果我给speex 1024字节的数据进行编码/解码,它要么崩溃,并说这对它的缓冲区来说太大了。或者它对其进行编码/解码,但声音非常嘈杂且“起伏”,就好像它只编码了1024个块中的一小部分,其余的就是静态噪声。听起来像直升机的声音,哈哈。
我做了一些研究,似乎speex在当时只能转换320字节的数据,而宽带只能转换640字节。但这是标准?
我如何解决这个问题?我应该如何构建我的程序来与speex一起工作?我可以使用一个中间缓冲区tho,它从缓冲区中读取所有可用的数据,然后将这些数据分成320位进行编码/解码。但这需要更长的时间,似乎是一个非常糟糕的问题解决方案。
因为据我所知,没有其他针对python的编码器可以对音频进行编码,使其可以通过网络以可接受的小软件包发送,或者?我已经咕噜了三天了。
还有这个pymedia库,我不知道对于这种软件转换为mp3/ogg是否有好处。
提前感谢您阅读本书,希望有人能帮助我!(: