guoyu/Test/python/baidu_speech_server.py

173 lines
5.0 KiB
Python
Raw Normal View History

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
百度语音识别服务超级简单不需要ffmpeg
免费额度每天50000次
"""
from flask import Flask, request, jsonify
from flask_cors import CORS
import base64
import json
from difflib import SequenceMatcher
app = Flask(__name__)
CORS(app)
# 百度语音识别配置(需要申请)
# 免费申请地址https://console.bce.baidu.com/ai/#/ai/speech/overview/index
2025-12-11 23:28:07 +08:00
BAIDU_APP_ID = "121208452"
BAIDU_API_KEY = "RtL2IfV3FbLnVDDacRV6QDae"
BAIDU_SECRET_KEY = "NobJaGFov7II95fnFUBNGBk0Wm3fcNIB"
# 懒加载客户端
asr_client = None
def get_asr_client():
"""获取百度语音识别客户端"""
global asr_client
if asr_client is None:
try:
from aip import AipSpeech
asr_client = AipSpeech(BAIDU_APP_ID, BAIDU_API_KEY, BAIDU_SECRET_KEY)
print("✓ 百度语音客户端初始化成功")
except ImportError:
print("✗ 未安装百度SDK请运行: pip install baidu-aip")
return None
except Exception as e:
print(f"✗ 初始化失败: {str(e)}")
return None
return asr_client
def recognize_audio_baidu(audio_data, format='mp3'):
"""使用百度API识别音频"""
try:
client = get_asr_client()
if not client:
return None, "百度语音客户端未初始化"
# 百度API识别
result = client.asr(audio_data, format, 16000, {
'dev_pid': 1537, # 中文普通话
})
if result['err_no'] == 0:
text = ''.join(result['result'])
return text, None
else:
return None, f"识别失败: {result.get('err_msg', '未知错误')}"
except Exception as e:
return None, str(e)
def calculate_similarity(text1, text2):
"""计算文本相似度0-100分"""
if not text1 or not text2:
return 0
text1 = text1.replace(" ", "")
text2 = text2.replace(" ", "")
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' not in request.files:
return jsonify({
'code': 400,
'msg': '未上传音频文件'
}), 400
audio_file = request.files['audio']
reference_text = request.form.get('referenceText', '')
# 读取音频数据
audio_data = audio_file.read()
print(f"收到音频: {len(audio_data)} bytes")
print(f"参考文本: {reference_text}")
# 识别音频百度API自动处理格式
recognized_text, error = recognize_audio_baidu(audio_data, format='mp3')
if error:
return jsonify({
'code': 500,
'msg': f'识别失败: {error}'
}), 500
if not recognized_text:
return jsonify({
'code': 500,
'msg': '未识别到有效语音'
}), 500
# 计算评分
score = calculate_similarity(recognized_text, reference_text)
pronunciation_score = max(0, score - 5)
fluency_score = max(0, score - 3)
print(f"识别结果: {recognized_text}")
print(f"相似度: {score}")
return jsonify({
'code': 200,
'msg': '成功',
'data': {
'recognizedText': recognized_text,
'score': score,
'pronunciationScore': pronunciation_score,
'fluencyScore': fluency_score,
'status': 'completed'
}
})
except Exception as e:
print(f"处理错误: {str(e)}")
return jsonify({
'code': 500,
'msg': f'处理失败: {str(e)}'
}), 500
@app.route('/api/speech/health', methods=['GET'])
def health():
"""健康检查"""
client = get_asr_client()
return jsonify({
'code': 200,
'msg': '服务正常',
'data': {
'engine': 'baidu',
'client_ready': client is not None
}
})
if __name__ == '__main__':
print("=" * 50)
print("百度语音识别服务超简单无需ffmpeg")
print("=" * 50)
print("")
print("1. 安装依赖: pip install baidu-aip")
print("2. 申请百度API: https://console.bce.baidu.com/ai/#/ai/speech/overview/index")
print("3. 填写 APP_ID, API_KEY, SECRET_KEY")
print("")
if BAIDU_APP_ID == "你的APP_ID":
print("⚠️ 请先配置百度API密钥")
print("")
print("=" * 50)
print("服务启动成功!")
print("访问地址: http://localhost:5000")
print("=" * 50)
print("")
app.run(host='0.0.0.0', port=5000, debug=False)