guoyu/Test/python/simple_speech_server.py

136 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
简化版语音服务 - 无需PaddleSpeech
仅做文本对比评分先让APP能用起来
"""
from flask import Flask, request, jsonify
from flask_cors import CORS
import os
import time
from difflib import SequenceMatcher
app = Flask(__name__)
CORS(app)
def calculate_similarity(text1, text2):
"""计算文本相似度"""
if not text1 or not text2:
return 0
text1 = ''.join(filter(str.isalnum, text1))
text2 = ''.join(filter(str.isalnum, text2))
if not text1 or not text2:
return 0
similarity = SequenceMatcher(None, text1, text2).ratio()
return round(similarity * 100, 2)
@app.route('/api/speech/recognize', methods=['POST'])
def recognize():
"""
临时方案:让用户手动输入识别文本
后续接入真实语音识别
"""
try:
# 检查是否有音频文件(暂时忽略,不处理)
if 'audio' in request.files:
audio_file = request.files['audio']
# 保存音频以便后续处理
temp_dir = './temp_audio'
if not os.path.exists(temp_dir):
os.makedirs(temp_dir)
timestamp = str(int(time.time() * 1000))
temp_path = os.path.join(temp_dir, f'audio_{timestamp}.wav')
audio_file.save(temp_path)
print(f"已保存音频: {temp_path}")
reference_text = request.form.get('referenceText', '')
# 模拟识别:返回提示让用户手动输入
# 实际应用中,这里应该调用语音识别
return jsonify({
'code': 200,
'msg': '音频已接收,请手动输入识别文本进行评分',
'data': {
'recognizedText': '', # 空的,让前端手动输入
'score': 0,
'pronunciationScore': 0,
'fluencyScore': 0,
'status': 'completed',
'needManualInput': True # 标记需要手动输入
}
})
except Exception as e:
print(f"错误: {str(e)}")
return jsonify({
'code': 500,
'msg': f'处理失败: {str(e)}'
}), 500
@app.route('/api/speech/evaluate', methods=['POST'])
def evaluate():
"""
评测接口:对比用户输入和标准文本
"""
try:
user_text = request.form.get('userText', '')
reference_text = request.form.get('referenceText', '')
if not user_text:
return jsonify({
'code': 400,
'msg': '缺少用户输入文本'
}), 400
# 计算相似度
score = calculate_similarity(user_text, reference_text)
pronunciation_score = max(0, score - 5)
fluency_score = max(0, score - 3)
return jsonify({
'code': 200,
'msg': '评测成功',
'data': {
'recognizedText': user_text,
'score': score,
'pronunciationScore': pronunciation_score,
'fluencyScore': fluency_score,
'status': 'completed'
}
})
except Exception as e:
return jsonify({
'code': 500,
'msg': f'评测失败: {str(e)}'
}), 500
@app.route('/api/speech/health', methods=['GET'])
def health():
"""健康检查"""
return jsonify({
'code': 200,
'msg': '服务正常(简化版)',
'data': {
'version': 'simple',
'speech_recognition': False
}
})
if __name__ == '__main__':
print("=" * 50)
print("简化版语音服务")
print("说明:音频接收后需手动输入识别文本")
print("=" * 50)
print("")
print("服务启动在: http://localhost:5000")
print("")
app.run(host='0.0.0.0', port=5000, debug=False)