pyttsx3+Telegram Bot问题:如何等待引擎完成并实现无文件音频发送?
问题解决方法
一、修复发送旧音频的问题
你遇到的发送旧音频问题,核心原因是pyttsx3引擎的任务队列未被正确清空,或是重复文件名导致文件被覆盖。可以通过以下两种方式解决:
- 清空引擎任务队列+安全读取文件
每次执行TTS任务前,先终止引擎中未完成的任务,确保当前任务是唯一执行项;同时用with语句读取文件,保证文件写入完成后再发送:
def TTSBot(message): print("TTS") Engine.stop() # 清空之前的任务队列,避免任务堆积 Engine.save_to_file(message.text, "Voice.mp3") Engine.runAndWait() # 用with语句自动管理文件句柄,确保文件完全写入 with open("Voice.mp3", "rb") as audio_file: FBot.send_audio(message.chat.id, audio_file, reply_to_message_id=message.id) print("done")
- 使用唯一文件名避免覆盖
如果存在多次快速调用的场景,建议生成带时间戳的唯一文件名,彻底避免文件被覆盖的问题:
import time import os def TTSBot(message): print("TTS") Engine.stop() # 生成带时间戳的唯一文件名 filename = f"Voice_{int(time.time())}.mp3" Engine.save_to_file(message.text, filename) Engine.runAndWait() with open(filename, "rb") as audio_file: FBot.send_audio(message.chat.id, audio_file, reply_to_message_id=message.id) # 发送完成后删除临时文件 os.remove(filename) print("done")
二、不保存文件直接发送音频的方法
pyttsx3本身不支持直接输出字节流,但可以通过以下两种方式实现无文件发送:
方法1:使用临时文件模块(推荐)
用tempfile创建自动销毁的临时文件,无需手动管理文件生命周期:
import tempfile import os def TTSBot(message): print("TTS") Engine.stop() # 创建临时MP3文件,关闭后不会立即删除 with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as temp_file: temp_filename = temp_file.name Engine.save_to_file(message.text, temp_filename) Engine.runAndWait() with open(temp_filename, "rb") as audio_file: FBot.send_audio(message.chat.id, audio_file, reply_to_message_id=message.id) # 手动删除临时文件 os.unlink(temp_filename) print("done")
方法2:更换为支持字节流的TTS库
如果允许更换库,推荐使用gTTS(谷歌文本转语音),它支持直接输出字节流,无需保存文件:
from gtts import gTTS import io def TTSBot(message): print("TTS") # 生成TTS音频,指定语言 tts = gTTS(text=message.text, lang='zh-cn') audio_bytes = io.BytesIO() tts.write_to_fp(audio_bytes) audio_bytes.seek(0) # 将字节流指针移到开头 FBot.send_audio(message.chat.id, audio_bytes, reply_to_message_id=message.id) print("done")
内容的提问来源于stack exchange,提问作者amiroof
相关产品推荐
相关产品推荐

