feat(server): support sliced audio (#11562)

fix AF-2479
This commit is contained in:
darkskygit
2025-04-09 08:21:19 +00:00
parent 06497773a7
commit 15abb78a6b
15 changed files with 239 additions and 75 deletions
@@ -88,3 +88,47 @@ Generated by [AVA](https://avajs.dev).
],
},
]
> should submit audio transcription job
[
{
status: 'running',
},
]
> should claim audio transcription job
[
{
status: 'claimed',
summary: '[{"a":"A","s":30,"e":45,"t":"Hello, everyone."},{"a":"B","s":46,"e":70,"t":"Hi, thank you for joining the meeting today."}]',
title: '[{"a":"A","s":30,"e":45,"t":"Hello, everyone."},{"a":"B","s":46,"e":70,"t":"Hi, thank you for joining the meeting today."}]',
transcription: [
{
end: '00:00:45',
speaker: 'A',
start: '00:00:30',
transcription: 'Hello, everyone.',
},
{
end: '00:01:10',
speaker: 'B',
start: '00:00:46',
transcription: 'Hi, thank you for joining the meeting today.',
},
{
end: '00:10:45',
speaker: 'A',
start: '00:10:30',
transcription: 'Hello, everyone.',
},
{
end: '00:11:10',
speaker: 'B',
start: '00:10:46',
transcription: 'Hi, thank you for joining the meeting today.',
},
],
},
]
@@ -883,34 +883,67 @@ test('should be able to transcript', async t => {
'[{"a":"A","s":30,"e":45,"t":"Hello, everyone."},{"a":"B","s":46,"e":70,"t":"Hi, thank you for joining the meeting today."}]'
);
const job = await submitAudioTranscription(
app,
workspaceId,
'blobId',
'test.mp3',
Buffer.from([1, 1])
);
t.snapshot(
cleanObject([job], ['id']),
'should submit audio transcription job'
);
t.truthy(job.id, 'should have job id');
// wait for processing
{
let { status } = (await audioTranscription(app, workspaceId, job.id)) || {};
const job = await submitAudioTranscription(app, workspaceId, '1', '1.mp3', [
Buffer.from([1, 1]),
]);
t.snapshot(
cleanObject([job], ['id']),
'should submit audio transcription job'
);
t.truthy(job.id, 'should have job id');
while (status !== 'finished') {
await new Promise(resolve => setTimeout(resolve, 1000));
({ status } = (await audioTranscription(app, workspaceId, job.id)) || {});
// wait for processing
{
let { status } =
(await audioTranscription(app, workspaceId, job.id)) || {};
while (status !== 'finished') {
await new Promise(resolve => setTimeout(resolve, 1000));
({ status } =
(await audioTranscription(app, workspaceId, job.id)) || {});
}
}
{
const result = await claimAudioTranscription(app, job.id);
t.snapshot(
cleanObject([result], ['id']),
'should claim audio transcription job'
);
}
}
{
const result = await claimAudioTranscription(app, job.id);
// sliced audio
const job = await submitAudioTranscription(app, workspaceId, '2', '2.mp3', [
Buffer.from([1, 1]),
Buffer.from([1, 2]),
]);
t.snapshot(
cleanObject([result], ['id']),
'should claim audio transcription job'
cleanObject([job], ['id']),
'should submit audio transcription job'
);
t.truthy(job.id, 'should have job id');
// wait for processing
{
let { status } =
(await audioTranscription(app, workspaceId, job.id)) || {};
while (status !== 'finished') {
await new Promise(resolve => setTimeout(resolve, 1000));
({ status } =
(await audioTranscription(app, workspaceId, job.id)) || {});
}
}
{
const result = await claimAudioTranscription(app, job.id);
t.snapshot(
cleanObject([result], ['id']),
'should claim audio transcription job'
);
}
}
});
@@ -335,17 +335,17 @@ export async function submitAudioTranscription(
workspaceId: string,
blobId: string,
fileName: string,
content: Buffer
content: Buffer[]
): Promise<{ id: string; status: string }> {
const res = await app
let resp = app
.POST('/graphql')
.set({ 'x-request-id': 'test', 'x-operation-name': 'test' })
.field(
'operations',
JSON.stringify({
query: `
mutation submitAudioTranscription($blob: Upload!, $blobId: String!, $workspaceId: String!) {
submitAudioTranscription(blob: $blob, blobId: $blobId, workspaceId: $workspaceId) {
mutation submitAudioTranscription($blob: Upload, $blobs: [Upload!], $blobId: String!, $workspaceId: String!) {
submitAudioTranscription(blob: $blob, blobs: $blobs, blobId: $blobId, workspaceId: $workspaceId) {
id
status
}
@@ -353,17 +353,29 @@ export async function submitAudioTranscription(
`,
variables: {
blob: null,
blobs: [],
blobId,
workspaceId,
},
})
)
.field('map', JSON.stringify({ '0': ['variables.blob'] }))
.attach('0', content, {
.field(
'map',
JSON.stringify(
Array.from<any>({ length: content.length }).reduce((acc, _, idx) => {
acc[idx.toString()] = [`variables.blobs.${idx}`];
return acc;
}, {})
)
);
for (const [idx, buffer] of content.entries()) {
resp = resp.attach(idx.toString(), buffer, {
filename: fileName,
contentType: 'application/octet-stream',
})
.expect(200);
});
}
const res = await resp.expect(200);
return res.body.data.submitAudioTranscription;
}