From 84ff54f9d7f9a1d8ada1084b1c6b4af076d0d1bf Mon Sep 17 00:00:00 2001 From: darkskygit Date: Tue, 15 Apr 2025 03:59:23 +0000 Subject: [PATCH] feat(server): make slide audio transcript parallel (#11692) --- .../backend/server/src/models/copilot-job.ts | 9 ++++ .../src/plugins/copilot/transcript/service.ts | 49 ++++++++++--------- 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/packages/backend/server/src/models/copilot-job.ts b/packages/backend/server/src/models/copilot-job.ts index 861928fb5f..404a0f082d 100644 --- a/packages/backend/server/src/models/copilot-job.ts +++ b/packages/backend/server/src/models/copilot-job.ts @@ -9,6 +9,11 @@ import { CopilotJob } from './common/copilot'; type CreateCopilotJobInput = Omit; type UpdateCopilotJobInput = Pick; +const FinishedStatus: Set = new Set([ + AiJobStatus.finished, + AiJobStatus.claimed, +]); + /** * Copilot Job Model */ @@ -90,6 +95,10 @@ export class CopilotJobModel extends BaseModel { data: { status: data.status || undefined, payload: data.payload || undefined, + finishedAt: + data.status && FinishedStatus.has(data.status) + ? new Date() + : undefined, }, }); return ret.count > 0; diff --git a/packages/backend/server/src/plugins/copilot/transcript/service.ts b/packages/backend/server/src/plugins/copilot/transcript/service.ts index 6eb05cd581..c4650b0111 100644 --- a/packages/backend/server/src/plugins/copilot/transcript/service.ts +++ b/packages/backend/server/src/plugins/copilot/transcript/service.ts @@ -212,6 +212,28 @@ export class CopilotTranscriptionService { return `${hoursStr}:${minutesStr}:${secondsStr}`; } + private async callTranscript(url: string, mimeType: string, offset: number) { + const result = await this.chatWithPrompt( + 'Transcript audio', + { + attachments: [url], + params: { mimetype: mimeType }, + }, + TranscriptionResponseSchema + ); + + const transcription = TranscriptionResponseSchema.parse( + JSON.parse(result) + ).map(t => ({ + speaker: t.a, + start: this.convertTime(t.s, offset), + end: this.convertTime(t.e, offset), + transcription: t.t, + })); + + return transcription; + } + @OnJob('copilot.transcript.submit') async transcriptAudio({ jobId, @@ -222,28 +244,11 @@ export class CopilotTranscriptionService { }: Jobs['copilot.transcript.submit']) { try { const blobInfos = this.mergeInfos(infos, url, mimeType); - const transcriptions = []; - for (const [idx, { url, mimeType }] of blobInfos.entries()) { - const result = await this.chatWithPrompt( - 'Transcript audio', - { - attachments: [url], - params: { mimetype: mimeType }, - }, - TranscriptionResponseSchema - ); - - const offset = idx * 10 * 60; - const transcription = TranscriptionResponseSchema.parse( - JSON.parse(result) - ).map(t => ({ - speaker: t.a, - start: this.convertTime(t.s, offset), - end: this.convertTime(t.e, offset), - transcription: t.t, - })); - transcriptions.push(transcription); - } + const transcriptions = await Promise.all( + Array.from(blobInfos.entries()).map(([idx, { url, mimeType }]) => + this.callTranscript(url, mimeType, idx * 10 * 60) + ) + ); await this.models.copilotJob.update(jobId, { payload: { transcription: transcriptions.flat() },