UNPKG

use-stt

Version:

React hook for speech-to-text using multiple STT providers

161 lines (153 loc) 4.85 kB
import { FFmpeg } from '@ffmpeg/ffmpeg'; type STTProvider = 'whisper' | 'azure' | 'google'; interface TranscriptionSegment { text: string; start: number; end: number; confidence?: number; } interface TranscriptionResult { text: string; language?: string; confidence?: number; segments?: TranscriptionSegment[]; } interface TranscriptionOptions { language?: string; prompt?: string; } type AudioMimeType = 'audio/webm' | 'audio/mp4' | 'audio/wav' | 'audio/ogg'; interface AudioMetadata { duration: number; sampleRate: number; channels: number; format: AudioMimeType; size: number; } interface FFmpegConfig { inputFormat?: string; inputSampleRate?: number; inputChannels?: number; outputFormat?: string; outputSampleRate?: number; outputChannels?: number; codec?: string; bitrate?: string; normalize?: boolean; normalizationLevel?: number; denoise?: boolean; trim?: { start?: number; duration?: number; }; compressionLevel?: number; vad?: boolean; vadLevel?: number; filters?: string[]; } interface STTOptions { provider: STTProvider; transcribe: (audioBlob: Blob) => Promise<{ transcript: string; confidence?: number; }>; language?: string; model?: string; prompt?: string; onResult?: (result: STTResult) => void; onError?: (error: Error) => void; onStart?: () => void; onEnd?: () => void; disabled?: boolean; } interface STTResult { transcript: string; isFinal: boolean; confidence?: number; } interface STTErrorData { code: string; message: string; provider?: STTProvider; } interface STTState { isRecording: boolean; isProcessing: boolean; transcript: string; error: Error | null; } interface STTAdapter { transcribe(audioBlob: Blob, options?: TranscriptionOptions): Promise<TranscriptionResult>; start(): Promise<void>; stop(): Promise<void>; pause(): Promise<void>; resume(): Promise<void>; abort(): void; } interface UseSTTResult { transcript: string; isRecording: boolean; isProcessing: boolean; error: Error | null; isInitialized: boolean; isStopping: boolean; startRecording: () => Promise<void>; stopRecording: () => Promise<void>; pauseRecording: () => void; resumeRecording: () => void; } declare function useSTT(options: STTOptions): UseSTTResult; interface AudioRecorderOptions { onDataAvailable?: (data: Blob) => void; onError?: (error: Error) => void; mimeType?: string; } declare class AudioRecorder { private mediaRecorder; private stream; private options; constructor(options: AudioRecorderOptions); private getSupportedMimeType; start(): Promise<void>; stop(): Promise<void>; pause(): void; resume(): void; private cleanup; } declare abstract class BaseAdapter { protected options: STTOptions; protected recorder: AudioRecorder | null; protected resultCallback?: (result: STTResult) => void; protected errorCallback?: (error: Error) => void; protected startCallback?: () => void; protected endCallback?: () => void; constructor(options: STTOptions); protected handleError(error: unknown): void; protected abstract processAudio(audioBlob: Blob): Promise<STTResult>; start(): Promise<void>; stop(): Promise<void>; pause(): void; resume(): void; abort(): Promise<void>; onResult(callback: (result: STTResult) => void): void; onError(callback: (error: Error) => void): void; onStart(callback: () => void): void; onEnd(callback: () => void): void; } interface WhisperAdapterOptions extends STTOptions { ffmpeg: FFmpeg; onResult?: (result: STTResult) => void; onError?: (error: Error) => void; onStart?: () => void; onEnd?: () => void; } declare class WhisperAdapter extends BaseAdapter { private ffmpeg; constructor(options: WhisperAdapterOptions); protected processAudio(audioBlob: Blob): Promise<STTResult>; } declare function convertAudioToWebM(ffmpeg: FFmpeg, file: File | Blob, config?: FFmpegConfig): Promise<Blob>; declare function convertAudioToMono(ffmpeg: FFmpeg, file: File | Blob): Promise<Blob>; declare function convertWithFFmpeg(ffmpeg: FFmpeg, file: File | Blob, config?: FFmpegConfig): Promise<Blob>; declare function getAudioMetadata(ffmpeg: FFmpeg, file: File | Blob): Promise<AudioMetadata>; export { type AudioMetadata, type AudioMimeType, type FFmpegConfig, type STTAdapter, type STTErrorData, type STTOptions, type STTProvider, type STTResult, type STTState, type TranscriptionOptions, type TranscriptionResult, type TranscriptionSegment, WhisperAdapter, convertAudioToMono, convertAudioToWebM, convertWithFFmpeg, getAudioMetadata, useSTT };