Files
market_page/backend/ai_services/services.py
jeremygan2021 6d5be796cd
All checks were successful
Deploy to Server / deploy (push) Successful in 13s
tingwu_new
2026-03-11 14:55:37 +08:00

126 lines
4.4 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 json
import logging
import time
import uuid
import oss2
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException, ServerException
# 尝试导入最新的 API 版本,如果有问题可能需要调整
try:
from aliyunsdktingwu.request.v20230930 import CreateTaskRequest, GetTaskInfoRequest
except ImportError:
# Fallback or error handling if version differs
pass
from django.conf import settings
logger = logging.getLogger(__name__)
class AliyunTingwuService:
def __init__(self):
self.access_key_id = settings.ALIYUN_ACCESS_KEY_ID
self.access_key_secret = settings.ALIYUN_ACCESS_KEY_SECRET
self.oss_bucket_name = settings.ALIYUN_OSS_BUCKET_NAME
self.oss_endpoint = settings.ALIYUN_OSS_ENDPOINT
self.tingwu_app_key = settings.ALIYUN_TINGWU_APP_KEY
self.region_id = "cn-beijing" # 听悟服务主要在北京
# 初始化 OSS Bucket
if self.access_key_id and self.access_key_secret and self.oss_endpoint:
auth = oss2.Auth(self.access_key_id, self.access_key_secret)
self.bucket = oss2.Bucket(auth, self.oss_endpoint, self.oss_bucket_name)
else:
self.bucket = None
logger.warning("Aliyun OSS configuration missing.")
# 初始化听悟 Client
if self.access_key_id and self.access_key_secret:
self.client = AcsClient(
self.access_key_id,
self.access_key_secret,
self.region_id
)
else:
self.client = None
logger.warning("Aliyun AccessKey configuration missing.")
def upload_to_oss(self, file_obj, file_name):
"""
上传文件到 OSS 并返回带签名的 URL (有效期 3 小时)
"""
if not self.bucket:
raise Exception("OSS Client not initialized")
try:
# 上传文件
# file_obj 应该是打开的文件对象或字节流
self.bucket.put_object(file_name, file_obj)
# 生成签名 URL有效期 3 小时 (3600 * 3)
url = self.bucket.sign_url('GET', file_name, 3600 * 3)
return url
except Exception as e:
logger.error(f"OSS Upload failed: {e}")
raise e
def create_transcription_task(self, file_url, language="cn"):
"""
创建听悟转写任务
"""
if not self.client:
raise Exception("Tingwu Client not initialized")
request = CreateTaskRequest.CreateTaskRequest()
# 听悟新版 SDK 20230930 版本的 AppKey 设置方式可能不同
# 尝试使用通用的 set_app_key 或通过请求参数传递
try:
request.set_AppKey(self.tingwu_app_key)
except AttributeError:
try:
request.set_app_key(self.tingwu_app_key)
except AttributeError:
# 如果都没有,尝试作为参数直接设置 (某些版本的 SDK 行为)
request.add_query_param('AppKey', self.tingwu_app_key)
# 配置 Input
input_param = {
"FileUrl": file_url,
"SourceLanguage": language,
"TaskKey": str(uuid.uuid4())
}
request.set_Input(json.dumps(input_param))
# 配置 Parameters (开启自动章节和摘要)
parameters = {
"Transcoding": {
"TargetAudioFormat": "mp3"
},
"AutoChaptersEnabled": True,
"SummarizationEnabled": True
}
request.set_Parameters(json.dumps(parameters))
try:
response = self.client.do_action_with_exception(request)
return json.loads(response)
except (ClientException, ServerException) as e:
logger.error(f"Tingwu CreateTask failed: {e}")
raise e
def get_task_info(self, task_id):
"""
查询任务状态和结果
"""
if not self.client:
raise Exception("Tingwu Client not initialized")
request = GetTaskInfoRequest.GetTaskInfoRequest()
request.set_TaskId(task_id)
try:
response = self.client.do_action_with_exception(request)
return json.loads(response)
except (ClientException, ServerException) as e:
logger.error(f"Tingwu GetTaskInfo failed: {e}")
raise e