如何不先保存文件直接播放Edge TTS生成的音频?
实现Edge TTS音频直接播放的修改方案
要实现无需保存文件直接播放Edge TTS生成的音频,核心思路是获取音频流的字节数据,再用音频播放库直接处理这些数据,无需写入本地文件。以下是具体修改步骤:
1. 安装依赖库
除了edge_tts,还需要安装用于音频播放的pygame库:
pip install pygame
2. 修改后的完整代码
import asyncio import edge_tts import pygame from io import BytesIO voices = ['en-US-GuyNeural'] text = "Hi this is the test" voice = voices[0] async def amain(): # 初始化pygame音频模块 pygame.mixer.init() # 创建Edge TTS通信对象 communicate = edge_tts.Communicate(text, voice) # 收集所有音频字节块 audio_bytes = b"" async for chunk in communicate.stream(): if chunk["type"] == "audio": audio_bytes += chunk["data"] # 将字节数据包装成类文件对象 audio_file = BytesIO(audio_bytes) # 加载并播放音频 pygame.mixer.music.load(audio_file) pygame.mixer.music.play() # 等待播放结束 while pygame.mixer.music.get_busy(): await asyncio.sleep(0.1) # 清理资源 pygame.mixer.quit() loop = asyncio.get_event_loop_policy().get_event_loop() try: loop.run_until_complete(amain()) finally: loop.close()
关键修改说明
- 移除了原代码中与文件保存相关的变量和
save方法调用 - 通过
communicate.stream()异步遍历获取音频数据块,筛选出audio类型的块并拼接成完整的音频字节数据 - 使用
BytesIO将字节数据转换为类文件对象,让pygame可以直接加载播放 - 添加了等待播放结束的逻辑,避免程序提前退出导致音频中断
- 播放完成后清理pygame音频资源,避免残留占用
内容的提问来源于stack exchange,提问作者Abstract
相关产品推荐
相关产品推荐

