tingwu_new
All checks were successful
Deploy to Server / deploy (push) Successful in 16s

This commit is contained in:
jeremygan2021
2026-03-11 20:12:14 +08:00
parent b0e97ed140
commit 504db66b0b

View File

@@ -66,9 +66,12 @@ class TranscriptionTaskViewSet(viewsets.ModelViewSet):
'file': { 'file': {
'type': 'string', 'type': 'string',
'format': 'binary' 'format': 'binary'
},
'file_url': {
'type': 'string',
'description': '音频文件的URL地址'
} }
}, }
'required': ['file']
} }
}, },
responses={201: TranscriptionTaskSerializer} responses={201: TranscriptionTaskSerializer}
@@ -78,20 +81,27 @@ class TranscriptionTaskViewSet(viewsets.ModelViewSet):
上传音频文件并创建听悟转写任务 上传音频文件并创建听悟转写任务
""" """
file_obj = request.FILES.get('file') file_obj = request.FILES.get('file')
if not file_obj: file_url = request.data.get('file_url')
return Response({'error': '未提供文件'}, status=status.HTTP_400_BAD_REQUEST)
if not file_obj and not file_url:
return Response({'error': '请提供文件或文件URL'}, status=status.HTTP_400_BAD_REQUEST)
service = AliyunTingwuService() service = AliyunTingwuService()
if not service.bucket or not service.client: if not service.bucket or not service.client:
return Response({'error': '阿里云服务未配置'}, status=status.HTTP_503_SERVICE_UNAVAILABLE) return Response({'error': '阿里云服务未配置'}, status=status.HTTP_503_SERVICE_UNAVAILABLE)
try: try:
# 1. 上传文件到 OSS oss_url = None
file_extension = file_obj.name.split('.')[-1] if file_obj:
file_name = f"transcription/{uuid.uuid4()}.{file_extension}" # 1. 上传文件到 OSS
file_extension = file_obj.name.split('.')[-1]
# 使用服务上传 file_name = f"transcription/{uuid.uuid4()}.{file_extension}"
oss_url = service.upload_to_oss(file_obj, file_name)
# 使用服务上传
oss_url = service.upload_to_oss(file_obj, file_name)
else:
# 使用提供的 URL
oss_url = file_url
# 2. 创建数据库记录 # 2. 创建数据库记录
task_record = TranscriptionTask.objects.create( task_record = TranscriptionTask.objects.create(
@@ -228,41 +238,51 @@ class TranscriptionTaskViewSet(viewsets.ModelViewSet):
logger.error(f"Error downloading transcription nested url: {e}") logger.error(f"Error downloading transcription nested url: {e}")
if isinstance(transcription_data, dict): if isinstance(transcription_data, dict):
# 尝试多种可能的路径提取句子 # 确定包含实际内容的字典源
# 1. 直接在根目录: {"Sentences": [...]} # 下载的 JSON 可能结构为 {"TaskId": "...", "Transcription": { "Sentences": [...] }}
# 2. 在 Transcription 字段下: {"Transcription": {"Sentences": [...]}} # 或者 {"Sentences": [...]}
# 3. 可能是 Paragraphs 结构 content_source = transcription_data
sentences = transcription_data.get('Sentences', [])
if not sentences and 'Transcription' in transcription_data: # 如果存在嵌套的 Transcription 键,且它是字典,则优先使用它
sentences = transcription_data['Transcription'].get('Sentences', []) if 'Transcription' in transcription_data and isinstance(transcription_data['Transcription'], dict):
content_source = transcription_data['Transcription']
logger.info(f"Using nested Transcription dict, keys: {content_source.keys()}")
# 尝试提取 Sentences
sentences = content_source.get('Sentences', [])
# 尝试提取 Paragraphs
# 注意Paragraphs 字段本身可能是一个列表,或者是一个包含 Paragraphs 键的字典
paragraphs_data = content_source.get('Paragraphs', [])
if sentences: if sentences:
full_text = " ".join([s.get('Text', '') for s in sentences]) full_text = " ".join([s.get('Text', '') for s in sentences])
task.transcription = full_text task.transcription = full_text
elif 'Paragraphs' in transcription_data: elif paragraphs_data:
# 尝试从段落中提取 # 处理 Paragraphs
paragraphs = transcription_data.get('Paragraphs', {}) para_list = []
if isinstance(paragraphs, dict): if isinstance(paragraphs_data, dict):
# Paragraphs 可能是一个字典,包含 list # 有时结构是 {"Paragraphs": {"Paragraphs": [...]}} 或者 {"Paragraphs": [...]}
para_list = paragraphs.get('Paragraphs', []) # 有时候是嵌套的 para_list = paragraphs_data.get('Paragraphs', [])
if not para_list and isinstance(paragraphs, list): # 如果取出来是空的,但 paragraphs_data 本身有内容,可能结构不同,暂不处理深层嵌套
para_list = paragraphs elif isinstance(paragraphs_data, list):
elif isinstance(paragraphs, list): para_list = paragraphs_data
para_list = paragraphs
if para_list:
texts = []
for p in para_list:
if 'Text' in p:
texts.append(p['Text'])
elif 'Sentences' in p:
for s in p['Sentences']:
if 'Text' in s:
texts.append(s['Text'])
task.transcription = "\n".join(texts)
logger.info(f"Extracted {len(texts)} paragraphs")
else: else:
para_list = [] logger.warning(f"Paragraphs found but failed to extract list. Type: {type(paragraphs_data)}")
texts = []
for p in para_list:
if 'Text' in p:
texts.append(p['Text'])
elif 'Sentences' in p:
for s in p['Sentences']:
if 'Text' in s:
texts.append(s['Text'])
task.transcription = "\n".join(texts)
else: else:
logger.warning(f"Could not find Sentences or Paragraphs in transcription data: {transcription_data.keys()}") logger.warning(f"Could not find Sentences or Paragraphs in content source. Keys: {content_source.keys()}")
# 提取总结 # 提取总结
# 总结结果结构可能因配置不同而异,这里尝试获取摘要 # 总结结果结构可能因配置不同而异,这里尝试获取摘要