react-native-executorch
Version:
An easy way to run AI models in react native with ExecuTorch
82 lines (76 loc) • 2.34 kB
text/typescript
import { useEffect, useState } from 'react';
import { SpeechToTextController } from '../../controllers/SpeechToTextController';
import { ResourceSource } from '../../types/common';
interface SpeechToTextModule {
isReady: boolean;
isGenerating: boolean;
sequence: string;
downloadProgress: number;
configureStreaming: SpeechToTextController['configureStreaming'];
error: Error | undefined;
transcribe: (
input: number[]
) => ReturnType<SpeechToTextController['transcribe']>;
}
export const useSpeechToText = ({
modelName,
encoderSource,
decoderSource,
tokenizerSource,
overlapSeconds,
windowSize,
streamingConfig,
}: {
modelName: 'moonshine' | 'whisper';
encoderSource?: ResourceSource;
decoderSource?: ResourceSource;
tokenizerSource?: ResourceSource;
overlapSeconds?: ConstructorParameters<
typeof SpeechToTextController
>['0']['overlapSeconds'];
windowSize?: ConstructorParameters<
typeof SpeechToTextController
>['0']['windowSize'];
streamingConfig?: ConstructorParameters<
typeof SpeechToTextController
>['0']['streamingConfig'];
}): SpeechToTextModule => {
const [sequence, setSequence] = useState<string>('');
const [isReady, setIsReady] = useState(false);
const [downloadProgress, setDownloadProgress] = useState(0);
const [isGenerating, setIsGenerating] = useState(false);
const [error, setError] = useState<Error | undefined>();
const [model, _] = useState(
() =>
new SpeechToTextController({
transcribeCallback: setSequence,
isReadyCallback: setIsReady,
isGeneratingCallback: setIsGenerating,
onErrorCallback: setError,
modelDownloadProgessCallback: setDownloadProgress,
overlapSeconds: overlapSeconds,
windowSize: windowSize,
streamingConfig: streamingConfig,
})
);
useEffect(() => {
const loadModel = async () => {
await model.loadModel(
modelName,
encoderSource,
decoderSource,
tokenizerSource
);
};
loadModel();
}, [model, modelName, encoderSource, decoderSource, tokenizerSource]);
return {
isReady,
isGenerating,
downloadProgress,
configureStreaming: model.configureStreaming,
sequence,
error,
transcribe: (waveform: number[]) => model.transcribe(waveform),
};
};