Files
dsProject/dsLightRag/Routes/XunFeiRoute_cn.py
2025-09-06 10:57:28 +08:00

91 lines
3.3 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.

import logging
import os
import uuid
import tempfile
import shutil
import sys
from fastapi import APIRouter, UploadFile, File, Form
# 配置日志
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/xunFeiCn", tags=["讯飞"])
# 音频保存目录
UPLOAD_DIR = os.path.join(os.path.dirname(__file__), "..", "static", "audio")
os.makedirs(UPLOAD_DIR, exist_ok=True)
# 讯飞配置
sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
from Config.Config import XF_APPID, XF_APIKEY, XF_APISECRET
@router.post("/save-audio")
async def save_audio(audio: UploadFile = File(...), txt: str = Form(...)):
"""保存音频文件并评分"""
temp_file = None
try:
# 1. 保存音频到临时文件
temp_dir = tempfile.mkdtemp()
temp_file = os.path.join(temp_dir, f"temp_{uuid.uuid4().hex}.wav")
content = await audio.read()
with open(temp_file, "wb") as f:
f.write(content)
# 3. 保存到正式目录
file_name = f"audio_{uuid.uuid4().hex}.wav"
file_path = os.path.join(UPLOAD_DIR, file_name)
shutil.copy2(temp_file, file_path)
logger.info(f"已保存文件到: {file_path}")
# 添加wav转mp3功能
import subprocess
# 修改MP3保存路径为UPLOAD_DIR使用相同文件名前缀
mp3_file_name = os.path.splitext(file_name)[0] + ".mp3"
mp3_file_path = os.path.join(UPLOAD_DIR, mp3_file_name)
"""
ffmpeg -i audio_00008a1143e64d75bd51e7b0c9e7ce2b.wav \
-ar 16000 -ac 1 -acodec libmp3lame -b:a 64k \
out_16k_16bit_mono.mp3
"""
try:
# 使用ffmpeg将wav转换为mp3
subprocess.run(
["ffmpeg", "-i", temp_file, "-ar", "16000", "-ac", "1", "-acodec", "libmp3lame", "-b:a", "128k", "-y", mp3_file_path],
check=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
logger.info(f"已将wav转换为mp3: {mp3_file_path}")
except subprocess.CalledProcessError as e:
logger.error(f"ffmpeg转换失败: {e.stderr.decode()}")
raise Exception(f"音频格式转换失败: {e.stderr.decode()}")
# 2. 讯飞评分
from KeDaXunFei.XunFeiAudioEvaluator_cn import XunFeiAudioEvaluator_cn
evaluator = XunFeiAudioEvaluator_cn(
appid=XF_APPID,
api_key=XF_APIKEY,
api_secret=XF_APISECRET,
audio_file=mp3_file_path, # 使用新的MP3路径
txt=txt
)
results, eval_time = evaluator.run_evaluation()
print(evaluator.get_evaluation_summary())
return {
"success": True,
"file_name": file_name,
"file_path": f"/static/audio/{file_name}",
"evaluation": results,
"evaluation_time": str(eval_time)
}
except Exception as e:
logger.error(f"处理失败: {str(e)}")
return {"success": False, "error": str(e)}
finally:
# 4. 清理临时文件
if temp_file and os.path.exists(temp_file):
shutil.rmtree(os.path.dirname(temp_file), ignore_errors=True)