# -*- 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)