gpt4 book ai didi

python - 即时将 GSM 编解码器音频从网络传输到扬声器

转载 作者:行者123 更新时间:2023-12-03 01:26:57 24 4
gpt4 key购买 nike

我在 python 中做一个 VoIP 软件,我尝试重新创建一个特定的业余 radio 程序协议(protocol),它使用 GSM 音频编解码器。
由于python没有简单的方法来播放gsm文件,但是我设法至少用它转换了一个文件,所以我知道这是可能的。

我使用网络流中的 myfile.write(data3) 在硬盘驱动器上写入 .gsm 文件。
然后我使用 pysoundfile 将其转换为 wav 文件

data, samplerate = sf.read('temppi.gsm')
sf.write('temppi.wav', data, samplerate)

在我可以用pyaudio播放之后。它提供了巨大的延迟,它需要在音频包进入后才运行..

我的问题是如何直接使用声音文件从流中播放文件?我试图搜索谷歌只是关于转换文件,有没有办法直接播放它?任何建议我能做什么。谢谢,新年快乐:)

编辑:
现在我有它在飞行,但这很糟糕..它做了很多分 block 的声音
here we start thread aaniulos

if ekabitti == b'\x01':
dataaa = self.socket.recv(198)
data3 = io.BytesIO(bytes(dataaa))

while True:
global aani
#global data3
if aani:
print ('Ääni saije lopetetaan..')
break
data, samplerate = sf.read(io.BytesIO(bytes(data3.getbuffer())), format = 'RAW', channels = 1, samplerate=8000, dtype ='int16', subtype='GSM610', endian ='FILE')
virtuaalifilu = io.BytesIO()
sf.write (virtuaalifilu, data, 8000, format='wav', subtype= 'PCM_16')
sound_file = io.BytesIO(bytes(virtuaalifilu.getbuffer()))
print ('striimataan ääntä nyt kaijuttimiin!!!')

stream.stop_stream()
stream.close()
return

最佳答案

由于您省略了很多细节,我只能猜测您的实现是如何工作的。听起来你做的不对。我的猜测是,您遇到的巨大延迟是因为您在每个数据包中发送了太多音频,甚至可能是整个音频文件?要实现低延迟的音频流,您基本上需要遵循这个粗略的方案:

在发件人处:

  • 将音频录制到缓冲区。
  • 将缓冲区连续切片为预定义长度的 block ,例如20 毫秒。
  • 使用合适的音频编解码器对每个 block 进行编码,例如全局通。
  • 将数据包中的每个 block 发送到接收器,最好使用基于数据报的协议(protocol),如 UDP。

  • 在接收方:
  • 可用时从网络读取数据包。
  • 将每个数据包解码为原始音频数据并将其放入音频缓冲区。
  • 连续播放音频缓冲区中的音频。

  • 如果使用 UDP 作为传输协议(protocol),您还需要处理数据包丢失和乱序数据包。根据延迟要求,您可能还可以使用(或至少尝试)TCP 来发送每个音频 block 。

    实现连续录音和播放 sounddevice 似乎是一个不错的选择。如需录音,请查看 InputStreamRawInputStream .如需回放,请查看 OutputStreamRawOutputStream .

    可能仍然可以使用 SoundFile从 GSM 编解码器转换为原始音频,但您需要为每个 block 执行此操作。并且 block 必须非常小,例如20 毫秒。

    关于python - 即时将 GSM 编解码器音频从网络传输到扬声器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59534697/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com