主要修改在asr-monitor-test 修改小程序手机号码登录 小程序的TTS生成(查一查、AI) 增加和支付相关的功能

This commit is contained in:
qcloud
2025-07-10 22:04:44 +08:00
parent 0665eb2c2d
commit 74899acab9
23 changed files with 4467 additions and 459 deletions

View File

@@ -141,15 +141,35 @@ def upload_file(tenant_id,mesum_id):
#logging.info(f"mesumid={mesum_id} {joined_string}")
prompt = (f"你是一名图片识别和理解助手"
prompt1 = (f"你是一名图片识别和理解助手"
f"任务是先识别图片中文字,然后理解文字中包含的内容,分析哪一项可以作为识别出文字的标题,"
f"你的回答有3个结果第一个结果匹配出的结果,JSON键值为antique"
f"从下面的候选项:{antiques_selected}进行匹配,每一个候选项中间以','分割,如果没有任何匹配则结果为'',以免误触发讲解,匹配成功则输出匹配出的内容"
f"从下面的候选项:{antiques_selected}进行匹配,每一个候选项中间以';'分割,如果没有任何匹配则结果为'',以免误触发讲解,匹配成功则输出匹配出的内容"
f",第二个结果是原始识别的所有文字,json 键值为text"
f"第三个结果是识别出文字与匹配项列表中元素的匹配度范围从0-1,1表示100%匹配,0表示完全不匹配,JSON键值为match_score,"
"3个结果输出以{ }的json格式给出匹配出文物、事件、人物的结果键值为antique"
f"原始数据的键值为text输出是1个完整的JSON数据不要有多余的前置和后置内容确保前端能正确解析出JSON数据")
prompt = (
f"作为图片识别和理解助手,您的任务是:"
f"\n1. 精确识别图片中的文字内容"
f"\n2. 理解文字语义"
f"\n3. 从以下候选标题中选择最佳匹配项:"
f"\n [{antiques_selected}]"
f"\n\n### 输出要求:"
f"\n- 以严格JSON格式输出包含3个字段"
f"\n • `antique`: 匹配的标题(多个用英文分号';'分割最多匹配3个无匹配则空字符串"
f"\n • `text`: 识别出的完整文字"
f"\n • `match_score`: 整体匹配度(0-1的浮点数)1=完全匹配"
f"\n\n### 匹配规则:"
f"\n1. 语义匹配优先于字面匹配"
f"\n2. 考虑同义词、近义词和描述性匹配"
f"\n3. 允许部分匹配(如'青铜酒器'匹配'青铜器'"
f"\n4. 若无明确匹配项,`antique`返回空字符串"
f"\n\n### 重要:"
f"\n- 输出必须是可直接解析的JSON无任何前置/后置文本"
f"\n- 匹配度评分需客观反映文本与候选标题的相似度"
)
file = request.files['file']
if file.filename == '':
@@ -221,12 +241,23 @@ def upload_file(tenant_id,mesum_id):
message = response.choices[0].message
parsed_json_res = parse_markdown_json(message.content)
parsed_json_data = {"antique": "", "text": "", "match_score": 0}
matchedArray = []
if parsed_json_res.get('success') is True:
parsed_json_data = parsed_json_res.get('data')
for item in labels_with_id:
if item['label'] == parsed_json_data.get('antique'):
parsed_json_data['id'] = item.get('id')
matchedAntiqueArray = parsed_json_data.get('antique').split(';') # 识别出的文物的数组,中间以';'分割,可能有多个
if len(matchedAntiqueArray) ==1: # 只有一个匹配项,直接返回
for item in labels_with_id:
if item['label'] == parsed_json_data.get('antique'):
parsed_json_data['id'] = item.get('id')
else: # 有多个匹配项,需要进行多个匹配
for label in matchedAntiqueArray:
antique= {'label':label}
for item in labels_with_id:
if item['label'] == label:
antique['id'] = item.get('id')
matchedArray.append(antique)
if len(matchedArray) > 0:
parsed_json_data['matchedArray'] = matchedArray
logging.info(f"{parsed_json_data}")
return jsonify({'message': 'File uploaded successfully','text': message.content,
'data': parsed_json_data}), 200
@@ -372,6 +403,9 @@ def start_background_cleaner():
# 应用启动时启动清理线程
start_background_cleaner()
# 在返回大模型对话的文本中同时生成tts音频由dialog_service 中的StreamSessionManager进行管理
# session_id 为 def create_session(self, tts_model,sample_rate =8000, stream_format='mp3'):
# session_id = str(uuid.uuid4())
@manager.route('/tts_stream/<session_id>',methods=['GET'])
def tts_stream(session_id):
session = stream_manager.sessions.get(session_id)
@@ -415,7 +449,6 @@ def tts_stream(session_id):
if session:
# 延迟关闭会话,确保所有数据已发送
stream_manager.close_session(session_id)
logging.info(f"Session {session_id} closed. {total_audio_strean_length}")
# 关键响应头设置
if session['stream_format'] == "wav":
@@ -656,7 +689,8 @@ def dialog_tts_post(tenant_id, chat_id):
f"{tts_sample_rate} {tts_stream_format}")
# 返回音频流URL
return jsonify({"tts_url": audio_stream_url, "audio_stream_id": audio_stream_id,
"sample_rate":tts_sample_rate, "stream_format":tts_stream_format,})
"sample_rate":tts_sample_rate, "stream_format":tts_stream_format,
"ws_url":audio_stream_url})
except Exception as e:
logging.error(f"请求处理失败: {str(e)}", exc_info=True)
@@ -802,6 +836,15 @@ def minio_put_obj(tenant_id):
except Exception as e:
return get_error_data_result(message=f"minio put object error {e}")
@manager.route('/minio/list/<bucket>/<prefix>', methods=['GET'])
@token_required
def list_objects(tenant_id,bucket: str, prefix: str = "", recursive: bool = True):
try:
result=minio_client.list_objects(bucket,prefix ,True)
return get_result(data=result)
except Exception as e:
return get_error_data_result(message=f"minio put list objects error {e}")
#------------------------------------------------
def audio_fade_in(audio_data, fade_length):
# 假设音频数据是16位单声道PCM