pyttsx3报Run loop already started错误:首次正常再次触发问题求助
解决pyttsx3 "Run loop already started" 错误
问题根源
- 每次调用
speak()都重新初始化pyttsx3.Engine实例,重复创建引擎会触发内部事件循环冲突,导致"Run loop already started"错误。 engine.endLoop仅引用方法未实际调用(缺少括号()),无法正确结束循环;engine.stop同样未加括号,未执行停止操作。- 实时转写回调
text_detected会被频繁触发,每次都执行翻译和播报,不仅浪费资源还会加剧引擎冲突问题。
修复方案
- 全局初始化引擎:程序启动时创建一次
pyttsx3.Engine实例,复用该实例完成所有语音播报。 - 正确调用引擎方法:补全
endLoop()和stop()的括号,确保引擎状态正确重置。 - 调整触发时机:仅在完整句子识别完成(
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
相关产品推荐
相关产品推荐

