diff --git a/backend/ai_services/services.py b/backend/ai_services/services.py index b7d43f7..223d876 100644 --- a/backend/ai_services/services.py +++ b/backend/ai_services/services.py @@ -89,32 +89,34 @@ class AliyunTingwuService: # 根据官方文档,离线任务的 type 通常就是 'offline' request.add_query_param('type', 'offline') - # AppKey - request.add_query_param('AppKey', self.tingwu_app_key) - - # 配置 Input - input_param = { - "FileUrl": file_url, - "SourceLanguage": language, - "TaskKey": str(uuid.uuid4()) - } - request.add_query_param('Input', json.dumps(input_param)) - - # 配置 Parameters (开启自动章节和摘要) - parameters = { - "Transcoding": { - "TargetAudioFormat": "mp3" + # 构造请求体 (Body) + # 根据听悟 API 文档,AppKey, Input, Parameters 应位于 JSON Body 中 + # 而不是 Query Parameter + body = { + "AppKey": self.tingwu_app_key, + "Input": { + "FileUrl": file_url, + "SourceLanguage": language, + "TaskKey": str(uuid.uuid4()) }, - "AutoChaptersEnabled": True, - "SummarizationEnabled": True + "Parameters": { + "Transcoding": { + "TargetAudioFormat": "mp3" + }, + "AutoChaptersEnabled": True, + "SummarizationEnabled": True + } } - request.add_query_param('Parameters', json.dumps(parameters)) + + # 设置 Body 内容 + request.set_content(json.dumps(body)) + request.add_header('Content-Type', 'application/json') # 强制设置 Endpoint,避免 SDK.EndpointResolvingError # 听悟目前主要服务点在北京 request.set_endpoint("tingwu.cn-beijing.aliyuncs.com") - # 显式设置 Method 为 POST,因为 SDK 默认可能是 PUT (针对 CreateTask) + # 显式设置 Method 为 PUT request.set_method('PUT') try: diff --git a/backend/ai_services/views.py b/backend/ai_services/views.py index 26e6230..c0fa5fa 100644 --- a/backend/ai_services/views.py +++ b/backend/ai_services/views.py @@ -102,7 +102,12 @@ class TranscriptionTaskViewSet(viewsets.ModelViewSet): # 3. 调用听悟接口创建任务 try: tingwu_response = service.create_transcription_task(oss_url) - task_id = tingwu_response.get('TaskId') + + # 兼容处理响应结构,通常为 {"Data": {"TaskId": "...", ...}} + if 'Data' in tingwu_response and isinstance(tingwu_response['Data'], dict): + task_id = tingwu_response['Data'].get('TaskId') + else: + task_id = tingwu_response.get('TaskId') if task_id: task_record.task_id = task_id @@ -152,13 +157,19 @@ class TranscriptionTaskViewSet(viewsets.ModelViewSet): service = AliyunTingwuService() try: result = service.get_task_info(task.task_id) - task_status = result.get('TaskStatus') + + # 兼容处理响应结构 {"Data": {"TaskStatus": "...", "Result": ...}} + data_obj = result.get('Data', result) + if not isinstance(data_obj, dict): + data_obj = result + + task_status = data_obj.get('TaskStatus') if task_status == 'COMPLETE': task.status = TranscriptionTask.Status.SUCCEEDED # 解析结果 - task_result = result.get('Result', {}) + task_result = data_obj.get('Result', {}) # 提取逐字稿 sentences = task_result.get('Transcription', {}).get('Sentences', []) @@ -190,7 +201,7 @@ class TranscriptionTaskViewSet(viewsets.ModelViewSet): elif task_status == 'FAILED': task.status = TranscriptionTask.Status.FAILED - task.error_message = result.get('TaskStatusText', 'Unknown error') + task.error_message = data_obj.get('TaskStatusText', result.get('Message', 'Unknown error')) task.save() # 其他状态 (PENDING, RUNNING) 不做更改