【问题标题】:voice communication for python help!python帮助的语音通信!
【发布时间】:2010-06-10 20:44:49
【问题描述】:

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: python networking tcp voip speex


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 2015-06-03
      • 2021-01-10
      • 2011-01-17
      相关资源
      最近更新 更多