guoyu/Test/python/baidu_speech_server.py

173 lines
5.0 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 -*-
"""
百度语音识别服务超级简单不需要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
BAIDU_APP_ID = "你的APP_ID" # ← 需要替换
BAIDU_API_KEY = "你的API_KEY" # ← 需要替换
BAIDU_SECRET_KEY = "你的SECRET_KEY" # ← 需要替换
# 懒加载客户端
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)