feat: Add base project structure with API and web components
This commit is contained in:
112
api/app/utils/volc_asr.py
Normal file
112
api/app/utils/volc_asr.py
Normal file
@@ -0,0 +1,112 @@
|
||||
import requests
|
||||
import json
|
||||
import uuid
|
||||
import os
|
||||
import time
|
||||
from datetime import datetime
|
||||
from app.core.config import settings
|
||||
|
||||
|
||||
# 火山的ASR
|
||||
class VolcASR:
|
||||
def __init__(self):
|
||||
self.app_key = settings.VOLC_APP_KEY # 需要替换为实际的APP KEY
|
||||
self.access_key = settings.VOLC_ACCESS_KEY # 需要替换为实际的Access Key
|
||||
self.submit_url = settings.VOLC_SUBMIT_URL
|
||||
self.query_url = settings.VOLC_QUERY_URL
|
||||
|
||||
def get_headers(self):
|
||||
request_id = str(uuid.uuid4())
|
||||
return {
|
||||
"X-Api-App-Key": self.app_key,
|
||||
"X-Api-Access-Key": self.access_key,
|
||||
"X-Api-Resource-Id": "volc.bigasr.auc",
|
||||
"X-Api-Request-Id": request_id,
|
||||
"X-Api-Sequence": "-1",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
|
||||
def submit_task(self, audio_url):
|
||||
headers = self.get_headers()
|
||||
data = {
|
||||
"audio": {
|
||||
"url": audio_url
|
||||
}
|
||||
}
|
||||
|
||||
response = requests.post(self.submit_url, headers=headers, json=data)
|
||||
return response.headers.get("X-Api-Request-Id"), response.headers.get("X-Api-Status-Code")
|
||||
|
||||
def query_result(self, task_id):
|
||||
headers = self.get_headers()
|
||||
headers["X-Api-Request-Id"] = task_id
|
||||
|
||||
while True:
|
||||
response = requests.post(self.query_url, headers=headers, json={})
|
||||
status_code = response.headers.get("X-Api-Status-Code")
|
||||
|
||||
if status_code == "20000000": # 成功
|
||||
return response.json()
|
||||
elif status_code in ["20000001", "20000002"]: # 处理中或在队列中
|
||||
time.sleep(1)
|
||||
continue
|
||||
elif status_code in ["20000003"]: # 静音音频
|
||||
raise Exception(f"静音音频: {status_code}")
|
||||
elif status_code in ["45000001"]: # 请求参数无效
|
||||
raise Exception(f"请求参数无效: {status_code}")
|
||||
elif status_code in ["45000002"]: # 空音频
|
||||
raise Exception(f"空音频: {status_code}")
|
||||
elif status_code in ["45000151"]: # 音频格式不正确
|
||||
raise Exception(f"音频格式不正确: {status_code}")
|
||||
elif status_code in ["55000031"]: # 服务器繁忙
|
||||
raise Exception(f"服务器繁忙: {status_code}")
|
||||
else:
|
||||
raise Exception(f"服务内部处理错误: {status_code}")
|
||||
|
||||
|
||||
def main():
|
||||
# 音频URL
|
||||
audio_url = "https://fosun-lcp-clickpaas.oss-cn-shanghai.aliyuncs.com/fosun-dify-files-images/test.mp3"
|
||||
|
||||
# 输出目录
|
||||
output_dir = "/Users/sbtjfdn/Downloads"
|
||||
os.makedirs(output_dir, exist_ok=True)
|
||||
|
||||
# 初始化ASR客户端
|
||||
asr_client = VolcASR()
|
||||
|
||||
try:
|
||||
# 提交任务
|
||||
print("提交语音识别任务...")
|
||||
task_id, status_code = asr_client.submit_task(audio_url)
|
||||
if not task_id:
|
||||
raise Exception("提交任务失败,未获取到任务ID")
|
||||
|
||||
print(f"任务ID: {task_id}")
|
||||
|
||||
# 查询结果
|
||||
print("等待识别结果...")
|
||||
result = asr_client.query_result(task_id)
|
||||
|
||||
# 保存结果
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||
output_file = os.path.join(output_dir, f"result_{timestamp}.json")
|
||||
|
||||
with open(output_file, "w", encoding="utf-8") as f:
|
||||
json.dump(result, f, ensure_ascii=False, indent=2)
|
||||
|
||||
print(f"识别结果已保存到: {output_file}")
|
||||
|
||||
# 如果有识别文本,单独保存文本文件
|
||||
if "result" in result and "text" in result["result"]:
|
||||
text_file = os.path.join(output_dir, f"text_{timestamp}.txt")
|
||||
with open(text_file, "w", encoding="utf-8") as f:
|
||||
f.write(result["result"]["text"])
|
||||
print(f"识别文本已保存到: {text_file}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"发生错误: {str(e)}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user