86 lines
2.9 KiB
Plaintext
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)
|