@omnimedia/omnitool 1.1.0-10 → 1.1.0-12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/s/context.ts +0 -7
- package/s/demo/demo.bundle.ts +30 -5
- package/s/demo/routines/waveform-test.ts +3 -2
- package/s/driver/driver.ts +2 -2
- package/s/timeline/parts/compositor/export.ts +5 -5
- package/s/timeline/parts/compositor/playback.ts +6 -7
- package/s/timeline/parts/compositor/samplers/webcodecs.ts +5 -4
- package/s/timeline/parts/waveform.ts +2 -3
- package/s/timeline/sugar/omni-test.ts +3 -1
- package/s/timeline/sugar/omni.ts +6 -1
- package/x/context.d.ts +1 -4
- package/x/context.js +1 -5
- package/x/context.js.map +1 -1
- package/x/demo/demo.bundle.js +18 -6
- package/x/demo/demo.bundle.js.map +1 -1
- package/x/demo/demo.bundle.min.js +577 -9
- package/x/demo/demo.bundle.min.js.map +4 -4
- package/x/demo/routines/waveform-test.d.ts +2 -1
- package/x/demo/routines/waveform-test.js +2 -2
- package/x/demo/routines/waveform-test.js.map +1 -1
- package/x/driver/driver.d.ts +1 -1
- package/x/driver/driver.js +1 -1
- package/x/driver/driver.js.map +1 -1
- package/x/index.html +2 -2
- package/x/timeline/parts/compositor/export.d.ts +3 -1
- package/x/timeline/parts/compositor/export.js +6 -6
- package/x/timeline/parts/compositor/export.js.map +1 -1
- package/x/timeline/parts/compositor/playback.d.ts +4 -2
- package/x/timeline/parts/compositor/playback.js +7 -8
- package/x/timeline/parts/compositor/playback.js.map +1 -1
- package/x/timeline/parts/compositor/samplers/webcodecs.d.ts +2 -1
- package/x/timeline/parts/compositor/samplers/webcodecs.js +1 -4
- package/x/timeline/parts/compositor/samplers/webcodecs.js.map +1 -1
- package/x/timeline/parts/waveform.d.ts +2 -1
- package/x/timeline/parts/waveform.js +1 -3
- package/x/timeline/parts/waveform.js.map +1 -1
- package/x/timeline/sugar/omni-test.js +3 -1
- package/x/timeline/sugar/omni-test.js.map +1 -1
- package/x/timeline/sugar/omni.d.ts +3 -0
- package/x/timeline/sugar/omni.js +6 -1
- package/x/timeline/sugar/omni.js.map +1 -1
- package/s/tools/common/loader.ts +0 -26
- package/s/tools/common/transformer-pipeline.ts +0 -26
- package/s/tools/speech-recognition/common/model.ts +0 -26
- package/s/tools/speech-recognition/whisper/fns/host.ts +0 -25
- package/s/tools/speech-recognition/whisper/fns/schematic.ts +0 -23
- package/s/tools/speech-recognition/whisper/fns/work.ts +0 -91
- package/s/tools/speech-recognition/whisper/parts/types.ts +0 -38
- package/s/tools/speech-recognition/whisper/parts/worker.bundle.ts +0 -7
- package/s/tools/speech-recognition/whisper/tool.ts +0 -70
- package/x/tools/common/loader.d.ts +0 -19
- package/x/tools/common/loader.js +0 -18
- package/x/tools/common/loader.js.map +0 -1
- package/x/tools/common/transformer-pipeline.d.ts +0 -8
- package/x/tools/common/transformer-pipeline.js +0 -24
- package/x/tools/common/transformer-pipeline.js.map +0 -1
- package/x/tools/speech-recognition/common/model.d.ts +0 -14
- package/x/tools/speech-recognition/common/model.js +0 -16
- package/x/tools/speech-recognition/common/model.js.map +0 -1
- package/x/tools/speech-recognition/whisper/fns/host.d.ts +0 -13
- package/x/tools/speech-recognition/whisper/fns/host.js +0 -19
- package/x/tools/speech-recognition/whisper/fns/host.js.map +0 -1
- package/x/tools/speech-recognition/whisper/fns/schematic.d.ts +0 -19
- package/x/tools/speech-recognition/whisper/fns/schematic.js +0 -2
- package/x/tools/speech-recognition/whisper/fns/schematic.js.map +0 -1
- package/x/tools/speech-recognition/whisper/fns/work.d.ts +0 -12
- package/x/tools/speech-recognition/whisper/fns/work.js +0 -74
- package/x/tools/speech-recognition/whisper/fns/work.js.map +0 -1
- package/x/tools/speech-recognition/whisper/parts/types.d.ts +0 -31
- package/x/tools/speech-recognition/whisper/parts/types.js +0 -2
- package/x/tools/speech-recognition/whisper/parts/types.js.map +0 -1
- package/x/tools/speech-recognition/whisper/parts/worker.bundle.d.ts +0 -1
- package/x/tools/speech-recognition/whisper/parts/worker.bundle.js +0 -4
- package/x/tools/speech-recognition/whisper/parts/worker.bundle.js.map +0 -1
- package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js +0 -8
- package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js.map +0 -7
- package/x/tools/speech-recognition/whisper/tool.d.ts +0 -12
- package/x/tools/speech-recognition/whisper/tool.js +0 -63
- package/x/tools/speech-recognition/whisper/tool.js.map +0 -1
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
export interface ProgressItem {
|
|
2
|
-
id: string
|
|
3
|
-
progress: number
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
export type Word = {
|
|
7
|
-
text: string
|
|
8
|
-
timestamp: [start: number, end: number]
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export type WordGroup = Word[]
|
|
12
|
-
export type Transcript = WordGroup[]
|
|
13
|
-
|
|
14
|
-
export interface TranscriptionChunk {
|
|
15
|
-
text: string
|
|
16
|
-
offset: number
|
|
17
|
-
timestamp: [number, number]
|
|
18
|
-
finalised: boolean
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export interface TranscriptionMessage {
|
|
22
|
-
audio: Float32Array
|
|
23
|
-
model: string
|
|
24
|
-
subtask: string | null
|
|
25
|
-
language: string | null
|
|
26
|
-
duration: number
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export interface TranscriptionResult {
|
|
30
|
-
text: string
|
|
31
|
-
chunks: TranscriptionChunk[]
|
|
32
|
-
tps: number
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export type ProgressCallback = (data: any) => void
|
|
36
|
-
|
|
37
|
-
export type SpeechRecognizerModels = "onnx-community/whisper-tiny_timestamped"
|
|
38
|
-
export type SpeechRecognizerSubtasks = "transcribe"
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import {Comrade, Thread} from "@e280/comrade"
|
|
2
|
-
|
|
3
|
-
import {WordGroup} from "./parts/types.js"
|
|
4
|
-
import {context} from "../../../context.js"
|
|
5
|
-
import {setupWhisperHost} from "./fns/host.js"
|
|
6
|
-
import {SpeechRecognizer} from "../common/model.js"
|
|
7
|
-
import {WhisperSchematic} from "./fns/schematic.js"
|
|
8
|
-
|
|
9
|
-
export class Whisper extends SpeechRecognizer {
|
|
10
|
-
constructor(public thread: Thread<WhisperSchematic>) {
|
|
11
|
-
super('whisper', "onnx-community/whisper-tiny_timestamped")
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
static async setup() {
|
|
15
|
-
const thread = await Comrade.thread<WhisperSchematic>({
|
|
16
|
-
label: "OmnitoolDriver",
|
|
17
|
-
workerUrl: new URL("/tools/speech-recognition/whisper/parts/worker.bundle.min.js", import.meta.url),
|
|
18
|
-
setupHost: setupWhisperHost({
|
|
19
|
-
...this.loaderEvents,
|
|
20
|
-
...this.speechRecognizerEvents
|
|
21
|
-
})
|
|
22
|
-
})
|
|
23
|
-
return new this(thread)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
async init() {
|
|
27
|
-
// there should be called loading of the model in worker instead when transcribe is called ..
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
async #transcribe(source: Blob, options?: {multilingual?: boolean, language?: string}) {
|
|
31
|
-
const arrayBuffer = await source.arrayBuffer()
|
|
32
|
-
const audioCTX = new AudioContext({sampleRate: 16000})
|
|
33
|
-
const audioData = await audioCTX.decodeAudioData(arrayBuffer)
|
|
34
|
-
let audio
|
|
35
|
-
if (audioData.numberOfChannels === 2) {
|
|
36
|
-
const SCALING_FACTOR = Math.sqrt(2)
|
|
37
|
-
const left = audioData.getChannelData(0)
|
|
38
|
-
const right = audioData.getChannelData(1)
|
|
39
|
-
audio = new Float32Array(left.length)
|
|
40
|
-
for (let i = 0; i < audioData.length; ++i) {
|
|
41
|
-
audio[i] = (SCALING_FACTOR * (left[i] + right[i])) / 2
|
|
42
|
-
}
|
|
43
|
-
} else {
|
|
44
|
-
audio = audioData.getChannelData(0)
|
|
45
|
-
}
|
|
46
|
-
const driver = await context.driver
|
|
47
|
-
const duration = await driver.getAudioDuration(source)
|
|
48
|
-
return await this.thread.work.transcribe({
|
|
49
|
-
audio,
|
|
50
|
-
duration,
|
|
51
|
-
model: this.model,
|
|
52
|
-
subtask: this.multilingual ? "transcribe" : null,
|
|
53
|
-
language:
|
|
54
|
-
this.multilingual && options?.language !== "auto"
|
|
55
|
-
? options?.language ?? "english"
|
|
56
|
-
: null
|
|
57
|
-
})
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
async transcribe(source: Blob): Promise<WordGroup> {
|
|
61
|
-
const result = await this.#transcribe(source)
|
|
62
|
-
|
|
63
|
-
const words = result?.chunks.map((chunk: any) => ({
|
|
64
|
-
text: chunk.text.trim(),
|
|
65
|
-
timestamp: chunk.timestamp,
|
|
66
|
-
})) as WordGroup
|
|
67
|
-
|
|
68
|
-
return words
|
|
69
|
-
}
|
|
70
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Pub } from "@e280/stz";
|
|
2
|
-
import { ProgressItem } from "../speech-recognition/whisper/parts/types.js";
|
|
3
|
-
export interface LoaderEvents {
|
|
4
|
-
onModelLoadProgress: Pub<ProgressItem[]>;
|
|
5
|
-
onTpsUpdate: Pub<[number]>;
|
|
6
|
-
}
|
|
7
|
-
export declare abstract class Loader {
|
|
8
|
-
readonly name: string;
|
|
9
|
-
model: string;
|
|
10
|
-
tps: number;
|
|
11
|
-
static loaderEvents: {
|
|
12
|
-
onModelLoadProgress: Pub<ProgressItem[]>;
|
|
13
|
-
onTpsUpdate: Pub<[number]>;
|
|
14
|
-
};
|
|
15
|
-
constructor(name: string, model: string);
|
|
16
|
-
abstract init(): Promise<void>;
|
|
17
|
-
abstract setModel(model: string): void;
|
|
18
|
-
setTps(value: number): void;
|
|
19
|
-
}
|
package/x/tools/common/loader.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { pub } from "@e280/stz";
|
|
2
|
-
export class Loader {
|
|
3
|
-
name;
|
|
4
|
-
model;
|
|
5
|
-
tps = 0;
|
|
6
|
-
static loaderEvents = {
|
|
7
|
-
onModelLoadProgress: pub(),
|
|
8
|
-
onTpsUpdate: pub()
|
|
9
|
-
};
|
|
10
|
-
constructor(name, model) {
|
|
11
|
-
this.name = name;
|
|
12
|
-
this.model = model;
|
|
13
|
-
}
|
|
14
|
-
setTps(value) {
|
|
15
|
-
this.tps = value;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=loader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../s/tools/common/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAM,MAAM,WAAW,CAAA;AAQlC,MAAM,OAAgB,MAAM;IAQC;IAAqB;IAPjD,GAAG,GAAG,CAAC,CAAA;IAEP,MAAM,CAAC,YAAY,GAAG;QACrB,mBAAmB,EAAE,GAAG,EAAkB;QAC1C,WAAW,EAAE,GAAG,EAAY;KAC5B,CAAA;IAED,YAA4B,IAAY,EAAS,KAAa;QAAlC,SAAI,GAAJ,IAAI,CAAQ;QAAS,UAAK,GAAL,KAAK,CAAQ;IAAG,CAAC;IAMlE,MAAM,CAAC,KAAa;QACnB,IAAI,CAAC,GAAG,GAAG,KAAK,CAAA;IACjB,CAAC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { ProgressCallback } from "../speech-recognition/whisper/parts/types.js";
|
|
2
|
-
export declare class PipelineFactory {
|
|
3
|
-
task: string;
|
|
4
|
-
instance: any;
|
|
5
|
-
model: string | null;
|
|
6
|
-
constructor(task: string);
|
|
7
|
-
createInstance(model: string, progressCallback?: ProgressCallback): Promise<any>;
|
|
8
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
//@ts-ignore
|
|
2
|
-
import { pipeline } from "https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.7.0/dist/transformers.min.js";
|
|
3
|
-
export class PipelineFactory {
|
|
4
|
-
task;
|
|
5
|
-
instance = null;
|
|
6
|
-
model = null;
|
|
7
|
-
constructor(task) {
|
|
8
|
-
this.task = task;
|
|
9
|
-
}
|
|
10
|
-
async createInstance(model, progressCallback) {
|
|
11
|
-
this.model = model;
|
|
12
|
-
return this.instance = await pipeline(this.task, this.model, {
|
|
13
|
-
dtype: {
|
|
14
|
-
encoder_model: this.model === "onnx-community/whisper-large-v3-turbo"
|
|
15
|
-
? "fp16"
|
|
16
|
-
: "fp32",
|
|
17
|
-
decoder_model_merged: "q4",
|
|
18
|
-
},
|
|
19
|
-
device: "webgpu",
|
|
20
|
-
progress_callback: progressCallback,
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=transformer-pipeline.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transformer-pipeline.js","sourceRoot":"","sources":["../../../s/tools/common/transformer-pipeline.ts"],"names":[],"mappings":"AAAA,YAAY;AACZ,OAAO,EAAC,QAAQ,EAAC,MAAM,uFAAuF,CAAA;AAI9G,MAAM,OAAO,eAAe;IAIR;IAHnB,QAAQ,GAAQ,IAAI,CAAA;IACpB,KAAK,GAAkB,IAAI,CAAA;IAE3B,YAAmB,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAEnC,KAAK,CAAC,cAAc,CAAC,KAAa,EAAE,gBAAmC;QACtE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,OAAO,IAAI,CAAC,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE;YAC5D,KAAK,EAAE;gBACN,aAAa,EACZ,IAAI,CAAC,KAAK,KAAK,uCAAuC;oBACrD,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,MAAM;gBACV,oBAAoB,EAAE,IAAI;aAC1B;YACD,MAAM,EAAE,QAAQ;YAChB,iBAAiB,EAAE,gBAAgB;SACnC,CAAC,CAAA;IACH,CAAC;CACD"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { Loader } from "../../common/loader.js";
|
|
2
|
-
import { DecoderSource } from "../../../driver/fns/schematic.js";
|
|
3
|
-
import { SpeechRecognizerModels, Word, WordGroup } from "../whisper/parts/types.js";
|
|
4
|
-
export declare abstract class SpeechRecognizer extends Loader {
|
|
5
|
-
multilingual: boolean;
|
|
6
|
-
static speechRecognizerEvents: {
|
|
7
|
-
onTranscriptionChunk: import("@e280/stz").Pub<Word[]>;
|
|
8
|
-
onTranscribeProgress: import("@e280/stz").Pub<[number]>;
|
|
9
|
-
};
|
|
10
|
-
abstract transcribe(input: DecoderSource): Promise<WordGroup>;
|
|
11
|
-
setMultilingual(value: boolean): void;
|
|
12
|
-
detectLanguage?(input: Blob | AudioBuffer): Promise<string>;
|
|
13
|
-
setModel(value: SpeechRecognizerModels): void;
|
|
14
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { pub } from "@e280/stz";
|
|
2
|
-
import { Loader } from "../../common/loader.js";
|
|
3
|
-
export class SpeechRecognizer extends Loader {
|
|
4
|
-
multilingual = true;
|
|
5
|
-
static speechRecognizerEvents = {
|
|
6
|
-
onTranscriptionChunk: pub(),
|
|
7
|
-
onTranscribeProgress: pub()
|
|
8
|
-
};
|
|
9
|
-
setMultilingual(value) {
|
|
10
|
-
this.multilingual = value;
|
|
11
|
-
}
|
|
12
|
-
setModel(value) {
|
|
13
|
-
this.model = value;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=model.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../s/tools/speech-recognition/common/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAC,MAAM,WAAW,CAAA;AAE7B,OAAO,EAAC,MAAM,EAAC,MAAM,wBAAwB,CAAA;AAI7C,MAAM,OAAgB,gBAAiB,SAAQ,MAAM;IACpD,YAAY,GAAG,IAAI,CAAA;IAEnB,MAAM,CAAC,sBAAsB,GAAG;QAC/B,oBAAoB,EAAE,GAAG,EAAU;QACnC,oBAAoB,EAAE,GAAG,EAAY;KACrC,CAAA;IAID,eAAe,CAAC,KAAc;QAC7B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAA;IAC1B,CAAC;IAID,QAAQ,CAAC,KAA6B;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACnB,CAAC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { ProgressItem } from "../parts/types.js";
|
|
2
|
-
import { SpeechRecognizerHostEvents } from "./schematic.js";
|
|
3
|
-
export declare const setupWhisperHost: (events: SpeechRecognizerHostEvents) => import("@e280/comrade").SetupHost<{
|
|
4
|
-
work: {
|
|
5
|
-
transcribe(input: import("../parts/types.js").TranscriptionMessage): Promise<import("../parts/types.js").TranscriptionResult | null>;
|
|
6
|
-
};
|
|
7
|
-
host: {
|
|
8
|
-
updateModelLoadProgress(item: ProgressItem): Promise<void>;
|
|
9
|
-
deliverTranscriptionChunk(chunk: import("../parts/types.js").TranscriptionChunk): Promise<void>;
|
|
10
|
-
updateTps(value: number): Promise<void>;
|
|
11
|
-
updateTranscribeProgress(value: number): Promise<void>;
|
|
12
|
-
};
|
|
13
|
-
}>;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Comrade } from "@e280/comrade";
|
|
2
|
-
export const setupWhisperHost = (events) => (Comrade.host(_shell => ({
|
|
3
|
-
async updateModelLoadProgress(item) {
|
|
4
|
-
events.onModelLoadProgress.pub(item);
|
|
5
|
-
},
|
|
6
|
-
async deliverTranscriptionChunk(chunk) {
|
|
7
|
-
events.onTranscriptionChunk.pub({
|
|
8
|
-
text: chunk.text,
|
|
9
|
-
timestamp: chunk.timestamp
|
|
10
|
-
});
|
|
11
|
-
},
|
|
12
|
-
async updateTps(value) {
|
|
13
|
-
events.onTpsUpdate.pub(value);
|
|
14
|
-
},
|
|
15
|
-
async updateTranscribeProgress(value) {
|
|
16
|
-
events.onTranscribeProgress(value);
|
|
17
|
-
}
|
|
18
|
-
})));
|
|
19
|
-
//# sourceMappingURL=host.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../../../../s/tools/speech-recognition/whisper/fns/host.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAA;AAIrC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAkC,EAAE,EAAE,CAAC,CACvE,OAAO,CAAC,IAAI,CAAmB,MAAM,CAAC,EAAE,CAAC,CAAC;IACzC,KAAK,CAAC,uBAAuB,CAAC,IAAI;QACjC,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACrC,CAAC;IACD,KAAK,CAAC,yBAAyB,CAAC,KAAK;QACpC,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC;YAC/B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC1B,CAAC,CAAA;IACH,CAAC;IACD,KAAK,CAAC,SAAS,CAAC,KAAK;QACpB,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC9B,CAAC;IACD,KAAK,CAAC,wBAAwB,CAAC,KAAK;QACnC,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAA;IACnC,CAAC;CACD,CAAC,CAAC,CACH,CAAA"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Pub } from "@e280/stz";
|
|
2
|
-
import { AsSchematic } from "@e280/comrade";
|
|
3
|
-
import { LoaderEvents } from "../../../common/loader.js";
|
|
4
|
-
import { ProgressItem, TranscriptionChunk, TranscriptionMessage, TranscriptionResult, Word } from "../parts/types.js";
|
|
5
|
-
export type WhisperSchematic = AsSchematic<{
|
|
6
|
-
work: {
|
|
7
|
-
transcribe(input: TranscriptionMessage): Promise<TranscriptionResult | null>;
|
|
8
|
-
};
|
|
9
|
-
host: {
|
|
10
|
-
updateModelLoadProgress(item: ProgressItem): Promise<void>;
|
|
11
|
-
deliverTranscriptionChunk(chunk: TranscriptionChunk): Promise<void>;
|
|
12
|
-
updateTps(value: number): Promise<void>;
|
|
13
|
-
updateTranscribeProgress(value: number): Promise<void>;
|
|
14
|
-
};
|
|
15
|
-
}>;
|
|
16
|
-
export interface SpeechRecognizerHostEvents extends LoaderEvents {
|
|
17
|
-
onTranscriptionChunk: Pub<Word[]>;
|
|
18
|
-
onTranscribeProgress: Pub<[number]>;
|
|
19
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schematic.js","sourceRoot":"","sources":["../../../../../s/tools/speech-recognition/whisper/fns/schematic.ts"],"names":[],"mappings":""}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { TranscriptionChunk } from "../parts/types.js";
|
|
2
|
-
export declare const setupWhisperWork: import("@e280/comrade").SetupWork<{
|
|
3
|
-
work: {
|
|
4
|
-
transcribe(input: import("../parts/types.js").TranscriptionMessage): Promise<import("../parts/types.js").TranscriptionResult | null>;
|
|
5
|
-
};
|
|
6
|
-
host: {
|
|
7
|
-
updateModelLoadProgress(item: import("../parts/types.js").ProgressItem): Promise<void>;
|
|
8
|
-
deliverTranscriptionChunk(chunk: TranscriptionChunk): Promise<void>;
|
|
9
|
-
updateTps(value: number): Promise<void>;
|
|
10
|
-
updateTranscribeProgress(value: number): Promise<void>;
|
|
11
|
-
};
|
|
12
|
-
}>;
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { Comrade } from "@e280/comrade";
|
|
2
|
-
//@ts-ignore
|
|
3
|
-
import { WhisperTextStreamer } from "https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.7.0/dist/transformers.min.js";
|
|
4
|
-
import { PipelineFactory } from "../../../common/transformer-pipeline.js";
|
|
5
|
-
// TODO suspicious globals, probably bad
|
|
6
|
-
const pipeline = new PipelineFactory("automatic-speech-recognition");
|
|
7
|
-
let transcriber;
|
|
8
|
-
export const setupWhisperWork = Comrade.work(shell => ({
|
|
9
|
-
async transcribe({ audio, model, language, duration }) {
|
|
10
|
-
const isDistil = model.startsWith("distil-whisper/");
|
|
11
|
-
if (!pipeline.model || pipeline.model !== model) {
|
|
12
|
-
pipeline.instance?.dispose()?.();
|
|
13
|
-
pipeline.instance = null;
|
|
14
|
-
transcriber = await pipeline.createInstance(model, (data) => {
|
|
15
|
-
if (data.progress)
|
|
16
|
-
shell.host.updateModelLoadProgress({
|
|
17
|
-
id: data.file,
|
|
18
|
-
progress: data.progress
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
const timePrecision = transcriber.processor.feature_extractor.config.chunk_length /
|
|
23
|
-
transcriber.model.config.max_source_positions;
|
|
24
|
-
const chunkLength = isDistil ? 20 : 30;
|
|
25
|
-
const strideLength = isDistil ? 3 : 5;
|
|
26
|
-
let chunkCount = 0;
|
|
27
|
-
let startTime = null;
|
|
28
|
-
let tokenCount = 0;
|
|
29
|
-
let tps = 0;
|
|
30
|
-
const chunkDuration = chunkLength - strideLength;
|
|
31
|
-
const estimateProgress = () => {
|
|
32
|
-
const audioProgressSeconds = chunkCount * chunkDuration;
|
|
33
|
-
return Math.min(audioProgressSeconds / duration, 1);
|
|
34
|
-
};
|
|
35
|
-
const streamer = new WhisperTextStreamer(transcriber.tokenizer, {
|
|
36
|
-
time_precision: timePrecision,
|
|
37
|
-
token_callback_function: () => {
|
|
38
|
-
startTime ??= performance.now();
|
|
39
|
-
if (++tokenCount > 1) {
|
|
40
|
-
tps = (tokenCount / (performance.now() - startTime)) * 1000;
|
|
41
|
-
shell.host.updateTps(tps);
|
|
42
|
-
}
|
|
43
|
-
},
|
|
44
|
-
callback_function: (textChunk) => {
|
|
45
|
-
shell.host.deliverTranscriptionChunk(textChunk);
|
|
46
|
-
},
|
|
47
|
-
on_finalize: () => {
|
|
48
|
-
startTime = null;
|
|
49
|
-
tokenCount = 0;
|
|
50
|
-
chunkCount++;
|
|
51
|
-
const progress = estimateProgress();
|
|
52
|
-
shell.host.updateTranscribeProgress(progress);
|
|
53
|
-
},
|
|
54
|
-
});
|
|
55
|
-
const output = await transcriber(audio, {
|
|
56
|
-
top_k: 0,
|
|
57
|
-
do_sample: false,
|
|
58
|
-
chunk_length_s: chunkLength,
|
|
59
|
-
stride_length_s: strideLength,
|
|
60
|
-
language,
|
|
61
|
-
task: "transcribe",
|
|
62
|
-
return_timestamps: "word", // if using "word" the on_chunk_start & end is not called thus we cant retrieve timestamps, only after whole thing finishes
|
|
63
|
-
force_full_sequences: false,
|
|
64
|
-
streamer,
|
|
65
|
-
});
|
|
66
|
-
if (!output)
|
|
67
|
-
return null;
|
|
68
|
-
return {
|
|
69
|
-
tps,
|
|
70
|
-
...output,
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
}));
|
|
74
|
-
//# sourceMappingURL=work.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"work.js","sourceRoot":"","sources":["../../../../../s/tools/speech-recognition/whisper/fns/work.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
export interface ProgressItem {
|
|
2
|
-
id: string;
|
|
3
|
-
progress: number;
|
|
4
|
-
}
|
|
5
|
-
export type Word = {
|
|
6
|
-
text: string;
|
|
7
|
-
timestamp: [start: number, end: number];
|
|
8
|
-
};
|
|
9
|
-
export type WordGroup = Word[];
|
|
10
|
-
export type Transcript = WordGroup[];
|
|
11
|
-
export interface TranscriptionChunk {
|
|
12
|
-
text: string;
|
|
13
|
-
offset: number;
|
|
14
|
-
timestamp: [number, number];
|
|
15
|
-
finalised: boolean;
|
|
16
|
-
}
|
|
17
|
-
export interface TranscriptionMessage {
|
|
18
|
-
audio: Float32Array;
|
|
19
|
-
model: string;
|
|
20
|
-
subtask: string | null;
|
|
21
|
-
language: string | null;
|
|
22
|
-
duration: number;
|
|
23
|
-
}
|
|
24
|
-
export interface TranscriptionResult {
|
|
25
|
-
text: string;
|
|
26
|
-
chunks: TranscriptionChunk[];
|
|
27
|
-
tps: number;
|
|
28
|
-
}
|
|
29
|
-
export type ProgressCallback = (data: any) => void;
|
|
30
|
-
export type SpeechRecognizerModels = "onnx-community/whisper-tiny_timestamped";
|
|
31
|
-
export type SpeechRecognizerSubtasks = "transcribe";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../s/tools/speech-recognition/whisper/parts/types.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker.bundle.js","sourceRoot":"","sources":["../../../../../s/tools/speech-recognition/whisper/parts/worker.bundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAA;AAErC,OAAO,EAAC,gBAAgB,EAAC,MAAM,gBAAgB,CAAA;AAG/C,MAAM,OAAO,CAAC,MAAM,CAAmB,gBAAgB,CAAC,CAAA"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
function pe(e,t){return{error:r=>e.error({...t,...r}),rpcRequest:r=>e.rpcRequest({...t,...r}),rpcError:r=>e.rpcError({...t,...r})}}var N=()=>e=>({plain:e.none,errMessage:e.mix(e.brightRed,e.bold),errName:e.red,errStack:e.mix(e.red,e.dim),timestamp:e.blue,timestampErr:e.red});function ke(){return N()}var b=Object.freeze({black:"\x1B[30m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m",brightBlack:"\x1B[90m",brightRed:"\x1B[91m",brightGreen:"\x1B[92m",brightYellow:"\x1B[93m",brightBlue:"\x1B[94m",brightMagenta:"\x1B[95m",brightCyan:"\x1B[96m",brightWhite:"\x1B[97m",bgBlack:"\x1B[40m",bgRed:"\x1B[41m",bgGreen:"\x1B[42m",bgYellow:"\x1B[43m",bgBlue:"\x1B[44m",bgMagenta:"\x1B[45m",bgCyan:"\x1B[46m",bgWhite:"\x1B[47m",bgBrightBlack:"\x1B[100m",bgBrightRed:"\x1B[101m",bgBrightGreen:"\x1B[102m",bgBrightYellow:"\x1B[103m",bgBrightBlue:"\x1B[104m",bgBrightMagenta:"\x1B[105m",bgBrightCyan:"\x1B[106m",bgBrightWhite:"\x1B[107m",bold:"\x1B[1m",dim:"\x1B[2m",italic:"\x1B[3m",underline:"\x1B[4m",inverse:"\x1B[7m",hidden:"\x1B[8m",strikethrough:"\x1B[9m",reset:"\x1B[0m"});var _=()=>({none:e=>e,uncolor:Qe,mix:Ke,hex:Ge,rgb:Se,bgRgb:Xe});function Qe(e){return e.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,"")}function Ke(...e){return t=>{for(let r of e)t=r(t);return t}}function Ge(e){e=e.replace(/^#/,"");let t,r,o,n;if(e.length===3)t=parseInt(e.split("").map(s=>s+s).join(""),16);else if(e.length===6)t=parseInt(e,16);else throw new Error("Invalid hex color");return r=t>>16&255,o=t>>8&255,n=t&255,Se(r,o,n)}function Se(e,t,r){let o=`\x1B[38;2;${e};${t};${r}m`;return n=>`${o}${n}${b.reset}`}function Xe(e,t,r){let o=`\x1B[48;2;${e};${t};${r}m`;return n=>`${o}${n}${b.reset}`}var A={...Object.fromEntries(Object.entries(b).map(([e])=>[e,t=>t])),..._()};var P={...Object.fromEntries(Object.entries(b).map(([e,t])=>[e,r=>`${t}${r}${b.reset}`])),..._()};function me(){return typeof Deno<"u"&&typeof Deno.version<"u"}function le(){return typeof process<"u"&&process.versions&&process.versions.node}function Ee(){return le()?process.env.FORCE_COLOR||process.stdout.isTTY&&process.env.TERM!=="dumb":me()?Deno.env.get("FORCE_COLOR")||Deno.isatty(Deno.stdout.rid)&&Deno.env.get("TERM")!=="dumb":!1}var de=()=>Ee()?P:A;var L=()=>({colors:e,theme:t})=>{let r=t(e);function o(i){let c=i.stack?`
|
|
2
|
-
`+i.stack+`
|
|
3
|
-
`:"";return[r.errName(i.name+":"),r.errMessage(i.message)].join(" ")+r.errStack(c)}function n(i){return i&&i instanceof Error?o(i):i}function s(i){return i&&i instanceof Error?o(i):r.errMessage(i)}return{stdout:i=>i.map(n),stderr:i=>i.map(s)}};function M(...e){return t=>({stdout:r=>{for(let o of e)r=o(t).stdout(r);return r},stderr:r=>{for(let o of e)r=o(t).stderr(r);return r}})}function et(){return{icon:"\u{1F6A8}",now:()=>Date.now()}}var V=e=>({colors:t,theme:r})=>{let o={...et(),...e},n=r(t),s=new Date(o.now()),i=s.getUTCFullYear().toString().padStart(4,"0"),c=(s.getUTCMonth()+1).toString().padStart(2,"0"),a=s.getUTCDate().toString().padStart(2,"0"),u=`${i}-${c}-${a}`,f=s.getUTCHours().toString().padStart(2,"0"),p=s.getUTCMinutes().toString().padStart(2,"0"),z=s.getUTCSeconds().toString().padStart(2,"0"),ue=s.getUTCMilliseconds().toString().padStart(3,"0"),fe=`${f}:${p}:${z}.${ue}`,U=`${u}::${fe}`;return{stdout:O=>[n.timestamp(U),...O],stderr:O=>[n.timestampErr(U),...[o.icon].filter(Boolean),...O]}};function je(){return M(L(),V())}var Y=()=>({stdout:async e=>{await Deno.stdout.write(new TextEncoder().encode(e+`
|
|
4
|
-
`))},stderr:async e=>{await Deno.stderr.write(new TextEncoder().encode(e+`
|
|
5
|
-
`))}});var Z=()=>({stdout:async e=>void process.stdout.write(e+`
|
|
6
|
-
`),stderr:async e=>void process.stderr.write(e+`
|
|
7
|
-
`)});var J=()=>({stdout:async e=>console.log(e),stderr:async e=>console.error(e)});var Te=()=>me()?Y():le()?Z():J();var Oe=()=>({stdout:async()=>{},stderr:async()=>{}});function Re(){return()=>({stdout:e=>e,stderr:e=>e})}var R=class e{static writers={auto:Te,void:Oe,deno:Y,node:Z,console:J};static colors={auto:de,colorful:()=>P,colorless:()=>A};static themes={auto:ke,basic:N};static shapers={auto:je,none:Re,errors:L,timestamp:V};writer=e.writers.auto();colors=e.colors.auto();theme=e.themes.auto();shaper=e.shapers.auto();async log(...t){await this.writer.stdout(this.shaper(this).stdout(t).join(" "))}async error(...t){await this.writer.stderr(this.shaper(this).stderr(t).join(" "))}setWriter(t){return this.writer=t,this}setColors(t){return this.colors=t,this}setTheme(t){return this.theme=t,this}setShaper(...t){return this.shaper=M(...t),this}};var $=class extends R{static dummy(){return new this().setWriter(R.writers.void())}rpcRequest=async({request:t,...r})=>{let o=this.colors.none;this.log(...this.#e(r),o(`${t.method}()`))};rpcError=async({request:t,error:r,...o})=>{this.error(...this.#e(o),`${t.method}()`,r)};#e({meta:t,label:r,remote:o}){let n=this.colors.mix(this.colors.blue,this.colors.dim),s=this.colors.mix(this.colors.cyan,this.colors.dim);return[t?this.#t(t):void 0,r||void 0,o===void 0?void 0:o?n("<-"):s("->")].filter(Boolean)}#t(t){let{headers:r}=t.request;return[this.colors.yellow(`[${t.ip}]`),this.colors.green(r.origin?r.origin:"(no-origin)")].join(" ")}};var m=class extends ${rpcRequest=async()=>{}};var l=Object.freeze({eq(e,t){if(e.length!==t.length)return!1;for(let r=0;r<=e.length;r++)if(e.at(r)!==t.at(r))return!1;return!0},random(e){return crypto.getRandomValues(new Uint8Array(e))}});var B=Object.freeze({fromBytes(e){return[...e].map(t=>t.toString(16).padStart(2,"0")).join("")},toBytes(e){if(e.length%2!==0)throw new Error("must have even number of hex characters");let t=new Uint8Array(e.length/2);for(let r=0;r<e.length;r+=2)t[r/2]=parseInt(e.slice(r,r+2),16);return t},random(e=32){return this.fromBytes(l.random(e))},string(e){return B.fromBytes(e)},bytes(e){return B.toBytes(e)}});var he=58,Q="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",ge=Object.freeze({fromBytes(e){let t=BigInt("0x"+B.fromBytes(e)),r="";for(;t>0;){let o=t%BigInt(he);t=t/BigInt(he),r=Q[Number(o)]+r}for(let o of e)if(o===0)r=Q[0]+r;else break;return r},toBytes(e){let t=BigInt(0);for(let i of e){let c=Q.indexOf(i);if(c===-1)throw new Error(`Invalid character '${i}' in base58 string`);t=t*BigInt(he)+BigInt(c)}let r=t.toString(16);r.length%2!==0&&(r="0"+r);let o=B.toBytes(r),n=0;for(let i of e)if(i===Q[0])n++;else break;let s=new Uint8Array(n+o.length);return s.set(o,n),s},random(e=32){return this.fromBytes(l.random(e))},string(e){return ge.fromBytes(e)},bytes(e){return ge.toBytes(e)}});var Ce=class{lexicon;static lexicons=Object.freeze({base2:{characters:"01"},hex:{characters:"0123456789abcdef"},base36:{characters:"0123456789abcdefghijklmnopqrstuvwxyz"},base58:{characters:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"},base62:{characters:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"},base64url:{negativePrefix:"~",characters:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"},base64:{characters:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",padding:{character:"=",size:4}}});lookup;negativePrefix;constructor(t){this.lexicon=t,this.lookup=Object.fromEntries([...t.characters].map((r,o)=>[r,o])),this.negativePrefix=t.negativePrefix??"-"}toBytes(t){let r=Math.log2(this.lexicon.characters.length);if(Number.isInteger(r)){let c=0,a=0,u=[];for(let f of t){if(f===this.lexicon.padding?.character)continue;let p=this.lookup[f];if(p===void 0)throw new Error(`Invalid character: ${f}`);for(c=c<<r|p,a+=r;a>=8;)a-=8,u.push(c>>a&255)}return new Uint8Array(u)}let o=0n,n=BigInt(this.lexicon.characters.length),s=!1;t.startsWith(this.negativePrefix)&&(t=t.slice(this.negativePrefix.length),s=!0);for(let c of t){let a=this.lookup[c];if(a===void 0)throw new Error(`Invalid character: ${c}`);o=o*n+BigInt(a)}let i=[];for(;o>0n;)i.unshift(Number(o%256n)),o=o/256n;return new Uint8Array(i)}fromBytes(t){let r=Math.log2(this.lexicon.characters.length);if(Number.isInteger(r)){let i=0,c=0,a="";for(let u of t)for(i=i<<8|u,c+=8;c>=r;){c-=r;let f=i>>c&(1<<r)-1;a+=this.lexicon.characters[f]}if(c>0){let u=i<<r-c&(1<<r)-1;a+=this.lexicon.characters[u]}if(this.lexicon.padding)for(;a.length%this.lexicon.padding.size!==0;)a+=this.lexicon.padding.character;return a}let o=0n;for(let i of t)o=(o<<8n)+BigInt(i);if(o===0n)return this.lexicon.characters[0];let n=BigInt(this.lexicon.characters.length),s="";for(;o>0n;)s=this.lexicon.characters[Number(o%n)]+s,o=o/n;return s}toInteger(t){if(!t)return 0;let r=0n,o=!1,n=BigInt(this.lexicon.characters.length);t.startsWith(this.negativePrefix)&&(t=t.slice(this.negativePrefix.length),o=!0);for(let s of t){let i=this.lookup[s];if(i===void 0)throw new Error(`Invalid character: ${s}`);r=r*n+BigInt(i)}return Number(o?-r:r)}fromInteger(t){t=Math.floor(t);let r=t<0,o=BigInt(r?-t:t);if(o===0n)return this.lexicon.characters[0];let n=BigInt(this.lexicon.characters.length),s="";for(;o>0n;)s=this.lexicon.characters[Number(o%n)]+s,o=o/n;return r?`${this.negativePrefix}${s}`:s}random(t=32){return this.fromBytes(l.random(t))}};var xe=Object.freeze({fromBytes(e){return typeof btoa=="function"?btoa(String.fromCharCode(...e)):Buffer.from(e).toString("base64")},toBytes(e){return typeof atob=="function"?Uint8Array.from(atob(e),t=>t.charCodeAt(0)):Uint8Array.from(Buffer.from(e,"base64"))},random(e=32){return this.fromBytes(l.random(e))},string(e){return xe.fromBytes(e)},bytes(e){return xe.toBytes(e)}});var Ie=Object.freeze({fromBytes(e){return new TextDecoder().decode(e)},toBytes(e){return new TextEncoder().encode(e)},string(e){return Ie.fromBytes(e)},bytes(e){return Ie.toBytes(e)}});var K=Object.freeze({set:e=>e!=null,unset:e=>e==null,boolean:e=>typeof e=="boolean",number:e=>typeof e=="number",string:e=>typeof e=="string",bigint:e=>typeof e=="bigint",object:e=>typeof e=="object"&&e!==null,array:e=>Array.isArray(e),fn:e=>typeof e=="function",symbol:e=>typeof e=="symbol"});var D=class extends Error{milliseconds;name=this.constructor.name;constructor(t){super(`deadline exceeded (${(t/1e3).toFixed(1)} seconds)`),this.milliseconds=t}};function G(e,t){return e<=0||e===1/0?t():new Promise((r,o)=>{let n=setTimeout(()=>o(new D(e)),e);t().then(r).catch(o).finally(()=>clearTimeout(n))})}function v(){let e,t,r=new Promise((n,s)=>{e=n,t=s});function o(n){return n.then(e).catch(t),r}return{promise:r,resolve:e,reject:t,entangle:o}}function ze(e,t){let r=e;for(let o of t)if(r=r[o],K.unset(r))break;return r}function tt(e){return{map:t=>Ae(e,t),filter:t=>Pe(e,t)}}tt.pipe=Object.freeze({map:e=>t=>Ae(t,e),filter:e=>t=>Pe(t,e)});var Ae=(e,t)=>Object.fromEntries(Object.entries(e).map(([r,o])=>[r,t(o,r)])),Pe=(e,t)=>Object.fromEntries(Object.entries(e).filter(([r,o])=>t(o,r)));function rt(){let e=new Set;function t(s){return e.add(s),()=>{e.delete(s)}}async function r(...s){await Promise.all([...e].map(i=>i(...s)))}async function o(){let{promise:s,resolve:i}=v(),c=t((...a)=>{i(a),c()});return s}function n(){e.clear()}return t.pub=r,t.sub=t,t.on=t,t.next=o,t.clear=n,r.pub=r,r.sub=t,r.on=t,r.next=o,r.clear=n,[r,t]}function X(e){let t=rt()[0];return e&&t.sub(e),t}var g=class{#e=[];add(...t){return this.#e.push(...t),this}disposable(t){return this.bag(t,()=>t.dispose())}bag(t,r){return this.add(()=>r(t)),t}dispose(){for(let t of this.#e.reverse())t();this.#e=[]}};var w;(function(e){e.version="2.0";function t(r){return"id"in r?r.id:null}e.getId=t,e.errorCodes={serverError:-32e3,unexposedError:-32001}})(w||(w={}));var ee=class extends Error{name=this.constructor.name},k=class extends Error{name=this.constructor.name};async function Me({tap:e,request:t,action:r}){let o=w.getId(t);try{let n=await r();return o===null?null:{id:o,result:n,jsonrpc:w.version}}catch(n){return e.rpcError({request:t,error:n}),o===null?null:{id:o,jsonrpc:w.version,error:n instanceof ee?{code:w.errorCodes.serverError,message:n.message}:{code:w.errorCodes.unexposedError,message:"unexposed error"}}}}function te(e){let t=e.tap??new m;return async r=>{let o=r.method.split("."),n=ze(e.fns,o),s=async()=>await n(...r.params);return t.rpcRequest({request:r}),await Me({tap:t,request:r,action:s})}}var $e=Symbol("tune"),ot=Symbol("query"),nt=Symbol("notify"),st=Symbol("settings");function De(e){function t(r){let o={notify:void 0};return new Proxy(()=>{},{apply:(n,s,i)=>e(r,i,o),get:(n,s)=>{if(s!=="then")return s===$e?i=>(...c)=>e(r,c,{...o,...i}):s===nt?(...i)=>e(r,i,{...o,notify:!0}):s===ot?(...i)=>e(r,i,{...o,notify:!1}):s===st?o:(n[s]||(n[s]=t([...r,s])),n[s])},set:(n,s,i)=>(n[s]=i,!0)})}return t([])}function S(e){let{endpoint:t,tap:r=new m}=e,o=1;return De(async(n,s,i)=>{let c=i.notify??e.notify??!1,a=i.transfer,u={jsonrpc:"2.0",method:n.join("."),params:s},f=c?u:{...u,id:o++};r.rpcRequest({request:f});let p=await t(f,{transfer:a});if(c&&!p)return null;if(!p)throw new k("response was null, but shouldn't be, because the request was not a notification");if("error"in p)throw new k(e.label?`${e.label}: ${p.error.message}`:p.error.message);return p.result})}function q(e){return S({endpoint:te(e),tap:e.tap})}var E=class{recv=X();sendRequest=X();sendResponse=X();static makeEntangledPair({origin:t="example.e280.org"}={}){let r=new this,o=new this,n=[r.sendRequest.sub(i=>o.recv(i,{origin:t})),r.sendResponse.sub(i=>o.recv(i,{origin:t})),o.sendRequest.sub(i=>r.recv(i,{origin:t})),o.sendResponse.sub(i=>r.recv(i,{origin:t}))];return[r,o,()=>n.forEach(i=>i())]}};function re(e,t){return e.addEventListener("message",t),()=>e.removeEventListener("message",t)}function qe(e,t){return async(r,{transfer:o}={})=>{if("id"in r){let n=v();return t(r,o,n.promise),e.wait(r.id,r.method).then(s=>(n.resolve(s),s))}else{let n=Promise.resolve(null);return t(r,o,n),n}}}function We(e){let t=[],r=[];for(let o of Array.isArray(e)?e:[e])"method"in o?t.push(o):r.push(o);return{requests:t,responses:r}}async function Fe(e,t){let r=(await Promise.all(t.map(async o=>e(o)))).filter(o=>o!==null);return r.length===0?null:r.length===1?r[0]:r}var C=class extends E{#e=new g;constructor(t){super(),this.#e.add(this.sendRequest.sub((r,o)=>t.postMessage(r,o)),this.sendResponse.sub((r,o)=>t.postMessage(r,o)),re(t,r=>this.recv(r.data,r)))}dispose(){this.#e.dispose()}};var oe=class{remote;transfer;constructor(t){this.remote=t}};var ye=Object.freeze({timeout:6e4,maxRequestBytes:1e7});var ne=class{timeout;pending=new Map;constructor(t){this.timeout=t}async wait(t,r){let o=v();return this.pending.set(t,{method:r,deferred:o}),await G(this.timeout,()=>o.promise).catch(n=>{throw n instanceof D&&(n.message=`request #${t} ${r}(), ${n.message}`),n})}deliverResponse(t){let r=this.pending.get(t.id);r&&("error"in t?r.deferred.reject(new k(t.error.message)):r.deferred.resolve(t))}};var j=class{options;remote;remoteEndpoint;#e;#t=new g;constructor(t){this.options=t;let{conduit:r,tap:o}=t;this.#e=new ne(t.timeout??ye.timeout),this.remoteEndpoint=qe(this.#e,r.sendRequest.pub.bind(r.sendRequest)),this.remote=S({endpoint:this.remoteEndpoint,tap:o&&pe(o,{remote:!0})}),this.#t.add(r.recv.sub(n=>this.recv(n)))}async recv(t){let r=new oe(this.remote),{conduit:o,rpc:n,tap:s}=this.options,{requests:i,responses:c}=We(t);for(let p of c)this.#e.deliverResponse(p);if(!n)return;let a=await n(r),u=te({fns:a,tap:s&&pe(s,{remote:!1})}),f=await Fe(u,i);f&&await o.sendResponse(f,r.transfer)}dispose(){this.#t.dispose()}};var x={derive:{host:e=>({host:e.remote.host,get transfer(){return e.transfer},set transfer(t){e.transfer=t}}),work:e=>({work:e.remote,get transfer(){return e.transfer},set transfer(t){e.transfer=t}})},mock:{host:()=>({host:void 0,transfer:void 0}),work:()=>({work:void 0,transfer:void 0})}};var y=new m;async function He(e,t,r={}){let o=r.tap??y,n=new j({tap:o,timeout:r.timeout??1/0,conduit:new C(e.getSelf()),rpc:async s=>t(x.derive.host(s))});return await n.remote.infra.ready(),n.remote.host}var d=Object.freeze({eq(e,t){if(e.length!==t.length)return!1;for(let r=0;r<=e.length;r++)if(e.at(r)!==t.at(r))return!1;return!0},random(e){return crypto.getRandomValues(new Uint8Array(e))}});var T=Object.freeze({fromBytes(e){return[...e].map(t=>t.toString(16).padStart(2,"0")).join("")},toBytes(e){if(e.length%2!==0)throw new Error("must have even number of hex characters");let t=new Uint8Array(e.length/2);for(let r=0;r<e.length;r+=2)t[r/2]=parseInt(e.slice(r,r+2),16);return t},random(e=32){return this.fromBytes(d.random(e))},string(e){return T.fromBytes(e)},bytes(e){return T.toBytes(e)}});var be=58,se="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",we=Object.freeze({fromBytes(e){let t=BigInt("0x"+T.fromBytes(e)),r="";for(;t>0;){let o=t%BigInt(be);t=t/BigInt(be),r=se[Number(o)]+r}for(let o of e)if(o===0)r=se[0]+r;else break;return r},toBytes(e){let t=BigInt(0);for(let i of e){let c=se.indexOf(i);if(c===-1)throw new Error(`Invalid character '${i}' in base58 string`);t=t*BigInt(be)+BigInt(c)}let r=t.toString(16);r.length%2!==0&&(r="0"+r);let o=T.toBytes(r),n=0;for(let i of e)if(i===se[0])n++;else break;let s=new Uint8Array(n+o.length);return s.set(o,n),s},random(e=32){return this.fromBytes(d.random(e))},string(e){return we.fromBytes(e)},bytes(e){return we.toBytes(e)}});var Ue=class{lexicon;static lexicons=Object.freeze({base2:{characters:"01"},hex:{characters:"0123456789abcdef"},base36:{characters:"0123456789abcdefghijklmnopqrstuvwxyz"},base58:{characters:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"},base62:{characters:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"},base64url:{negativePrefix:"~",characters:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"},base64:{characters:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",padding:{character:"=",size:4}}});lookup;negativePrefix;constructor(t){this.lexicon=t,this.lookup=Object.fromEntries([...t.characters].map((r,o)=>[r,o])),this.negativePrefix=t.negativePrefix??"-"}toBytes(t){let r=Math.log2(this.lexicon.characters.length);if(Number.isInteger(r)){let c=0,a=0,u=[];for(let f of t){if(f===this.lexicon.padding?.character)continue;let p=this.lookup[f];if(p===void 0)throw new Error(`Invalid character: ${f}`);for(c=c<<r|p,a+=r;a>=8;)a-=8,u.push(c>>a&255)}return new Uint8Array(u)}let o=0n,n=BigInt(this.lexicon.characters.length),s=!1;t.startsWith(this.negativePrefix)&&(t=t.slice(this.negativePrefix.length),s=!0);for(let c of t){let a=this.lookup[c];if(a===void 0)throw new Error(`Invalid character: ${c}`);o=o*n+BigInt(a)}let i=[];for(;o>0n;)i.unshift(Number(o%256n)),o=o/256n;return new Uint8Array(i)}fromBytes(t){let r=Math.log2(this.lexicon.characters.length);if(Number.isInteger(r)){let i=0,c=0,a="";for(let u of t)for(i=i<<8|u,c+=8;c>=r;){c-=r;let f=i>>c&(1<<r)-1;a+=this.lexicon.characters[f]}if(c>0){let u=i<<r-c&(1<<r)-1;a+=this.lexicon.characters[u]}if(this.lexicon.padding)for(;a.length%this.lexicon.padding.size!==0;)a+=this.lexicon.padding.character;return a}let o=0n;for(let i of t)o=(o<<8n)+BigInt(i);if(o===0n)return this.lexicon.characters[0];let n=BigInt(this.lexicon.characters.length),s="";for(;o>0n;)s=this.lexicon.characters[Number(o%n)]+s,o=o/n;return s}toInteger(t){if(!t)return 0;let r=0n,o=!1,n=BigInt(this.lexicon.characters.length);t.startsWith(this.negativePrefix)&&(t=t.slice(this.negativePrefix.length),o=!0);for(let s of t){let i=this.lookup[s];if(i===void 0)throw new Error(`Invalid character: ${s}`);r=r*n+BigInt(i)}return Number(o?-r:r)}fromInteger(t){t=Math.floor(t);let r=t<0,o=BigInt(r?-t:t);if(o===0n)return this.lexicon.characters[0];let n=BigInt(this.lexicon.characters.length),s="";for(;o>0n;)s=this.lexicon.characters[Number(o%n)]+s,o=o/n;return r?`${this.negativePrefix}${s}`:s}random(t=32){return this.fromBytes(d.random(t))}};var Be=Object.freeze({fromBytes(e){return typeof btoa=="function"?btoa(String.fromCharCode(...e)):Buffer.from(e).toString("base64")},toBytes(e){return typeof atob=="function"?Uint8Array.from(atob(e),t=>t.charCodeAt(0)):Uint8Array.from(Buffer.from(e,"base64"))},random(e=32){return this.fromBytes(d.random(e))},string(e){return Be.fromBytes(e)},bytes(e){return Be.toBytes(e)}});var Ne=Object.freeze({fromBytes(e){return new TextDecoder().decode(e)},toBytes(e){return new TextEncoder().encode(e)},string(e){return Ne.fromBytes(e)},bytes(e){return Ne.toBytes(e)}});var ve=Object.freeze({set:e=>e!=null,unset:e=>e==null,boolean:e=>typeof e=="boolean",number:e=>typeof e=="number",string:e=>typeof e=="string",bigint:e=>typeof e=="bigint",object:e=>typeof e=="object"&&e!==null,array:e=>Array.isArray(e),fn:e=>typeof e=="function",symbol:e=>typeof e=="symbol"});function W(){let e,t,r=new Promise((n,s)=>{e=n,t=s});function o(n){return n.then(e).catch(t),r}return{promise:r,resolve:e,reject:t,entangle:o}}function ut(e){return{map:t=>_e(e,t),filter:t=>Le(e,t)}}ut.pipe=Object.freeze({map:e=>t=>_e(t,e),filter:e=>t=>Le(t,e)});var _e=(e,t)=>Object.fromEntries(Object.entries(e).map(([r,o])=>[r,t(o,r)])),Le=(e,t)=>Object.fromEntries(Object.entries(e).filter(([r,o])=>t(o,r)));var I=class{worker;messenger;constructor(t,r){this.worker=t,this.messenger=r}static async make(t,r){let o=r.tap??y,n=r.label??"comrade",s=t.loadWorker(r.workerUrl,n),i=W(),c={async ready(){i.resolve()}},a=new j({tap:o,timeout:r.timeout??1/0,conduit:new C(s),rpc:async u=>({infra:c,host:r.setupHost(x.derive.work(u))})});return await i.promise,new this(s,a)}get work(){return this.messenger.remote}terminate(){this.worker.terminate()}};var ie=class{threads;static async make(t,r){let o=r.workerCount??t.guessOptimalThreadCount(),n=await Promise.all([...Array(o)].map(async(s,i)=>I.make(t,{...r,label:r.label??`${r.label??"comrade"}_${i+1}`})));return new this(n,{tap:r.tap})}work;#e=new Set;#t=[];constructor(t,r={}){this.threads=t;let o=r.tap??y,n=async(s,i)=>this.#o({request:s,prom:W(),transfer:i?.transfer});this.work=S({tap:o,endpoint:n}),t.forEach(s=>this.#e.add(s))}get threadCount(){return this.threads.length}terminate(){for(let t of this.threads)t.terminate()}#o(t){return this.#t.push(t),this.#r(),t.prom.promise}#r(){for(;this.#e.size>0&&this.#t.length>0;){let t=[...this.#e].pop();this.#e.delete(t);let r=this.#t.shift();this.#e.delete(t);let o=t.messenger.remoteEndpoint(r.request,{transfer:r.transfer});r.prom.entangle(o).finally(()=>{this.#e.add(t),this.#r()})}}};var Ve=e=>({thread:t=>I.make(e,t),cluster:t=>ie.make(e,t),worker:(t,r={})=>He(e,t,r),work:t=>t,host:t=>t,mocks(t){let{setupWork:r,setupHost:o,tap:n=y}=t,s=x.mock.host(),i=x.mock.work();return i.work=q({tap:n,fns:r(s)}),s.host=q({tap:n,fns:o(i)}),{workShell:i,hostShell:s,work:i.work,host:s.host}},mockWork(t,r=y){let o=x.mock.host(),n=x.mock.work();return n.work=q({tap:r,fns:t(o)}),{workShell:n,hostShell:o,work:n.work,mockHost:s=>(o.host=q({tap:r,fns:s(n)}),{workShell:n,hostShell:o,work:n.work,host:o.host})}}});var Ye=()=>({getSelf(){return self},guessOptimalThreadCount(){let e=navigator.hardwareConcurrency??1;return Math.max(1,e-1)},loadWorker(e,t){return new window.Worker(e,{name:t,type:"module"})},async loadWasm(e){return WebAssembly.instantiateStreaming(fetch(e))}});var ft=Ye(),ce=Ve(ft);import{WhisperTextStreamer as mt}from"https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.7.0/dist/transformers.min.js";import{pipeline as pt}from"https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.7.0/dist/transformers.min.js";var ae=class{task;instance=null;model=null;constructor(t){this.task=t}async createInstance(t,r){return this.model=t,this.instance=await pt(this.task,this.model,{dtype:{encoder_model:this.model==="onnx-community/whisper-large-v3-turbo"?"fp16":"fp32",decoder_model_merged:"q4"},device:"webgpu",progress_callback:r})}};var F=new ae("automatic-speech-recognition"),H,Ze=ce.work(e=>({async transcribe({audio:t,model:r,language:o,duration:n}){let s=r.startsWith("distil-whisper/");(!F.model||F.model!==r)&&(F.instance?.dispose()?.(),F.instance=null,H=await F.createInstance(r,h=>{h.progress&&e.host.updateModelLoadProgress({id:h.file,progress:h.progress})}));let i=H.processor.feature_extractor.config.chunk_length/H.model.config.max_source_positions,c=s?20:30,a=s?3:5,u=0,f=null,p=0,z=0,ue=c-a,fe=()=>{let h=u*ue;return Math.min(h/n,1)},U=new mt(H.tokenizer,{time_precision:i,token_callback_function:()=>{f??=performance.now(),++p>1&&(z=p/(performance.now()-f)*1e3,e.host.updateTps(z))},callback_function:h=>{e.host.deliverTranscriptionChunk(h)},on_finalize:()=>{f=null,p=0,u++;let h=fe();e.host.updateTranscribeProgress(h)}}),O=await H(t,{top_k:0,do_sample:!1,chunk_length_s:c,stride_length_s:a,language:o,task:"transcribe",return_timestamps:"word",force_full_sequences:!1,streamer:U});return O?{tps:z,...O}:null}}));await ce.worker(Ze);
|
|
8
|
-
//# sourceMappingURL=worker.bundle.min.js.map
|