This commit is contained in:
2026-05-11 20:27:41 +08:00
parent e30b733b17
commit 481a27fc53
60 changed files with 6357 additions and 1100 deletions

View File

@@ -0,0 +1,90 @@
import type {
AudioGenerationTaskResponse,
CreateBackgroundMusicRequest,
CreateSoundEffectRequest,
GeneratedAudioAssetResponse,
PublishGeneratedAudioAssetRequest,
} from '../../../packages/shared/src/contracts/creationAudio';
import { type ApiRetryOptions, requestJson } from '../apiClient';
const CREATION_AUDIO_API_BASE = '/api/creation/audio';
const CREATION_AUDIO_RETRY: ApiRetryOptions = {
maxRetries: 1,
baseDelayMs: 500,
maxDelayMs: 1200,
retryUnsafeMethods: true,
};
export function createBackgroundMusicTask(payload: CreateBackgroundMusicRequest) {
return requestJson<AudioGenerationTaskResponse>(
`${CREATION_AUDIO_API_BASE}/background-music`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
},
'提交背景音乐生成失败',
{ retry: CREATION_AUDIO_RETRY, timeoutMs: 20000 },
);
}
export function publishBackgroundMusicAsset(
taskId: string,
payload: PublishGeneratedAudioAssetRequest,
) {
return requestJson<GeneratedAudioAssetResponse>(
`${CREATION_AUDIO_API_BASE}/background-music/${encodeURIComponent(taskId)}/asset`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
},
'生成背景音乐素材失败',
{ retry: CREATION_AUDIO_RETRY, timeoutMs: 30000 },
);
}
export function createSoundEffectTask(payload: CreateSoundEffectRequest) {
return requestJson<AudioGenerationTaskResponse>(
`${CREATION_AUDIO_API_BASE}/sound-effect`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
},
'提交音效生成失败',
{ retry: CREATION_AUDIO_RETRY, timeoutMs: 20000 },
);
}
export function publishSoundEffectAsset(
taskId: string,
payload: PublishGeneratedAudioAssetRequest,
) {
return requestJson<GeneratedAudioAssetResponse>(
`${CREATION_AUDIO_API_BASE}/sound-effect/${encodeURIComponent(taskId)}/asset`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
},
'生成音效素材失败',
{ retry: CREATION_AUDIO_RETRY, timeoutMs: 30000 },
);
}
export async function waitForGeneratedAudioAsset(
taskId: string,
publish: () => Promise<GeneratedAudioAssetResponse>,
) {
let latestAsset: GeneratedAudioAssetResponse | null = null;
for (let attempt = 0; attempt < 40; attempt += 1) {
latestAsset = await publish();
if (latestAsset.audioSrc?.trim()) {
return latestAsset;
}
await new Promise((resolve) => window.setTimeout(resolve, 3000));
}
throw new Error(latestAsset?.status || `音频生成超时:${taskId}`);
}

View File

@@ -0,0 +1 @@
export * from './creationAudioGenerationClient';