1
This commit is contained in:
90
src/services/creation-audio/creationAudioGenerationClient.ts
Normal file
90
src/services/creation-audio/creationAudioGenerationClient.ts
Normal 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}`);
|
||||
}
|
||||
1
src/services/creation-audio/index.ts
Normal file
1
src/services/creation-audio/index.ts
Normal file
@@ -0,0 +1 @@
|
||||
export * from './creationAudioGenerationClient';
|
||||
Reference in New Issue
Block a user