diff options
| author | kcfancher <keli@keisi.co> | 2026-03-28 14:06:40 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-03-28 19:06:40 +0100 |
| commit | 63496d05a2f78b061f6d848fd00ece223acd7514 (patch) | |
| tree | 2f53a05a7d8285430b62831318ce9118bef0e1ef | |
| parent | f2eed05d36846cd771458b20e77840e907084bc5 (diff) | |
| download | opencut-63496d05a2f78b061f6d848fd00ece223acd7514.tar.gz | |
Fix transcription sample-rate handling (#740)
Fix for #703.
Adds an optional sampleRate parameter to the decodeAudioToFloat32() function. The caption transcriber passes in a value of 16000 to prepare audio in the format Whisper expects.
| -rw-r--r-- | apps/web/src/components/editor/panels/assets/views/captions.tsx | 10 | ||||
| -rw-r--r-- | apps/web/src/constants/transcription-constants.ts | 2 | ||||
| -rw-r--r-- | apps/web/src/lib/media/audio.ts | 4 |
3 files changed, 13 insertions, 3 deletions
diff --git a/apps/web/src/components/editor/panels/assets/views/captions.tsx b/apps/web/src/components/editor/panels/assets/views/captions.tsx index 7a3b16bf..a73fd693 100644 --- a/apps/web/src/components/editor/panels/assets/views/captions.tsx +++ b/apps/web/src/components/editor/panels/assets/views/captions.tsx @@ -11,7 +11,10 @@ import { useState, useRef } from "react"; import { extractTimelineAudio } from "@/lib/media/mediabunny"; import { useEditor } from "@/hooks/use-editor"; import { DEFAULT_TEXT_ELEMENT } from "@/constants/text-constants"; -import { TRANSCRIPTION_LANGUAGES } from "@/constants/transcription-constants"; +import { + DEFAULT_TRANSCRIPTION_SAMPLE_RATE, + TRANSCRIPTION_LANGUAGES, +} from "@/constants/transcription-constants"; import type { TranscriptionLanguage, TranscriptionProgress, @@ -52,7 +55,10 @@ export function Captions() { }); setProcessingStep("Preparing audio..."); - const { samples } = await decodeAudioToFloat32({ audioBlob }); + const { samples } = await decodeAudioToFloat32({ + audioBlob, + sampleRate: DEFAULT_TRANSCRIPTION_SAMPLE_RATE, + }); const result = await transcriptionService.transcribe({ audioData: samples, diff --git a/apps/web/src/constants/transcription-constants.ts b/apps/web/src/constants/transcription-constants.ts index 3fa914f2..ed19147c 100644 --- a/apps/web/src/constants/transcription-constants.ts +++ b/apps/web/src/constants/transcription-constants.ts @@ -51,6 +51,8 @@ export const TRANSCRIPTION_MODELS: TranscriptionModel[] = [ export const DEFAULT_TRANSCRIPTION_MODEL: TranscriptionModelId = "whisper-small"; +export const DEFAULT_TRANSCRIPTION_SAMPLE_RATE = 16000; + export const DEFAULT_CHUNK_LENGTH_SECONDS = 30; export const DEFAULT_STRIDE_SECONDS = 5; diff --git a/apps/web/src/lib/media/audio.ts b/apps/web/src/lib/media/audio.ts index 6f789301..e96f158b 100644 --- a/apps/web/src/lib/media/audio.ts +++ b/apps/web/src/lib/media/audio.ts @@ -34,10 +34,12 @@ export interface DecodedAudio { export async function decodeAudioToFloat32({ audioBlob, + sampleRate, }: { audioBlob: Blob; + sampleRate?: number; }): Promise<DecodedAudio> { - const audioContext = createAudioContext(); + const audioContext = createAudioContext({ sampleRate }); const arrayBuffer = await audioBlob.arrayBuffer(); const audioBuffer = await audioContext.decodeAudioData(arrayBuffer); |
