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

pyttsx3报Run loop already started错误:首次正常再次触发问题求助

解决pyttsx3 "Run loop already started" 错误

问题根源

  • 每次调用speak()都重新初始化pyttsx3.Engine实例,重复创建引擎会触发内部事件循环冲突,导致"Run loop already started"错误。
  • engine.endLoop仅引用方法未实际调用(缺少括号()),无法正确结束循环;engine.stop同样未加括号,未执行停止操作。
  • 实时转写回调text_detected会被频繁触发,每次都执行翻译和播报,不仅浪费资源还会加剧引擎冲突问题。

修复方案

  1. 全局初始化引擎:程序启动时创建一次pyttsx3.Engine实例,复用该实例完成所有语音播报。
  2. 正确调用引擎方法:补全endLoop()和stop()的括号,确保引擎状态正确重置。
  3. 调整触发时机:仅在完整句子识别完成(process_text被调用)时执行翻译和播报,避免实时更新阶段的重复操作。

修改后的完整代码

from RealtimeSTT import AudioToTextRecorder
from colorama import Fore, Back, Style
import colorama
import os
from googletrans import Translator
import re
import pyttsx3

if __name__ == '__main__':
    print("Initializing RealtimeSTT test...")
    colorama.init()
    
    # 全局初始化翻译器和语音引擎,避免重复创建
    translator = Translator()
    engine = pyttsx3.init()

    full_sentences = []
    displayed_text = ""

    def clear_console():
        os.system('clear' if os.name == 'posix' else 'cls')

    def text_detected(text):
        global displayed_text
        sentences_with_style = [
            f"{Fore.YELLOW + sentence + Style.RESET_ALL if i % 2 == 0 else Fore.CYAN + sentence + Style.RESET_ALL} "
            for i, sentence in enumerate(full_sentences)
        ]
        new_text = "".join(sentences_with_style).strip() + " " + text if len(sentences_with_style) > 0 else text

        if new_text != displayed_text:
            displayed_text = new_text
            clear_console()
            print(displayed_text, end="", flush=True)

    def strip_ansi(text):
        ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
        return ansi_escape.sub('', text)

    def process_text(text):
        full_sentences.append(text)
        text_detected("")  
        
        # 仅在完整句子识别完成后执行翻译和播报
        plain_text = strip_ansi(displayed_text)
        result = translator.translate(plain_text, dest='en')
        clear_console()
        print(result.text)
        speak(result.text)

    def speak(text):
        engine.say(text)
        engine.runAndWait()
        engine.stop()
        engine.endLoop()

    recorder_config = {
        'spinner': False,
        'model': 'large-v2',
        'language': 'en',
        'silero_sensitivity': 0.4,
        'webrtc_sensitivity': 2,
        'post_speech_silence_duration': 0.4,
        'min_length_of_recording': 0,
        'min_gap_between_recordings': 0,
        'enable_realtime_transcription': True,
        'realtime_processing_pause': 0.2,
        'realtime_model_type': 'large-v3',
        'on_realtime_transcription_update': text_detected, 
    }

    recorder = AudioToTextRecorder(**recorder_config)
    clear_console()
    print("Say something...", end="", flush=True)

    while True:
        recorder.text(process_text)

内容的提问来源于stack exchange,提问作者Lowie Vhb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:57:05