| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- """
- 讯飞AIUI语音识别处理模块
- """
- import json5
- import requests
- from utils.logger import logger
- import json
- import random
- import threading
- from strategies.vision.qwenv import process_base64_image
- from utils.pc2_requests import _send_qa_task, _send_led_color_task
- from utils.tts_client import play_text_async, is_playing
- from utils.logger import logger
- from handlers.xunfei.intent_handler import IntentHandler
- class XunfeiSpeechHandler:
- """讯飞AIUI语音识别处理类"""
- def __init__(self):
- # 根据文字长度分类的语气助词列表
- self.short_thinking_phrases = [
- "嗯", "呃", "哦"
- ]
- self.medium_thinking_phrases = [
- "嗯…", "呃…", "哦…", "那个", "这个"
- ]
- self.long_thinking_phrases = [
- "嗯…", "呃…", "哦…", "那个", "这个"
- ]
- # 添加IntentHandler引用
- self.intent_handler = None
- self.iat_txt = ""
- def play_thinking_phrase(self, text_length: int = 0, type="thinking"):
- """根据文字长度播放合适的语气助词(使用缓存)"""
- if text_length < 3:
- return
- elif 3 <= text_length < 7:
- phrase = random.choice(self.short_thinking_phrases)
- elif 7 <= text_length < 15:
- phrase = random.choice(self.medium_thinking_phrases)
- elif 15 <= text_length:
- phrase = random.choice(self.long_thinking_phrases)
- else:
- return
- logger.info(f"播放语气助词: {phrase}")
- play_text_async(phrase, use_cache=True)
- logger.info(f"{type}文本({text_length}字),播放语气助词: {phrase}")
- def handle_iat_result(self, data: dict) -> None:
- """
- 处理讯飞AIUI语音识别结果
- Args:
- data: 语音识别数据
- """
- try:
- # 异步调用 _send_led_color_task,添加异常处理
- try:
- led_thread = threading.Thread(
- target=_send_led_color_task,
- args=(self, "DEFAULT", "GREEN"),
- daemon=True
- )
- led_thread.start()
- except Exception as e:
- logger.debug(f"[LED] LED控制失败,不影响语音识别: {e}")
- # logger.info('IAT数据', json.dumps(data, ensure_ascii=False, indent=2))
- # 使用get_recognition_text方法提取文本
- result_string = self.get_recognition_text(data)
- self.iat_txt = result_string
- # 获取状态信息
- sn_value = data.get('content', {}).get(
- 'result', {}).get('text', {}).get('sn')
- ls_value = data.get('content', {}).get(
- 'result', {}).get('text', {}).get('ls')
- # 确定状态值
- if sn_value == 1:
- status_value = 0
- elif ls_value is True:
- status_value = 2
- else:
- status_value = 1
- # 输出识别结果
- if result_string or status_value == 2:
- logger.info(f"讯飞识别到IAT结果是: {result_string}")
- # 异步调用 _send_qa_task,添加异常处理
- try:
- qa_thread = threading.Thread(
- target=_send_qa_task,
- args=(self, {"question": result_string}),
- daemon=True
- )
- qa_thread.start()
- except Exception as e:
- logger.debug(f"[QA] QA请求失败,不影响语音识别: {e}")
- # 使用改进的播放逻辑
- logger.info(f"开始播放语气词")
- self.play_thinking_phrase(len(result_string), type="thinking")
- except Exception as e:
- logger.error(f"讯飞语音识别处理异常: {e}")
- def get_recognition_text(self, data: dict) -> str:
- """
- 获取讯飞识别文本
- Args:
- data: 语音识别数据
- Returns:
- str: 识别文本
- """
- try:
- words = []
- ws_list = data.get('content', {}).get(
- 'result', {}).get('text', {}).get('ws', [])
- for item in ws_list:
- cw_list = item.get('cw', [])
- for cw in cw_list:
- words.append(cw.get('w', ''))
- return ''.join(words)
- except Exception as e:
- logger.error(f"获取讯飞识别文本异常: {e}")
- return ""
|