如何将Wav音频字符串直接转换为Ogg文件(无需磁盘IO)
无需磁盘IO直接将audioString转换为Ogg格式的实现方案
可以完全在内存中完成格式转换,避免磁盘IO操作,以下是两种可靠的实现方式:
方案一:使用Pydub处理内存音频流
Pydub基于FFmpeg,支持从字节流加载音频,直接在内存中转码为Ogg格式。
依赖安装
sudo apt-get install ffmpeg pip install pydub
代码实现
import base64 from pydub import AudioSegment from io import BytesIO # 获取API返回的audioString并解码 audioString = response.json()['audio'][0]['audioContent'] wav_bytes = base64.b64decode(audioString) # 将WAV字节数据加载到内存流 wav_io = BytesIO(wav_bytes) audio_segment = AudioSegment.from_file(wav_io, format="wav") # 直接将音频导出为Ogg格式到内存流 ogg_io = BytesIO() audio_segment.export(ogg_io, format="ogg", codec="libvorbis") # 获取最终的Ogg字节数据,可直接传入消息系统 ogg_audio = ogg_io.getvalue()
方案二:使用ffmpeg-python直接操作内存流
如果需要更底层的控制,可通过ffmpeg-python的管道功能完成内存中转码。
依赖安装
sudo apt-get install ffmpeg pip install ffmpeg-python
代码实现
import base64 import ffmpeg from io import BytesIO # 解码得到WAV字节数据 audioString = response.json()['audio'][0]['audioContent'] wav_bytes = base64.b64decode(audioString) # 通过ffmpeg管道完成格式转换 stdout, stderr = ( ffmpeg .input('pipe:', format='wav') .output('pipe:', format='ogg', codec='libvorbis') .run(input=wav_bytes, capture_stdout=True, capture_stderr=True) ) # stdout即为Ogg格式的音频字节数据 ogg_audio = stdout
关于Torchaudio的修复方案
你之前尝试Torchaudio失败,可能是未正确使用流式加载,以下是可行的内存转码方式:
import base64 import torchaudio from io import BytesIO # 解码WAV字节数据 wav_bytes = base64.b64decode(audioString) # 从内存流加载音频 stream_reader = torchaudio.io.StreamReader(BytesIO(wav_bytes)) stream_reader.add_basic_audio_stream() waveform, sample_rate = stream_reader.pop_stream() # 将音频保存为Ogg到内存流 ogg_io = BytesIO() torchaudio.save(ogg_io, waveform, sample_rate, format='ogg') ogg_audio = ogg_io.getvalue()
注意:需确保Torchaudio版本≥0.12.0,且系统FFmpeg支持Ogg编码。
内容的提问来源于stack exchange,提问作者Saurabh Kumar Karn
相关产品推荐
相关产品推荐

