使用edge_tts进行语音转换,保存的wav格式只有chunk['data'],虽然可以播放,但是不是标准的wave格式,尝试这转成wave格式确无法播放;
使用在线网站进行转换可以成功(单通道,双字节,44100Hz),网站地址:
https://convertio.co/zh/
下面是我的python代码,以及转换前后的文件;
import asyncio
import struct
import edge_tts
import wave
from pydub import AudioSegment
import io
OUTPUT_FILE = "output.wav"
SAMPLE_RATE = 44100
CHANNELS = 1
SAMPLE_WIDTH = 2 # 16-bit audio
TEXT = "这里是语音流测试"
VOICE = "Microsoft Server Speech Text to Speech Voice (zh-CN, XiaoxiaoNeural)"
# 根据实际需求进行采样和格式化处理的函数
def process_audio_data(audio_data):
# 在这里进行采样和格式化处理,确保输出的数据符合 WAV 文件要求
# 这可能包括改变采样率、通道数、采样精度等操作
processed_data = audio_data
return processed_data
async def _main() -> None:
communicate = edge_tts.Communicate(TEXT, VOICE)
# 创建 WAV 文件并写入音频数据
with wave.open(OUTPUT_FILE, "wb") as wav_file:
wav_file.setnchannels(CHANNELS)
wav_file.setsampwidth(SAMPLE_WIDTH)
wav_file.setframerate(SAMPLE_RATE)
async for chunk in communicate.stream():
if chunk["type"] == "audio":
audio_data = chunk["data"]
# 通过 BytesIO 将音频数据转换为文件对象
audio_file = io.BytesIO(audio_data)
# 使用 AudioSegment 加载音频文件
audio_segment = AudioSegment.from_file(audio_file, format="raw", frame_rate=44100, channels=1,
sample_width=2)
# 保存为 WAV 格式的文件
output_file = "outputAudioSegment.wav"
audio_segment.export(output_file, format="wav")
# 采样和格式化处理
processed_data = process_audio_data(audio_data)
# 将处理后的音频数据写入 WAV 文件
wav_file.writeframes(struct.pack("<" + ("h" * len(processed_data)), *processed_data))
if __name__ == "__main__":
asyncio.run(_main())