#!/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 = "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)