@@ -48,7 +48,7 @@ def wrapper(self, *args, **kwargs):
4848 # 示例:检查当前用户是否有使用TTS的权限
4949 has_perm = True # 实际实现时替换为真实权限检查
5050 if not has_perm :
51- logger .exception (f"权限不足,无法执行 { func .__name__ } " )
51+ logger .warning (f"权限不足,无法执行 { func .__name__ } " )
5252 return
5353 return func (self , * args , ** kwargs )
5454
@@ -78,15 +78,15 @@ def set_volume(self, volume: float) -> None:
7878 """设置播放音量,范围0.0-1.0"""
7979 # 输入验证
8080 if not isinstance (volume , (int , float )):
81- logger .exception (f"无效的音量值: { volume } " )
81+ logger .warning (f"无效的音量值: { volume } " )
8282 return
8383 self ._volume = max (0.0 , min (1.0 , float (volume )))
8484
8585 def set_speed (self , speed : int ) -> None :
8686 """设置播放语速,范围0-200"""
8787 # 输入验证
8888 if not isinstance (speed , int ):
89- logger .exception (f"无效的语速值: { speed } " )
89+ logger .warning (f"无效的语速值: { speed } " )
9090 return
9191 self ._speed = max (0 , min (200 , speed ))
9292
@@ -240,21 +240,21 @@ def add_task(self, task: Union[Tuple[np.ndarray, int], str]) -> bool:
240240 # 输入验证
241241 if isinstance (task , tuple ): # 内存数据
242242 if len (task ) != 2 :
243- logger .exception (f"无效的任务格式: { task } " )
243+ logger .warning (f"无效的任务格式: { task } " )
244244 return False
245245 data , fs = task
246246 if not isinstance (data , np .ndarray ) or not isinstance (fs , int ):
247- logger .exception ("无效的内存数据格式" )
247+ logger .warning ("无效的内存数据格式" )
248248 return False
249249 else : # 文件路径
250250 if not isinstance (task , str ) or not task :
251- logger .exception ("无效的文件路径" )
251+ logger .warning ("无效的文件路径" )
252252 return False
253253
254254 self .play_queue .put_nowait (task )
255255 return True
256256 except queue .Full :
257- logger .exception ("播放队列已满,丢弃新任务" )
257+ logger .warning ("播放队列已满,丢弃新任务" )
258258 return False
259259 except Exception as e :
260260 logger .exception (f"添加播放任务失败: { e } " )
@@ -314,10 +314,10 @@ def get_voice(self, text: str, voice: str) -> Tuple[np.ndarray, int]:
314314 """获取语音数据(自动缓存)"""
315315 # 输入验证
316316 if not isinstance (text , str ) or not text :
317- logger .exception (f"无效的文本: { text } " )
317+ logger .warning (f"无效的文本: { text } " )
318318 raise ValueError ("文本不能为空" )
319319 if not isinstance (voice , str ) or not voice :
320- logger .exception (f"无效的语音名称: { voice } " )
320+ logger .warning (f"无效的语音名称: { voice } " )
321321 raise ValueError ("语音名称不能为空" )
322322
323323 logger .debug (f"获取语音: text='{ text } ', voice='{ voice } '" )
@@ -396,28 +396,28 @@ async def _generate_voice(self, text: str, voice: str) -> Tuple[np.ndarray, int]
396396 return data , fs
397397 except NoAudioReceived as e :
398398 retry_count += 1
399- logger .exception (
399+ logger .warning (
400400 f"生成语音失败,未接收到音频数据,重试{ retry_count } /{ max_retries } : { type (e ).__name__ } { e } "
401401 )
402402 if retry_count < max_retries :
403403 await asyncio .sleep (1 )
404404 except WebSocketError as e :
405405 retry_count += 1
406- logger .exception (
406+ logger .warning (
407407 f"生成语音失败,WebSocket通信错误,重试{ retry_count } /{ max_retries } : { type (e ).__name__ } { e } "
408408 )
409409 if retry_count < max_retries :
410410 await asyncio .sleep (1 )
411411 except Exception as e :
412412 retry_count += 1
413- logger .exception (
413+ logger .warning (
414414 f"生成语音失败,重试{ retry_count } /{ max_retries } : { type (e ).__name__ } { e } "
415415 )
416416 if retry_count < max_retries :
417417 await asyncio .sleep (1 )
418418
419419 # 最终失败时的降级处理
420- logger .exception ("生成语音失败,已达到最大重试次数" )
420+ logger .warning ("生成语音失败,已达到最大重试次数" )
421421 raise RuntimeError ("生成语音失败" )
422422
423423 def _generate_cache_key (self , text : str , voice : str ) -> str :
@@ -644,23 +644,30 @@ def _init_tts_engine(self) -> None:
644644 and sys .getwindowsversion ().major >= 10
645645 and platform .machine () != "x86"
646646 ):
647- if not hasattr (
648- QApplication .instance (), "pumping_reward_voice_engine"
649- ):
650- QApplication .instance ().pumping_reward_voice_engine = (
651- pyttsx3 .init ()
647+ try :
648+ if not hasattr (
649+ QApplication .instance (), "pumping_reward_voice_engine"
650+ ):
651+ QApplication .instance ().pumping_reward_voice_engine = (
652+ pyttsx3 .init ()
653+ )
654+ QApplication .instance ().pumping_reward_voice_engine .startLoop (
655+ False
656+ )
657+ self .voice_engine = (
658+ QApplication .instance ().pumping_reward_voice_engine
652659 )
653- QApplication .instance ().pumping_reward_voice_engine .startLoop (
654- False
660+ logger .info ("Windows系统TTS引擎初始化成功" )
661+ except Exception as e :
662+ logger .warning (
663+ f"Windows系统TTS引擎初始化失败: { e } ,语音功能将不可用"
655664 )
656- self .voice_engine = (
657- QApplication .instance ().pumping_reward_voice_engine
658- )
659- logger .info ("Windows系统TTS引擎初始化成功" )
665+ self .voice_engine = None
660666 else :
661- logger .exception (
667+ logger .warning (
662668 "Windows系统TTS引擎需要Windows 10及以上系统且非x86架构"
663669 )
670+ self .voice_engine = None
664671
665672 elif system == "Linux" :
666673 # Linux平台TTS引擎初始化
@@ -686,17 +693,20 @@ def _init_tts_engine(self) -> None:
686693 )
687694 logger .info ("Linux系统TTS引擎初始化成功 (使用espeak)" )
688695 else :
689- logger .exception (
696+ logger .warning (
690697 "Linux系统TTS引擎需要安装espeak: sudo apt-get install espeak"
691698 )
699+ self .voice_engine = None
692700 except Exception as e :
693- logger .exception (f"Linux系统TTS引擎初始化失败: { e } " )
701+ logger .warning (f"Linux系统TTS引擎初始化失败: { e } ,语音功能将不可用" )
702+ self .voice_engine = None
694703
695704 else :
696- logger .exception (f"不支持的操作系统: { system } ,系统TTS功能不可用" )
705+ logger .warning (f"不支持的操作系统: { system } ,系统TTS功能不可用" )
706+ self .voice_engine = None
697707
698708 except Exception as e :
699- logger .exception (f"TTS引擎初始化失败: { e } " )
709+ logger .warning (f"TTS引擎初始化失败: { e } ,语音功能将不可用 " )
700710 self .voice_engine = None
701711
702712 @require_permission ("tts.use" )
0 commit comments