@omnimedia/omnitool 1.1.0-3 → 1.1.0-4

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.
Files changed (103) hide show
  1. package/package.json +10 -9
  2. package/s/context.ts +1 -1
  3. package/s/demo/demo.bundle.ts +6 -2
  4. package/s/demo/routines/filmstrip-test.ts +2 -2
  5. package/s/demo/routines/transcriber-test.ts +34 -0
  6. package/s/driver/fns/host.ts +7 -6
  7. package/s/driver/fns/schematic.ts +1 -1
  8. package/s/driver/fns/work.ts +116 -119
  9. package/s/driver/utils/load-decoder-source.ts +3 -4
  10. package/s/features/speech/transcribe/default-spec.ts +11 -0
  11. package/s/features/speech/transcribe/parts/load-pipe.ts +19 -0
  12. package/s/features/speech/transcribe/parts/prep-audio.ts +23 -0
  13. package/s/features/speech/transcribe/parts/transcribe.ts +70 -0
  14. package/s/features/speech/transcribe/transcriber.ts +46 -0
  15. package/s/features/speech/transcribe/types.ts +82 -0
  16. package/s/features/speech/transcribe/worker.bundle.ts +40 -0
  17. package/s/timeline/utils/checksum.ts +2 -1
  18. package/s/tools/common/loader.ts +26 -0
  19. package/s/tools/common/transformer-pipeline.ts +26 -0
  20. package/s/tools/speech-recognition/common/model.ts +26 -0
  21. package/s/tools/speech-recognition/whisper/fns/host.ts +25 -0
  22. package/s/tools/speech-recognition/whisper/fns/schematic.ts +23 -0
  23. package/s/tools/speech-recognition/whisper/fns/work.ts +91 -0
  24. package/s/tools/speech-recognition/whisper/parts/types.ts +38 -0
  25. package/s/tools/speech-recognition/whisper/parts/worker.bundle.ts +7 -0
  26. package/s/tools/speech-recognition/whisper/tool.ts +70 -0
  27. package/x/context.js +1 -1
  28. package/x/context.js.map +1 -1
  29. package/x/demo/demo.bundle.js +6 -2
  30. package/x/demo/demo.bundle.js.map +1 -1
  31. package/x/demo/demo.bundle.min.js +6 -6
  32. package/x/demo/demo.bundle.min.js.map +4 -4
  33. package/x/demo/routines/filmstrip-test.d.ts +1 -1
  34. package/x/demo/routines/filmstrip-test.js +2 -2
  35. package/x/demo/routines/filmstrip-test.js.map +1 -1
  36. package/x/demo/routines/transcriber-test.d.ts +4 -0
  37. package/x/demo/routines/transcriber-test.js +33 -0
  38. package/x/demo/routines/transcriber-test.js.map +1 -0
  39. package/x/driver/driver.worker.bundle.min.js +80 -80
  40. package/x/driver/driver.worker.bundle.min.js.map +4 -4
  41. package/x/driver/fns/host.js +3 -3
  42. package/x/driver/fns/host.js.map +1 -1
  43. package/x/driver/fns/schematic.d.ts +1 -1
  44. package/x/driver/fns/work.js +8 -8
  45. package/x/driver/fns/work.js.map +1 -1
  46. package/x/driver/utils/load-decoder-source.d.ts +2 -1
  47. package/x/driver/utils/load-decoder-source.js +2 -3
  48. package/x/driver/utils/load-decoder-source.js.map +1 -1
  49. package/x/features/speech/transcribe/default-spec.d.ts +2 -0
  50. package/x/features/speech/transcribe/default-spec.js +8 -0
  51. package/x/features/speech/transcribe/default-spec.js.map +1 -0
  52. package/x/features/speech/transcribe/parts/load-pipe.d.ts +2 -0
  53. package/x/features/speech/transcribe/parts/load-pipe.js +13 -0
  54. package/x/features/speech/transcribe/parts/load-pipe.js.map +1 -0
  55. package/x/features/speech/transcribe/parts/prep-audio.d.ts +5 -0
  56. package/x/features/speech/transcribe/parts/prep-audio.js +21 -0
  57. package/x/features/speech/transcribe/parts/prep-audio.js.map +1 -0
  58. package/x/features/speech/transcribe/parts/transcribe.d.ts +5 -0
  59. package/x/features/speech/transcribe/parts/transcribe.js +56 -0
  60. package/x/features/speech/transcribe/parts/transcribe.js.map +1 -0
  61. package/x/features/speech/transcribe/transcriber.d.ts +5 -0
  62. package/x/features/speech/transcribe/transcriber.js +33 -0
  63. package/x/features/speech/transcribe/transcriber.js.map +1 -0
  64. package/x/features/speech/transcribe/types.d.ts +66 -0
  65. package/x/features/speech/transcribe/types.js +2 -0
  66. package/x/features/speech/transcribe/types.js.map +1 -0
  67. package/x/features/speech/transcribe/worker.bundle.d.ts +1 -0
  68. package/x/features/speech/transcribe/worker.bundle.js +33 -0
  69. package/x/features/speech/transcribe/worker.bundle.js.map +1 -0
  70. package/x/features/speech/transcribe/worker.bundle.min.js +2916 -0
  71. package/x/features/speech/transcribe/worker.bundle.min.js.map +7 -0
  72. package/x/index.html +2 -2
  73. package/x/timeline/utils/checksum.js +2 -1
  74. package/x/timeline/utils/checksum.js.map +1 -1
  75. package/x/tools/common/loader.d.ts +19 -0
  76. package/x/tools/common/loader.js +18 -0
  77. package/x/tools/common/loader.js.map +1 -0
  78. package/x/tools/common/transformer-pipeline.d.ts +8 -0
  79. package/x/tools/common/transformer-pipeline.js +24 -0
  80. package/x/tools/common/transformer-pipeline.js.map +1 -0
  81. package/x/tools/speech-recognition/common/model.d.ts +14 -0
  82. package/x/tools/speech-recognition/common/model.js +16 -0
  83. package/x/tools/speech-recognition/common/model.js.map +1 -0
  84. package/x/tools/speech-recognition/whisper/fns/host.d.ts +13 -0
  85. package/x/tools/speech-recognition/whisper/fns/host.js +19 -0
  86. package/x/tools/speech-recognition/whisper/fns/host.js.map +1 -0
  87. package/x/tools/speech-recognition/whisper/fns/schematic.d.ts +19 -0
  88. package/x/tools/speech-recognition/whisper/fns/schematic.js +2 -0
  89. package/x/tools/speech-recognition/whisper/fns/schematic.js.map +1 -0
  90. package/x/tools/speech-recognition/whisper/fns/work.d.ts +12 -0
  91. package/x/tools/speech-recognition/whisper/fns/work.js +74 -0
  92. package/x/tools/speech-recognition/whisper/fns/work.js.map +1 -0
  93. package/x/tools/speech-recognition/whisper/parts/types.d.ts +31 -0
  94. package/x/tools/speech-recognition/whisper/parts/types.js +2 -0
  95. package/x/tools/speech-recognition/whisper/parts/types.js.map +1 -0
  96. package/x/tools/speech-recognition/whisper/parts/worker.bundle.d.ts +1 -0
  97. package/x/tools/speech-recognition/whisper/parts/worker.bundle.js +4 -0
  98. package/x/tools/speech-recognition/whisper/parts/worker.bundle.js.map +1 -0
  99. package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js +8 -0
  100. package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js.map +7 -0
  101. package/x/tools/speech-recognition/whisper/tool.d.ts +12 -0
  102. package/x/tools/speech-recognition/whisper/tool.js +63 -0
  103. package/x/tools/speech-recognition/whisper/tool.js.map +1 -0
package/x/index.html CHANGED
@@ -60,7 +60,7 @@ body {
60
60
  }
61
61
 
62
62
  </style>
63
- <script type=module src="demo/demo.bundle.min.js?v=c614bb3d17cc"></script>
63
+ <script type=module src="demo/demo.bundle.min.js?v=7ebfc5a6da44"></script>
64
64
 
65
65
 
66
66
  <meta name="theme-color" content="#3cff9c">
@@ -80,7 +80,7 @@ body {
80
80
  <body>
81
81
 
82
82
  <section>
83
- <h1>Omnitool <small>v1.1.0-3</small></h1>
83
+ <h1>Omnitool <small>v1.1.0-4</small></h1>
84
84
  <button class=fetch>fetch</button>
85
85
  <button class="import">import</button>
86
86
  <div class=results></div>
@@ -11,7 +11,8 @@ export class Checksum {
11
11
  this.nickname = nickname;
12
12
  }
13
13
  static async make(data) {
14
- const bytes = new Uint8Array(await crypto.subtle.digest("SHA-256", data));
14
+ const data2 = new Uint8Array(data);
15
+ const bytes = new Uint8Array(await crypto.subtle.digest("SHA-256", data2));
15
16
  const hash = Hex.fromBytes(bytes);
16
17
  const nickname = Thumbprint.sigil.fromBytes(bytes);
17
18
  return new this(data, bytes, hash, nickname);
@@ -1 +1 @@
1
- {"version":3,"file":"checksum.js","sourceRoot":"","sources":["../../../s/timeline/utils/checksum.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAE,UAAU,EAAC,MAAM,WAAW,CAAA;AAEzC,MAAM,OAAO,QAAQ;IAEZ;IACA;IACA;IACA;IAJR,YACQ,IAAgB,EAChB,KAAiB,EACjB,IAAY,EACZ,QAAgB;QAHhB,SAAI,GAAJ,IAAI,CAAY;QAChB,UAAK,GAAL,KAAK,CAAY;QACjB,SAAI,GAAJ,IAAI,CAAQ;QACZ,aAAQ,GAAR,QAAQ,CAAQ;IACrB,CAAC;IAEJ,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAgB;QACjC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAA;QACzE,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QACjC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QAClD,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC7C,CAAC;CACD"}
1
+ {"version":3,"file":"checksum.js","sourceRoot":"","sources":["../../../s/timeline/utils/checksum.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAE,UAAU,EAAC,MAAM,WAAW,CAAA;AAEzC,MAAM,OAAO,QAAQ;IAEZ;IACA;IACA;IACA;IAJR,YACQ,IAAgB,EAChB,KAAiB,EACjB,IAAY,EACZ,QAAgB;QAHhB,SAAI,GAAJ,IAAI,CAAY;QAChB,UAAK,GAAL,KAAK,CAAY;QACjB,SAAI,GAAJ,IAAI,CAAQ;QACZ,aAAQ,GAAR,QAAQ,CAAQ;IACrB,CAAC;IAEJ,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAgB;QACjC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAA;QAClC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAA;QAC1E,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QACjC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QAClD,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC7C,CAAC;CACD"}
@@ -0,0 +1,19 @@
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
+ }
@@ -0,0 +1,18 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,8 @@
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
+ }
@@ -0,0 +1,24 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,14 @@
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
+ }
@@ -0,0 +1,16 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,13 @@
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
+ }>;
@@ -0,0 +1,19 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,19 @@
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
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=schematic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schematic.js","sourceRoot":"","sources":["../../../../../s/tools/speech-recognition/whisper/fns/schematic.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
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
+ }>;
@@ -0,0 +1,74 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work.js","sourceRoot":"","sources":["../../../../../s/tools/speech-recognition/whisper/fns/work.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
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";
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../s/tools/speech-recognition/whisper/parts/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import { Comrade } from "@e280/comrade";
2
+ import { setupWhisperWork } from "../fns/work.js";
3
+ await Comrade.worker(setupWhisperWork);
4
+ //# sourceMappingURL=worker.bundle.js.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,8 @@
1
+ function ae(t,e){return{error:r=>t.error({...e,...r}),rpcRequest:r=>t.rpcRequest({...e,...r}),rpcError:r=>t.rpcError({...e,...r})}}var _=()=>t=>({plain:t.none,errMessage:t.mix(t.brightRed,t.bold),errName:t.red,errStack:t.mix(t.red,t.dim),timestamp:t.blue,timestampErr:t.red});function he(){return _()}var y=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 H=()=>({none:t=>t,uncolor:Ae,mix:qe,hex:_e,rgb:ge,bgRgb:He});function Ae(t){return t.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,"")}function qe(...t){return e=>{for(let r of t)e=r(e);return e}}function _e(t){t=t.replace(/^#/,"");let e,r,o,n;if(t.length===3)e=parseInt(t.split("").map(s=>s+s).join(""),16);else if(t.length===6)e=parseInt(t,16);else throw new Error("Invalid hex color");return r=e>>16&255,o=e>>8&255,n=e&255,ge(r,o,n)}function ge(t,e,r){let o=`\x1B[38;2;${t};${e};${r}m`;return n=>`${o}${n}${y.reset}`}function He(t,e,r){let o=`\x1B[48;2;${t};${e};${r}m`;return n=>`${o}${n}${y.reset}`}var M={...Object.fromEntries(Object.entries(y).map(([t])=>[t,e=>e])),...H()};var $={...Object.fromEntries(Object.entries(y).map(([t,e])=>[t,r=>`${e}${r}${y.reset}`])),...H()};function ce(){return typeof Deno<"u"&&typeof Deno.version<"u"}function ue(){return typeof process<"u"&&process.versions&&process.versions.node}function xe(){return ue()?process.env.FORCE_COLOR||process.stdout.isTTY&&process.env.TERM!=="dumb":ce()?Deno.env.get("FORCE_COLOR")||Deno.isatty(Deno.stdout.rid)&&Deno.env.get("TERM")!=="dumb":!1}var pe=()=>xe()?$:M;var U=()=>({colors:t,theme:e})=>{let r=e(t);function o(i){let a=i.stack?`
2
+ `+i.stack+`
3
+ `:"";return[r.errName(i.name+":"),r.errMessage(i.message)].join(" ")+r.errStack(a)}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 I(...t){return e=>({stdout:r=>{for(let o of t)r=o(e).stdout(r);return r},stderr:r=>{for(let o of t)r=o(e).stderr(r);return r}})}function Ue(){return{icon:"\u{1F6A8}",now:()=>Date.now()}}var F=t=>({colors:e,theme:r})=>{let o={...Ue(),...t},n=r(e),s=new Date(o.now()),i=s.getUTCFullYear().toString().padStart(4,"0"),a=(s.getUTCMonth()+1).toString().padStart(2,"0"),c=s.getUTCDate().toString().padStart(2,"0"),u=`${i}-${a}-${c}`,p=s.getUTCHours().toString().padStart(2,"0"),m=s.getUTCMinutes().toString().padStart(2,"0"),O=s.getUTCSeconds().toString().padStart(2,"0"),se=s.getUTCMilliseconds().toString().padStart(3,"0"),ie=`${p}:${m}:${O}.${se}`,q=`${u}::${ie}`;return{stdout:T=>[n.timestamp(q),...T],stderr:T=>[n.timestampErr(q),...[o.icon].filter(Boolean),...T]}};function be(){return I(U(),F())}var N=()=>({stdout:async t=>{await Deno.stdout.write(new TextEncoder().encode(t+`
4
+ `))},stderr:async t=>{await Deno.stderr.write(new TextEncoder().encode(t+`
5
+ `))}});var L=()=>({stdout:async t=>void process.stdout.write(t+`
6
+ `),stderr:async t=>void process.stderr.write(t+`
7
+ `)});var Y=()=>({stdout:async t=>console.log(t),stderr:async t=>console.error(t)});var ye=()=>ce()?N():ue()?L():Y();var we=()=>({stdout:async()=>{},stderr:async()=>{}});function ve(){return()=>({stdout:t=>t,stderr:t=>t})}var R=class t{static writers={auto:ye,void:we,deno:N,node:L,console:Y};static colors={auto:pe,colorful:()=>$,colorless:()=>M};static themes={auto:he,basic:_};static shapers={auto:be,none:ve,errors:U,timestamp:F};writer=t.writers.auto();colors=t.colors.auto();theme=t.themes.auto();shaper=t.shapers.auto();async log(...e){await this.writer.stdout(this.shaper(this).stdout(e).join(" "))}async error(...e){await this.writer.stderr(this.shaper(this).stderr(e).join(" "))}setWriter(e){return this.writer=e,this}setColors(e){return this.colors=e,this}setTheme(e){return this.theme=e,this}setShaper(...e){return this.shaper=I(...e),this}};var P=class extends R{static dummy(){return new this().setWriter(R.writers.void())}rpcRequest=async({request:e,...r})=>{let o=this.colors.none;this.log(...this.#e(r),o(`${e.method}()`))};rpcError=async({request:e,error:r,...o})=>{this.error(...this.#e(o),`${e.method}()`,r)};#e({meta:e,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[e?this.#t(e):void 0,r||void 0,o===void 0?void 0:o?n("<-"):s("->")].filter(Boolean)}#t(e){let{headers:r}=e.request;return[this.colors.yellow(`[${e.ip}]`),this.colors.green(r.origin?r.origin:"(no-origin)")].join(" ")}};var l=class extends P{rpcRequest=async()=>{}};var d=Object.freeze({eq(t,e){if(t.length!==e.length)return!1;for(let r=0;r<=t.length;r++)if(t.at(r)!==e.at(r))return!1;return!0},random(t){return crypto.getRandomValues(new Uint8Array(t))}});var v=Object.freeze({fromBytes(t){return[...t].map(e=>e.toString(16).padStart(2,"0")).join("")},toBytes(t){if(t.length%2!==0)throw new Error("must have even number of hex characters");let e=new Uint8Array(t.length/2);for(let r=0;r<t.length;r+=2)e[r/2]=parseInt(t.slice(r,r+2),16);return e},random(t=32){return this.fromBytes(d.random(t))},string(t){return v.fromBytes(t)},bytes(t){return v.toBytes(t)}});var me=58,J="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",fe=Object.freeze({fromBytes(t){let e=BigInt("0x"+v.fromBytes(t)),r="";for(;e>0;){let o=e%BigInt(me);e=e/BigInt(me),r=J[Number(o)]+r}for(let o of t)if(o===0)r=J[0]+r;else break;return r},toBytes(t){let e=BigInt(0);for(let i of t){let a=J.indexOf(i);if(a===-1)throw new Error(`Invalid character '${i}' in base58 string`);e=e*BigInt(me)+BigInt(a)}let r=e.toString(16);r.length%2!==0&&(r="0"+r);let o=v.toBytes(r),n=0;for(let i of t)if(i===J[0])n++;else break;let s=new Uint8Array(n+o.length);return s.set(o,n),s},random(t=32){return this.fromBytes(d.random(t))},string(t){return fe.fromBytes(t)},bytes(t){return fe.toBytes(t)}});var ke=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(e){this.lexicon=e,this.lookup=Object.fromEntries([...e.characters].map((r,o)=>[r,o])),this.negativePrefix=e.negativePrefix??"-"}toBytes(e){let r=Math.log2(this.lexicon.characters.length);if(Number.isInteger(r)){let a=0,c=0,u=[];for(let p of e){if(p===this.lexicon.padding?.character)continue;let m=this.lookup[p];if(m===void 0)throw new Error(`Invalid character: ${p}`);for(a=a<<r|m,c+=r;c>=8;)c-=8,u.push(a>>c&255)}return new Uint8Array(u)}let o=0n,n=BigInt(this.lexicon.characters.length),s=!1;e.startsWith(this.negativePrefix)&&(e=e.slice(this.negativePrefix.length),s=!0);for(let a of e){let c=this.lookup[a];if(c===void 0)throw new Error(`Invalid character: ${a}`);o=o*n+BigInt(c)}let i=[];for(;o>0n;)i.unshift(Number(o%256n)),o=o/256n;return new Uint8Array(i)}fromBytes(e){let r=Math.log2(this.lexicon.characters.length);if(Number.isInteger(r)){let i=0,a=0,c="";for(let u of e)for(i=i<<8|u,a+=8;a>=r;){a-=r;let p=i>>a&(1<<r)-1;c+=this.lexicon.characters[p]}if(a>0){let u=i<<r-a&(1<<r)-1;c+=this.lexicon.characters[u]}if(this.lexicon.padding)for(;c.length%this.lexicon.padding.size!==0;)c+=this.lexicon.padding.character;return c}let o=0n;for(let i of e)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(e){if(!e)return 0;let r=0n,o=!1,n=BigInt(this.lexicon.characters.length);e.startsWith(this.negativePrefix)&&(e=e.slice(this.negativePrefix.length),o=!0);for(let s of e){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(e){e=Math.floor(e);let r=e<0,o=BigInt(r?-e:e);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(e=32){return this.fromBytes(d.random(e))}};var le=Object.freeze({fromBytes(t){return typeof btoa=="function"?btoa(String.fromCharCode(...t)):Buffer.from(t).toString("base64")},toBytes(t){return typeof atob=="function"?Uint8Array.from(atob(t),e=>e.charCodeAt(0)):Uint8Array.from(Buffer.from(t,"base64"))},random(t=32){return this.fromBytes(d.random(t))},string(t){return le.fromBytes(t)},bytes(t){return le.toBytes(t)}});var Be=Object.freeze({fromBytes(t){return new TextDecoder().decode(t)},toBytes(t){return new TextEncoder().encode(t)},string(t){return Be.fromBytes(t)},bytes(t){return Be.toBytes(t)}});var V=Object.freeze({set:t=>t!=null,unset:t=>t==null,boolean:t=>typeof t=="boolean",number:t=>typeof t=="number",string:t=>typeof t=="string",bigint:t=>typeof t=="bigint",object:t=>typeof t=="object"&&t!==null,array:t=>Array.isArray(t),fn:t=>typeof t=="function",symbol:t=>typeof t=="symbol"});var W=class extends Error{milliseconds;name=this.constructor.name;constructor(e){super(`deadline exceeded (${(e/1e3).toFixed(1)} seconds)`),this.milliseconds=e}};function Z(t,e){return t<=0||t===1/0?e():new Promise((r,o)=>{let n=setTimeout(()=>o(new W(t)),t);e().then(r).catch(o).finally(()=>clearTimeout(n))})}function f(){let t,e,r=new Promise((n,s)=>{t=n,e=s});function o(n){return n.then(t).catch(e),r}return{promise:r,resolve:t,reject:e,entangle:o}}function Se(t,e){let r=t;for(let o of e)if(r=r[o],V.unset(r))break;return r}function Fe(t){return{map:e=>Ee(t,e),filter:e=>Te(t,e)}}Fe.pipe=Object.freeze({map:t=>e=>Ee(e,t),filter:t=>e=>Te(e,t)});var Ee=(t,e)=>Object.fromEntries(Object.entries(t).map(([r,o])=>[r,e(o,r)])),Te=(t,e)=>Object.fromEntries(Object.entries(t).filter(([r,o])=>e(o,r)));function Ne(){let t=new Set;function e(s){return t.add(s),()=>{t.delete(s)}}async function r(...s){await Promise.all([...t].map(i=>i(...s)))}async function o(){let{promise:s,resolve:i}=f(),a=e((...c)=>{i(c),a()});return s}function n(){t.clear()}return e.pub=r,e.sub=e,e.on=e,e.next=o,e.clear=n,r.pub=r,r.sub=e,r.on=e,r.next=o,r.clear=n,[r,e]}function G(t){let e=Ne()[0];return t&&e.sub(t),e}var g=class{#e=[];add(...e){return this.#e.push(...e),this}disposable(e){return this.bag(e,()=>e.dispose())}bag(e,r){return this.add(()=>r(e)),e}dispose(){for(let e of this.#e.reverse())e();this.#e=[]}};var w;(function(t){t.version="2.0";function e(r){return"id"in r?r.id:null}t.getId=e,t.errorCodes={serverError:-32e3,unexposedError:-32001}})(w||(w={}));var Q=class extends Error{name=this.constructor.name},k=class extends Error{name=this.constructor.name};async function Re({tap:t,request:e,action:r}){let o=w.getId(e);try{let n=await r();return o===null?null:{id:o,result:n,jsonrpc:w.version}}catch(n){return t.rpcError({request:e,error:n}),o===null?null:{id:o,jsonrpc:w.version,error:n instanceof Q?{code:w.errorCodes.serverError,message:n.message}:{code:w.errorCodes.unexposedError,message:"unexposed error"}}}}function K(t){let e=t.tap??new l;return async r=>{let o=r.method.split("."),n=Se(t.fns,o),s=async()=>await n(...r.params);return e.rpcRequest({request:r}),await Re({tap:e,request:r,action:s})}}var je=Symbol("tune"),Le=Symbol("query"),Ye=Symbol("notify"),Je=Symbol("settings");function Ce(t){function e(r){let o={notify:void 0};return new Proxy(()=>{},{apply:(n,s,i)=>t(r,i,o),get:(n,s)=>{if(s!=="then")return s===je?i=>(...a)=>t(r,a,{...o,...i}):s===Ye?(...i)=>t(r,i,{...o,notify:!0}):s===Le?(...i)=>t(r,i,{...o,notify:!1}):s===Je?o:(n[s]||(n[s]=e([...r,s])),n[s])},set:(n,s,i)=>(n[s]=i,!0)})}return e([])}function B(t){let{endpoint:e,tap:r=new l}=t,o=1;return Ce(async(n,s,i)=>{let a=i.notify??t.notify??!1,c=i.transfer,u={jsonrpc:"2.0",method:n.join("."),params:s},p=a?u:{...u,id:o++};r.rpcRequest({request:p});let m=await e(p,{transfer:c});if(a&&!m)return null;if(!m)throw new k("response was null, but shouldn't be, because the request was not a notification");if("error"in m)throw new k(t.label?`${t.label}: ${m.error.message}`:m.error.message);return m.result})}function D(t){return B({endpoint:K(t),tap:t.tap})}var S=class{recv=G();sendRequest=G();sendResponse=G();static makeEntangledPair({origin:e="example.e280.org"}={}){let r=new this,o=new this,n=[r.sendRequest.sub(i=>o.recv(i,{origin:e})),r.sendResponse.sub(i=>o.recv(i,{origin:e})),o.sendRequest.sub(i=>r.recv(i,{origin:e})),o.sendResponse.sub(i=>r.recv(i,{origin:e}))];return[r,o,()=>n.forEach(i=>i())]}};function X(t,e){return t.addEventListener("message",e),()=>t.removeEventListener("message",e)}function Oe(t,e){return async(r,{transfer:o}={})=>{if("id"in r){let n=f();return e(r,o,n.promise),t.wait(r.id,r.method).then(s=>(n.resolve(s),s))}else{let n=Promise.resolve(null);return e(r,o,n),n}}}function Me(t){let e=[],r=[];for(let o of Array.isArray(t)?t:[t])"method"in o?e.push(o):r.push(o);return{requests:e,responses:r}}async function $e(t,e){let r=(await Promise.all(e.map(async o=>t(o)))).filter(o=>o!==null);return r.length===0?null:r.length===1?r[0]:r}var j=class extends S{#e=new g;constructor(e){super(),this.#e.add(this.sendRequest.sub((r,o)=>e.postMessage(r,o)),this.sendResponse.sub((r,o)=>e.postMessage(r,o)),X(e,r=>this.recv(r.data,r)))}dispose(){this.#e.dispose()}};var ee=class{remote;transfer;constructor(e){this.remote=e}};var de=Object.freeze({timeout:6e4,maxRequestBytes:1e7});var te=class{timeout;pending=new Map;constructor(e){this.timeout=e}async wait(e,r){let o=f();return this.pending.set(e,{method:r,deferred:o}),await Z(this.timeout,()=>o.promise).catch(n=>{throw n instanceof W&&(n.message=`request #${e} ${r}(), ${n.message}`),n})}deliverResponse(e){let r=this.pending.get(e.id);r&&("error"in e?r.deferred.reject(new k(e.error.message)):r.deferred.resolve(e))}};var E=class{options;remote;remoteEndpoint;#e;#t=new g;constructor(e){this.options=e;let{conduit:r,tap:o}=e;this.#e=new te(e.timeout??de.timeout),this.remoteEndpoint=Oe(this.#e,r.sendRequest.pub.bind(r.sendRequest)),this.remote=B({endpoint:this.remoteEndpoint,tap:o&&ae(o,{remote:!0})}),this.#t.add(r.recv.sub(n=>this.recv(n)))}async recv(e){let r=new ee(this.remote),{conduit:o,rpc:n,tap:s}=this.options,{requests:i,responses:a}=Me(e);for(let m of a)this.#e.deliverResponse(m);if(!n)return;let c=await n(r),u=K({fns:c,tap:s&&ae(s,{remote:!1})}),p=await $e(u,i);p&&await o.sendResponse(p,r.transfer)}dispose(){this.#t.dispose()}};var x={derive:{host:t=>({host:t.remote.host,get transfer(){return t.transfer},set transfer(e){t.transfer=e}}),work:t=>({work:t.remote,get transfer(){return t.transfer},set transfer(e){t.transfer=e}})},mock:{host:()=>({host:void 0,transfer:void 0}),work:()=>({work:void 0,transfer:void 0})}};var b=new l;async function Ie(t,e,r={}){let o=r.tap??b,n=new E({tap:o,timeout:r.timeout??1/0,conduit:new j(t.getSelf()),rpc:async s=>e(x.derive.host(s))});return await n.remote.infra.ready(),n.remote.host}var C=class{worker;messenger;constructor(e,r){this.worker=e,this.messenger=r}static async make(e,r){let o=r.tap??b,n=r.label??"comrade",s=e.loadWorker(r.workerUrl,n),i=f(),a={async ready(){i.resolve()}},c=new E({tap:o,timeout:r.timeout??1/0,conduit:new j(s),rpc:async u=>({infra:a,host:r.setupHost(x.derive.work(u))})});return await i.promise,new this(s,c)}get work(){return this.messenger.remote}terminate(){this.worker.terminate()}};var re=class{threads;static async make(e,r){let o=r.workerCount??e.guessOptimalThreadCount(),n=await Promise.all([...Array(o)].map(async(s,i)=>C.make(e,{...r,label:r.label??`${r.label??"comrade"}_${i+1}`})));return new this(n,{tap:r.tap})}work;#e=new Set;#t=[];constructor(e,r={}){this.threads=e;let o=r.tap??b,n=async(s,i)=>this.#o({request:s,prom:f(),transfer:i?.transfer});this.work=B({tap:o,endpoint:n}),e.forEach(s=>this.#e.add(s))}get threadCount(){return this.threads.length}terminate(){for(let e of this.threads)e.terminate()}#o(e){return this.#t.push(e),this.#r(),e.prom.promise}#r(){for(;this.#e.size>0&&this.#t.length>0;){let e=[...this.#e].pop();this.#e.delete(e);let r=this.#t.shift();this.#e.delete(e);let o=e.messenger.remoteEndpoint(r.request,{transfer:r.transfer});r.prom.entangle(o).finally(()=>{this.#e.add(e),this.#r()})}}};var Pe=t=>({thread:e=>C.make(t,e),cluster:e=>re.make(t,e),worker:(e,r={})=>Ie(t,e,r),work:e=>e,host:e=>e,mocks(e){let{setupWork:r,setupHost:o,tap:n=b}=e,s=x.mock.host(),i=x.mock.work();return i.work=D({tap:n,fns:r(s)}),s.host=D({tap:n,fns:o(i)}),{workShell:i,hostShell:s,work:i.work,host:s.host}},mockWork(e,r=b){let o=x.mock.host(),n=x.mock.work();return n.work=D({tap:r,fns:e(o)}),{workShell:n,hostShell:o,work:n.work,mockHost:s=>(o.host=D({tap:r,fns:s(n)}),{workShell:n,hostShell:o,work:n.work,host:o.host})}}});var We=()=>({getSelf(){return self},guessOptimalThreadCount(){let t=navigator.hardwareConcurrency??1;return Math.max(1,t-1)},loadWorker(t,e){return new window.Worker(t,{name:e,type:"module"})},async loadWasm(t){return WebAssembly.instantiateStreaming(fetch(t))}});var Qe=We(),oe=Pe(Qe);import{WhisperTextStreamer as Xe}from"https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.7.0/dist/transformers.min.js";import{pipeline as Ke}from"https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.7.0/dist/transformers.min.js";var ne=class{task;instance=null;model=null;constructor(e){this.task=e}async createInstance(e,r){return this.model=e,this.instance=await Ke(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 z=new ne("automatic-speech-recognition"),A,De=oe.work(t=>({async transcribe({audio:e,model:r,language:o,duration:n}){let s=r.startsWith("distil-whisper/");(!z.model||z.model!==r)&&(z.instance?.dispose()?.(),z.instance=null,A=await z.createInstance(r,h=>{h.progress&&t.host.updateModelLoadProgress({id:h.file,progress:h.progress})}));let i=A.processor.feature_extractor.config.chunk_length/A.model.config.max_source_positions,a=s?20:30,c=s?3:5,u=0,p=null,m=0,O=0,se=a-c,ie=()=>{let h=u*se;return Math.min(h/n,1)},q=new Xe(A.tokenizer,{time_precision:i,token_callback_function:()=>{p??=performance.now(),++m>1&&(O=m/(performance.now()-p)*1e3,t.host.updateTps(O))},callback_function:h=>{t.host.deliverTranscriptionChunk(h)},on_finalize:()=>{p=null,m=0,u++;let h=ie();t.host.updateTranscribeProgress(h)}}),T=await A(e,{top_k:0,do_sample:!1,chunk_length_s:a,stride_length_s:c,language:o,task:"transcribe",return_timestamps:"word",force_full_sequences:!1,streamer:q});return T?{tps:O,...T}:null}}));await oe.worker(De);
8
+ //# sourceMappingURL=worker.bundle.min.js.map