mirror of
https://github.com/OpenCut-app/OpenCut.git
synced 2026-07-13 21:52:53 +02:00
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.
This commit is contained in:
@@ -11,7 +11,10 @@ import { useState, useRef } from "react";
|
|||||||
import { extractTimelineAudio } from "@/lib/media/mediabunny";
|
import { extractTimelineAudio } from "@/lib/media/mediabunny";
|
||||||
import { useEditor } from "@/hooks/use-editor";
|
import { useEditor } from "@/hooks/use-editor";
|
||||||
import { DEFAULT_TEXT_ELEMENT } from "@/constants/text-constants";
|
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 {
|
import type {
|
||||||
TranscriptionLanguage,
|
TranscriptionLanguage,
|
||||||
TranscriptionProgress,
|
TranscriptionProgress,
|
||||||
@@ -52,7 +55,10 @@ export function Captions() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
setProcessingStep("Preparing audio...");
|
setProcessingStep("Preparing audio...");
|
||||||
const { samples } = await decodeAudioToFloat32({ audioBlob });
|
const { samples } = await decodeAudioToFloat32({
|
||||||
|
audioBlob,
|
||||||
|
sampleRate: DEFAULT_TRANSCRIPTION_SAMPLE_RATE,
|
||||||
|
});
|
||||||
|
|
||||||
const result = await transcriptionService.transcribe({
|
const result = await transcriptionService.transcribe({
|
||||||
audioData: samples,
|
audioData: samples,
|
||||||
|
|||||||
@@ -51,6 +51,8 @@ export const TRANSCRIPTION_MODELS: TranscriptionModel[] = [
|
|||||||
export const DEFAULT_TRANSCRIPTION_MODEL: TranscriptionModelId =
|
export const DEFAULT_TRANSCRIPTION_MODEL: TranscriptionModelId =
|
||||||
"whisper-small";
|
"whisper-small";
|
||||||
|
|
||||||
|
export const DEFAULT_TRANSCRIPTION_SAMPLE_RATE = 16000;
|
||||||
|
|
||||||
export const DEFAULT_CHUNK_LENGTH_SECONDS = 30;
|
export const DEFAULT_CHUNK_LENGTH_SECONDS = 30;
|
||||||
export const DEFAULT_STRIDE_SECONDS = 5;
|
export const DEFAULT_STRIDE_SECONDS = 5;
|
||||||
|
|
||||||
|
|||||||
@@ -34,10 +34,12 @@ export interface DecodedAudio {
|
|||||||
|
|
||||||
export async function decodeAudioToFloat32({
|
export async function decodeAudioToFloat32({
|
||||||
audioBlob,
|
audioBlob,
|
||||||
|
sampleRate,
|
||||||
}: {
|
}: {
|
||||||
audioBlob: Blob;
|
audioBlob: Blob;
|
||||||
|
sampleRate?: number;
|
||||||
}): Promise<DecodedAudio> {
|
}): Promise<DecodedAudio> {
|
||||||
const audioContext = createAudioContext();
|
const audioContext = createAudioContext({ sampleRate });
|
||||||
const arrayBuffer = await audioBlob.arrayBuffer();
|
const arrayBuffer = await audioBlob.arrayBuffer();
|
||||||
const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);
|
const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user