86 lines
2.9 KiB
Plaintext

# -*- coding:utf-8 -*-
import json
import os
import time
import uuid
# 通用参数
mode = params_kw.get('mode', 'lyrics_only') # audio_lyrics, video_lyrics, lyrics_only
scene = params_kw.get('scene', 'pop')
lyric_threshold = float(params_kw.get('lyric_threshold', 8.5))
music_threshold = float(params_kw.get('music_threshold', 7.5))
# 模式特定参数
input_audio = params_kw.get('input_audio', '') # Mode A
input_video = params_kw.get('input_video', '') # Mode B
lyrics = params_kw.get('lyrics', '') # Mode A, B, C
outline = params_kw.get('outline', '') # Mode C (alternative to lyrics)
description = params_kw.get('description', '') # Mode C (legacy)
title = params_kw.get('title', '未知歌曲')
lyricist = params_kw.get('lyricist', '未知')
composer = params_kw.get('composer', '未知')
# 验证模式参数
if mode == 'audio_lyrics':
if not input_audio:
return json.dumps({'status': 'error', 'error': 'audio_lyrics mode requires input_audio'}, ensure_ascii=False)
if not lyrics:
return json.dumps({'status': 'error', 'error': 'audio_lyrics mode requires lyrics'}, ensure_ascii=False)
elif mode == 'video_lyrics':
if not input_video:
return json.dumps({'status': 'error', 'error': 'video_lyrics mode requires input_video'}, ensure_ascii=False)
if not lyrics:
return json.dumps({'status': 'error', 'error': 'video_lyrics mode requires lyrics'}, ensure_ascii=False)
elif mode == 'lyrics_only':
if not lyrics and not outline and not description:
return json.dumps({'status': 'error', 'error': 'lyrics_only mode requires lyrics, outline, or description'}, ensure_ascii=False)
else:
return json.dumps({'status': 'error', 'error': f'invalid mode: {mode}'}, ensure_ascii=False)
pipeline_id = f'ktv_{uuid.uuid4().hex[:12]}'
import aioredis
redis = await aioredis.from_url('redis://127.0.0.1:6379', db=1)
pipeline_data = {
'id': pipeline_id,
'state': 'submitted',
'mode': mode,
'scene': scene,
'lyric_threshold': lyric_threshold,
'music_threshold': music_threshold,
'lyrics': lyrics,
'outline': outline,
'description': description,
'input_audio': input_audio,
'input_video': input_video,
'title': title,
'lyricist': lyricist,
'composer': composer,
'created_at': time.time(),
'artifacts': {},
'errors': []
}
await redis.set(f'pipeline:{pipeline_id}', json.dumps(pipeline_data, ensure_ascii=False), ex=86400)
await redis.close()
from ahserver.serverenv import ServerEnv
env = ServerEnv()
longtasks = env.longtasks
payload = json.dumps({
'task_type': 'ktv_pipeline',
'pipeline_id': pipeline_id,
})
task_id = await longtasks.submit_task(payload)
return json.dumps({
'status': 'success',
'pipeline_id': pipeline_id,
'task_id': task_id,
'mode': mode,
'message': f'KTV pipeline submitted: {pipeline_id} (mode: {mode})',
'query_url': f'/api/pipeline_status?pipeline_id={pipeline_id}'
}, ensure_ascii=False)