解决报错:Recognizer error 10407 Not started or already stopped.voice_txt is empty, do not send chatter

问题:

查阅了很多资料如下:

解决方案一:

参考:ROS科大讯飞语音错误:Recognizer error 10407-优快云博客

原因:so文件的复制与链接:

解决:进入到下载的SDK包 ;(64位选“x64”,32位选”x86“)

sudo cp libmsc.so /usr/local/lib/
sudo ldconfig

没有解决我的问题。

解决方案二:

查阅资料是:SDK和AppID和你的应用没有对应上

于是查阅:

grep appid /home/用户名/ros_senior/robot_voice -r

查看自己的程序那些地方包含了appid。

修改appid为自己申请的appid号即可解决。

这里可查看自己的appid号:

import os import time import signal import asyncio import threading import multiprocessing as mp import queue import logging from modules.audio_capture.capture import audio_capture_process, AudioCaptureConfig from modules.audio_consumer.audio_consumer import audio_consumer_process, AudioConfig as AudioConsumerConfig from modules.stt_module.stt_module import stt_process, STTConfig, TranscriptionTask from modules.voice.voice_input.voice_input import VoiceInput logging.basicConfig( level=logging.INFO, format='[%(asctime)s][%(levelname)s] %(message)s', datefmt='%H:%M:%S' ) logger = logging.getLogger("三花聚顶") class VoiceInputHandler: def __init__(self, config): self.voice_input = VoiceInput() self.config = config self.last_voice_input_time = 0 self.is_recording = False self.record_thread = None def start_recording(self): if self.is_recording: logger.warning("录音已在进行中") return False self.is_recording = True self.record_thread = threading.Thread(target=self._run_async_record) self.record_thread.daemon = True self.record_thread.start() return True def _run_async_record(self): try: asyncio.run(self.voice_input.record_until_silence(max_duration=10)) except Exception as e: logger.error(f"录音失败: {e}") finally: self.is_recording = False def process_recording(self, file_queue): if not self.is_recording and self.record_thread is not None: self.record_thread.join(timeout=1.0) self.record_thread = None frames = self.voice_input.get_recorded_frames() if frames: filename = os.path.join(self.config.save_path, f"voice_input_{int(time.time())}.wav") try: self.voice_input.save_wav(filename) if file_queue.qsize() < file_queue._maxsize * 0.8: task = TranscriptionTask(audio_file=filename, task_id=f"voice-input-{time.time()}") try: file_queue.put_nowait(task) logger.info(f"已将语音输入任务放入文件队列: {filename}") return True except queue.Full: logger.warning("文件队列已满,无法提交语音输入任务") else: logger.warning("文件队列繁忙,跳过本次语音输入任务") except Exception as e: logger.error(f"保存语音输入文件失败: {e}") return False def terminate(self): if self.is_recording: self.voice_input.stop_recording() self.voice_input.terminate() def main(): logger.info("三花聚顶助手启动中...") stop_event = mp.Event() def signal_handler(signum, frame): logger.info(f"接收到信号 {signum},准备关闭系统") stop_event.set() signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) # 配置参数 capture_config = AudioCaptureConfig(rate=16000, chunk=1024, queue_maxsize=500) consumer_config = AudioConsumerConfig(save_path="recordings", max_seconds_per_file=5, max_files=50) stt_config = STTConfig(model_size="base") # 创建目录 os.makedirs(consumer_config.save_path, exist_ok=True) # 创建进程间通信队列 audio_queue = mp.Queue(maxsize=capture_config.queue_maxsize) file_queue = mp.Queue(maxsize=50) stt_result_queue = mp.Queue(maxsize=50) # 启动音频采集进程 capture_proc = mp.Process( target=audio_capture_process, args=(audio_queue, stop_event, capture_config), name="AudioCaptureProcess", daemon=True ) capture_proc.start() logger.info("音频采集模块已启动") # 启动音频消费者进程,注意这里只传3个参数 consumer_proc = mp.Process( target=audio_consumer_process, args=(audio_queue, stop_event, consumer_config), name="AudioConsumerProcess", daemon=True ) consumer_proc.start() logger.info("音频消费者模块已启动") # 启动STT进程 stt_proc = mp.Process( target=stt_process, args=(file_queue, stt_result_queue, stop_event, stt_config), name="STTProcess", daemon=True ) stt_proc.start() logger.info("STT模块已启动") # 初始化语音输入处理 voice_handler = VoiceInputHandler(consumer_config) last_voice_input_time = 0 try: logger.info("系统运行中,按 Ctrl+C 退出") last_status_time = time.time() processed_results = 0 while not stop_event.is_set(): current_time = time.time() # 每5秒打印系统状态 if current_time - last_status_time > 5: try: audio_qsize = audio_queue.qsize() except NotImplementedError: audio_qsize = -1 try: file_qsize = file_queue.qsize() except NotImplementedError: file_qsize = -1 try: result_qsize = stt_result_queue.qsize() except NotImplementedError: result_qsize = -1 logger.info(f"系统状态 - 音频队列: {audio_qsize}/{capture_config.queue_maxsize} | " f"文件队列: {file_qsize} | 结果队列: {result_qsize}") last_status_time = current_time # 处理STT结果(每次循环最多处理5个结果) processed_results = 0 while processed_results < 5 and not stt_result_queue.empty(): try: result = stt_result_queue.get_nowait() if result.get("status") == "success": logger.info(f"转写结果: {result['text']}") elif result.get("status") == "error": logger.error(f"转写失败: {result['error']}") processed_results += 1 except (queue.Empty, mp.queues.Empty): break # 每30秒触发一次语音输入测试 if current_time - last_voice_input_time > 30: if not voice_handler.is_recording: logger.info("触发语音输入测试...") if voice_handler.start_recording(): last_voice_input_time = current_time else: logger.debug("语音输入测试已在进行中") # 处理语音输入结果 if voice_handler.process_recording(file_queue): last_voice_input_time = current_time time.sleep(0.1) except KeyboardInterrupt: logger.info("检测到退出信号,准备关闭系统") except Exception as e: logger.error(f"主进程异常: {e}", exc_info=True) finally: stop_event.set() logger.info("开始关闭系统...") # 关闭子进程 processes = [ (capture_proc, "音频采集"), (consumer_proc, "音频消费者"), (stt_proc, "STT") ] for proc, name in processes: if proc.is_alive(): logger.info(f"等待{name}进程退出...") proc.join(timeout=5.0) if proc.is_alive(): logger.warning(f"{name}进程未正常退出,强制终止") proc.terminate() proc.join(timeout=1.0) # 关闭语音输入 voice_handler.terminate() # 清理队列 queues = [audio_queue, file_queue, stt_result_queue] for q in queues: try: while not q.empty(): q.get_nowait() except (queue.Empty, mp.queues.Empty): pass try: q.close() q.join_thread() except Exception: pass logger.info("系统已完全关闭") if __name__ == "__main__": os.environ["WHISPER_LOGLEVEL"] = "ERROR" log_file = "juhe_system.log" file_handler = logging.FileHandler(log_file, encoding='utf-8') file_handler.setFormatter(logging.Formatter('[%(asctime)s][%(levelname)s] %(message)s')) logging.getLogger().addHandler(file_handler) logger.info(f"日志文件: {os.path.abspath(log_file)}") main()这段代码检查一下
07-16
root@autodl-container-c85144bc1a-7cf0bfa7:~/autodl-tmp/Open-LLM-VTuber# uv run run_server.py # 第一次运行可能会下载一些模型,导致等待时间较久。 2025-07-17 19:14:19.094 | INFO | __main__:<module>:86 - Running in standard mode. For detailed debug logs, use: uv run run_server.py --verbose 2025-07-17 19:14:19 | INFO | __main__:run:57 | Open-LLM-VTuber, version v1.1.4 2025-07-17 19:14:19 | INFO | upgrade:sync_user_config:350 | [DEBUG] User configuration is up-to-date. 2025-07-17 19:14:19 | INFO | src.open_llm_vtuber.service_context:init_live2d:156 | Initializing Live2D: shizuku-local 2025-07-17 19:14:19 | INFO | src.open_llm_vtuber.live2d_model:_lookup_model_info:142 | Model Information Loaded. 2025-07-17 19:14:19 | INFO | src.open_llm_vtuber.service_context:init_asr:166 | Initializing ASR: sherpa_onnx_asr 2025-07-17 19:14:19 | INFO | src.open_llm_vtuber.asr.sherpa_onnx_asr:__init__:81 | Sherpa-Onnx-ASR: Using cpu for inference 2025-07-17 19:14:19 | WARNING | src.open_llm_vtuber.asr.sherpa_onnx_asr:_create_recognizer:166 | SenseVoice model not found. Downloading the model... 2025-07-17 19:14:19 | INFO | src.open_llm_vtuber.asr.utils:check_and_extract_local_file:141 | ✅ Extracted directory exists: models/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17, no operation needed. 2025-07-17 19:14:19 | INFO | src.open_llm_vtuber.asr.sherpa_onnx_asr:_create_recognizer:179 | Local file found. Using existing file. 2025-07-17 19:14:19 | ERROR | __main__:<module>:91 | An error has been caught in function '<module>', process 'MainProcess' (186339), thread 'MainThread' (140161628456768): Traceback (most recent call last): > File "/root/autodl-tmp/Open-LLM-VTuber/run_server.py", line 91, in <module> run(console_log_level=console_log_level) │ └ 'INFO' └ <function run at 0x7f79baae0790> File "/root/autodl-tmp/Open-LLM-VTuber/run_server.py", line 71, in run server = WebSocketServer(config=config) │ └ Config(system_config=SystemConfig(conf_version='v1.1.1', host='localhost', port=12393, config_alts_dir='characters', tool_pro... └ <class 'src.open_llm_vtuber.server.WebSocketServer'> File "/root/autodl-tmp/Open-LLM-VTuber/src/open_llm_vtuber/server.py", line 45, in __init__ default_context_cache.load_from_config(config) │ │ └ Config(system_config=SystemConfig(conf_version='v1.1.1', host='localhost', port=12393, config_alts_dir='characters', tool_pro... │ └ <function ServiceContext.load_from_config at 0x7f79bac70430> └ <src.open_llm_vtuber.service_context.ServiceContext object at 0x7f79bab10310> File "/root/autodl-tmp/Open-LLM-VTuber/src/open_llm_vtuber/service_context.py", line 132, in load_from_config self.init_asr(config.character_config.asr_config) │ │ │ │ └ ASRConfig(asr_model='sherpa_onnx_asr', azure_asr=AzureASRConfig(api_key='azure_api_key', region='eastus', languages=['en-US',... │ │ │ └ CharacterConfig(conf_name='shizuku-local', conf_uid='shizuku-local-001', live2d_model_name='shizuku-local', character_name='S... │ │ └ Config(system_config=SystemConfig(conf_version='v1.1.1', host='localhost', port=12393, config_alts_dir='characters', tool_pro... │ └ <function ServiceContext.init_asr at 0x7f79bac70550> └ <src.open_llm_vtuber.service_context.ServiceContext object at 0x7f79bab10310> File "/root/autodl-tmp/Open-LLM-VTuber/src/open_llm_vtuber/service_context.py", line 167, in init_asr self.asr_engine = ASRFactory.get_asr_system( │ │ │ └ <staticmethod(<function ASRFactory.get_asr_system at 0x7f79bc0c37f0>)> │ │ └ <class 'src.open_llm_vtuber.asr.asr_factory.ASRFactory'> │ └ None └ <src.open_llm_vtuber.service_context.ServiceContext object at 0x7f79bab10310> File "/root/autodl-tmp/Open-LLM-VTuber/src/open_llm_vtuber/asr/asr_factory.py", line 58, in get_asr_system return SherpaOnnxASR(**kwargs) │ └ {'model_type': 'sense_voice', 'encoder': None, 'decoder': None, 'joiner': None, 'paraformer': None, 'nemo_ctc': None, 'wenet_... └ <class 'src.open_llm_vtuber.asr.sherpa_onnx_asr.VoiceRecognition'> File "/root/autodl-tmp/Open-LLM-VTuber/src/open_llm_vtuber/asr/sherpa_onnx_asr.py", line 83, in __init__ self.recognizer = self._create_recognizer() │ │ └ <function VoiceRecognition._create_recognizer at 0x7f79b930d510> │ └ <src.open_llm_vtuber.asr.sherpa_onnx_asr.VoiceRecognition object at 0x7f79bab101f0> └ <src.open_llm_vtuber.asr.sherpa_onnx_asr.VoiceRecognition object at 0x7f79bab101f0> File "/root/autodl-tmp/Open-LLM-VTuber/src/open_llm_vtuber/asr/sherpa_onnx_asr.py", line 188, in _create_recognizer recognizer = sherpa_onnx.OfflineRecognizer.from_sense_voice( │ │ └ <classmethod(<function OfflineRecognizer.from_sense_voice at 0x7f79baae1750>)> │ └ <class 'sherpa_onnx.offline_recognizer.OfflineRecognizer'> └ <module 'sherpa_onnx' from '/root/autodl-tmp/Open-LLM-VTuber/.venv/lib/python3.10/site-packages/sherpa_onnx/__init__.py'> File "/root/autodl-tmp/Open-LLM-VTuber/.venv/lib/python3.10/site-packages/sherpa_onnx/offline_recognizer.py", line 259, in from_sense_voice self.recognizer = _Recognizer(recognizer_config) │ │ └ <_sherpa_onnx.OfflineRecognizerConfig object at 0x7f79bab49130> │ └ <class '_sherpa_onnx.OfflineRecognizer'> └ <sherpa_onnx.offline_recognizer.OfflineRecognizer object at 0x7f79bab10700> RuntimeError: No graph was found in the protobuf.
最新发布
07-18
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值