You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pyttsx3+Telegram Bot问题:如何等待引擎完成并实现无文件音频发送?

问题解决方法

一、修复发送旧音频的问题

你遇到的发送旧音频问题,核心原因是pyttsx3引擎的任务队列未被正确清空,或是重复文件名导致文件被覆盖。可以通过以下两种方式解决:

  1. 清空引擎任务队列+安全读取文件
    每次执行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")
  1. 使用唯一文件名避免覆盖
    如果存在多次快速调用的场景,建议生成带时间戳的唯一文件名,彻底避免文件被覆盖的问题:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 16:10:25