fix a little bugs
This commit is contained in:
@@ -22,18 +22,18 @@ def get_asr():
|
|||||||
"""获取或创建ASR实例(单例)"""
|
"""获取或创建ASR实例(单例)"""
|
||||||
global _asr_instance
|
global _asr_instance
|
||||||
if _asr_instance is None:
|
if _asr_instance is None:
|
||||||
logger.info("🚀 初始化ASR服务...")
|
logger.info("初始化ASR服务...")
|
||||||
_asr_instance = create_asr(
|
_asr_instance = create_asr(
|
||||||
ASRConfig(
|
ASRConfig(
|
||||||
model_name="deepdml/faster-whisper-large-v3-turbo-ct2",
|
model_name="deepdml/faster-whisper-large-v3-turbo-ct2",
|
||||||
device="auto",
|
device="auto",
|
||||||
compute_type="int8_float16",
|
compute_type="int8_float16", # 如果你是gtx老卡,换成float32
|
||||||
cache_dir=Path("asr_models/faster_whisper_large_v3_ct2"),
|
cache_dir=Path("asr_models/faster_whisper_large_v3_ct2"),
|
||||||
beam_size=1, # 贪婪搜索,速度最快
|
beam_size=1, # 贪婪搜索,速度最快
|
||||||
vad_filter=True, # 过滤静音,节省30%时间
|
vad_filter=True, # 过滤静音,节省30%时间
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
logger.info("✅ ASR服务初始化完成")
|
logger.info("ASR服务初始化完成")
|
||||||
return _asr_instance
|
return _asr_instance
|
||||||
|
|
||||||
@app.on_event("startup")
|
@app.on_event("startup")
|
||||||
@@ -47,7 +47,7 @@ async def shutdown_event():
|
|||||||
global _asr_instance
|
global _asr_instance
|
||||||
if _asr_instance:
|
if _asr_instance:
|
||||||
_asr_instance.shutdown()
|
_asr_instance.shutdown()
|
||||||
logger.info("🛑 ASR服务已关闭")
|
logger.info("ASR服务已关闭")
|
||||||
|
|
||||||
@app.post("/transcribe", response_class=JSONResponse)
|
@app.post("/transcribe", response_class=JSONResponse)
|
||||||
async def transcribe_audio(
|
async def transcribe_audio(
|
||||||
@@ -63,7 +63,7 @@ async def transcribe_audio(
|
|||||||
|
|
||||||
# 验证文件类型
|
# 验证文件类型
|
||||||
if file.content_type and not file.content_type.startswith("audio/"):
|
if file.content_type and not file.content_type.startswith("audio/"):
|
||||||
raise HTTPException(status_code=400, detail="❌ 请上传音频文件 (MIME类型: audio/*)")
|
raise HTTPException(status_code=400, detail="请上传音频文件 (MIME类型: audio/*)")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# 创建临时文件
|
# 创建临时文件
|
||||||
@@ -72,7 +72,7 @@ async def transcribe_audio(
|
|||||||
tmp_file.write(content)
|
tmp_file.write(content)
|
||||||
tmp_path = Path(tmp_file.name)
|
tmp_path = Path(tmp_file.name)
|
||||||
|
|
||||||
logger.info(f"📥 接收文件: {file.filename} ({len(content)} bytes)")
|
logger.info(f"接收文件: {file.filename} ({len(content)} bytes)")
|
||||||
|
|
||||||
# 调用ASR识别
|
# 调用ASR识别
|
||||||
asr = get_asr()
|
asr = get_asr()
|
||||||
@@ -83,7 +83,7 @@ async def transcribe_audio(
|
|||||||
|
|
||||||
processing_time = time.time() - start_time
|
processing_time = time.time() - start_time
|
||||||
|
|
||||||
logger.info(f"✅ 识别完成: {language} | {len(text)}字符 | 置信度:{confidence:.2f} | 耗时:{processing_time:.3f}s")
|
logger.info(f"识别完成: {language} | {len(text)}字符 | 置信度:{confidence:.2f} | 耗时:{processing_time:.3f}s")
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"success": True,
|
"success": True,
|
||||||
@@ -96,7 +96,7 @@ async def transcribe_audio(
|
|||||||
}
|
}
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"❌ 识别失败: {e}")
|
logger.error(f"识别失败: {e}")
|
||||||
raise HTTPException(status_code=500, detail=f"识别失败: {str(e)}")
|
raise HTTPException(status_code=500, detail=f"识别失败: {str(e)}")
|
||||||
|
|
||||||
@app.get("/health")
|
@app.get("/health")
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ class AudioDataDTO:
|
|||||||
# 序列化为JSON并发送 自动处理base64和type字段
|
# 序列化为JSON并发送 自动处理base64和type字段
|
||||||
json_message = self.audio_data.to_json()
|
json_message = self.audio_data.to_json()
|
||||||
await self.json_dto.send_json(json_message)
|
await self.json_dto.send_json(json_message)
|
||||||
logger.info(f"音频已发送: sequence={sequence}, 大小={len(data)} bytes")
|
# logger.info(f"音频已发送: sequence={sequence}, 大小={len(data)} bytes")
|
||||||
|
|
||||||
# 业务接收接口
|
# 业务接收接口
|
||||||
def register_audio_callback(
|
def register_audio_callback(
|
||||||
|
|||||||
@@ -77,10 +77,10 @@ class WebSocketServer:
|
|||||||
"""发送JSON数据(唯一客户端)"""
|
"""发送JSON数据(唯一客户端)"""
|
||||||
if self._websocket:
|
if self._websocket:
|
||||||
try:
|
try:
|
||||||
logger.debug(f"准备发送JSON数据: {data}")
|
# logger.debug(f"准备发送JSON数据: {data}")
|
||||||
message = json.dumps(data)
|
message = json.dumps(data)
|
||||||
await self._websocket.send(message)
|
await self._websocket.send(message)
|
||||||
logger.trace(f"JSON数据已发送: {data}")
|
# logger.trace(f"JSON数据已发送: {data}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"JSON数据发送失败: {e}")
|
logger.error(f"JSON数据发送失败: {e}")
|
||||||
raise
|
raise
|
||||||
|
|||||||
@@ -221,7 +221,7 @@ class YosugaServerCore:
|
|||||||
media_type="wav"
|
media_type="wav"
|
||||||
):
|
):
|
||||||
chunk_count += 1
|
chunk_count += 1
|
||||||
print(f"🎵 收到音频块 #{chunk_count}: {len(chunk.audio_data)} bytes")
|
# print(f"🎵 收到音频块 #{chunk_count}: {len(chunk.audio_data)} bytes")
|
||||||
if chunk_count == 1: # 如果是第一个音频块
|
if chunk_count == 1: # 如果是第一个音频块
|
||||||
# 构造音频首包发送给客户端
|
# 构造音频首包发送给客户端
|
||||||
await self.audio_dto.send_audio_data(
|
await self.audio_dto.send_audio_data(
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ class YosugaUITARS(LLMCorePromptBase):
|
|||||||
1. 当用户试图进行一些自动化操作时,你可以通过返回以下json来调用自动化agent,调用的时候也可以一并回复用户一些文本内容:
|
1. 当用户试图进行一些自动化操作时,你可以通过返回以下json来调用自动化agent,调用的时候也可以一并回复用户一些文本内容:
|
||||||
{
|
{
|
||||||
"type": "固定为call_auto_agent",
|
"type": "固定为call_auto_agent",
|
||||||
"llm_translation": "针对用户的意图的转译,如果用户的意图足够明确,直接照抄即可,注意转译的语言必须是中文,可以混合部分英文(应用名称),这个和聊天交流的语言不统一。"
|
"llm_translation": "针对用户的意图的转译,如果用户的意图足够明确,直接照抄即可,注意转译的语言必须是英语(English),可以混合部分中文(例如应用名称),这个和聊天交流使用的语言不统一。"
|
||||||
}
|
}
|
||||||
2. 针对自动化agent操作输入,你应该按以下JSON格式回复。如果你发起了自动化agent请求之后,却没有返回下面的JSON内容,那么你的请求并不会作用到用户的设备,所以你调用完自动化agent一定要及时返回下面的JSON内容:
|
2. 针对自动化agent操作输入,你应该按以下JSON格式回复。如果你发起了自动化agent请求之后,却没有返回下面的JSON内容,那么你的请求并不会作用到用户的设备,所以你调用完自动化agent一定要及时返回下面的JSON内容:
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user