主要修改在asr-monitor-test 修改小程序手机号码登录 小程序的TTS生成(查一查、AI) 增加和支付相关的功能
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user