MCPcopy Create free account
hub / github.com/TejasQ/gen-subs / createTextFromAudioFile

Function createTextFromAudioFile

createTextFromAudioFile.ts:11–74  ·  view source on GitHub ↗
(
  spinner: Ora,
  fileName: string,
  modelName: string
)

Source from the content-addressed store, hash-verified

9import { __dirname, workingDir } from "./util";
10
11export const createTextFromAudioFile = (
12 spinner: Ora,
13 fileName: string,
14 modelName: string
15): Promise<RecognitionResults[]> =>
16 new Promise(async (resolve, reject) => {
17 const model = await loadModel(join(workingDir, "models", modelName));
18 spinner.text = "Listening...";
19
20 if (!fileName) {
21 throw new Error("Source audio file name is not provided.");
22 }
23
24 const fileStats = await stat(fileName);
25 const totalSize = fileStats.size;
26 let bytesRead = 0;
27 let lastLoggedPercentage = 0;
28
29 const updateProgressBar = (currentSize: number) => {
30 const percentage = Math.round((currentSize / totalSize) * 100);
31 const totalResults = results.length;
32 const preview = results.map((result) => result.text).join(" ");
33 if (percentage !== lastLoggedPercentage) {
34 spinner.text = `Listening... (${percentage}%).\nHeard so far:\n\n\t${totalResults > 1 ? `[...] ${preview.slice(-360)} [...]` : preview}`;
35 lastLoggedPercentage = percentage;
36 }
37 };
38
39 const wfReader = new wav.Reader();
40 const wfReadable = new Readable().wrap(wfReader);
41 let results: RecognitionResults[] = [];
42
43 wfReader.on("format", async (format: AudioFormat) => {
44 if (format.audioFormat !== 1 || format.channels !== 1) {
45 throw new Error("Audio file must be WAV format mono PCM.");
46 }
47 spinner.text = "Creating recognizer...";
48 const recognizer = new vosk.Recognizer({
49 model,
50 sampleRate: format.sampleRate,
51 });
52 recognizer.setWords(true);
53
54 spinner.text = "Listening. Heard so far: ";
55
56 for await (const data of wfReadable) {
57 bytesRead += data.length;
58 updateProgressBar(bytesRead);
59 const endOfSpeech = recognizer.acceptWaveform(data);
60 if (endOfSpeech) {
61 const result = recognizer.result();
62 results.push(result);
63 }
64 }
65 spinner.clear();
66 recognizer.free();
67 model.free();
68 resolve(results);

Callers 1

forActionFunction · 0.90

Calls 2

loadModelFunction · 0.90
updateProgressBarFunction · 0.85

Tested by

no test coverage detected