@livekit/agents-plugin-silero 1.0.31 → 1.0.32

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.
@@ -41,7 +41,6 @@ class OnnxModel {
41
41
  #contextSize;
42
42
  #sampleRateNd;
43
43
  #context;
44
- // #state: Float32Array;
45
44
  #rnnState;
46
45
  #inputBuffer;
47
46
  constructor(session, sampleRate) {
@@ -82,7 +81,8 @@ class OnnxModel {
82
81
  state: new import_onnxruntime_node.Tensor("float32", this.#rnnState, [2, 1, 128]),
83
82
  sr: new import_onnxruntime_node.Tensor("int64", this.#sampleRateNd)
84
83
  }).then((result) => {
85
- this.#context = this.#inputBuffer.subarray(0, this.#contextSize);
84
+ this.#rnnState.set(result.stateN.data);
85
+ this.#context = this.#inputBuffer.slice(-this.#contextSize);
86
86
  return result.output.data.at(0);
87
87
  });
88
88
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/onnx_model.ts","../../../node_modules/.pnpm/tsup@8.4.0_@microsoft+api-extractor@7.43.7_@types+node@22.19.1__postcss@8.4.38_tsx@4.20.4_typescript@5.4.5/node_modules/tsup/assets/cjs_shims.js"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { fileURLToPath } from 'node:url';\nimport { InferenceSession, Tensor } from 'onnxruntime-node';\n\nexport type SampleRate = 8000 | 16000;\n\nexport const newInferenceSession = (forceCPU: boolean) => {\n return InferenceSession.create(fileURLToPath(new URL('silero_vad.onnx', import.meta.url).href), {\n interOpNumThreads: 1,\n intraOpNumThreads: 1,\n executionMode: 'sequential',\n executionProviders: forceCPU ? [{ name: 'cpu' }] : undefined,\n });\n};\n\nexport class OnnxModel {\n #session: InferenceSession;\n #sampleRate: number;\n #windowSizeSamples: number;\n #contextSize: number;\n #sampleRateNd: BigInt64Array;\n #context: Float32Array;\n // #state: Float32Array;\n #rnnState: Float32Array;\n #inputBuffer: Float32Array;\n\n constructor(session: InferenceSession, sampleRate: SampleRate) {\n this.#session = session;\n this.#sampleRate = sampleRate;\n\n switch (sampleRate) {\n case 8000:\n this.#windowSizeSamples = 256;\n this.#contextSize = 32;\n break;\n case 16000:\n this.#windowSizeSamples = 512;\n this.#contextSize = 64;\n break;\n }\n\n this.#sampleRateNd = BigInt64Array.from([BigInt(sampleRate)]);\n this.#context = new Float32Array(this.#contextSize);\n this.#rnnState = new Float32Array(2 * 1 * 128);\n this.#inputBuffer = new Float32Array(this.#contextSize + this.#windowSizeSamples);\n }\n\n get sampleRate(): number {\n return this.#sampleRate;\n }\n\n get windowSizeSamples(): number {\n return this.#windowSizeSamples;\n }\n\n get contextSize(): number {\n return this.#contextSize;\n }\n\n async run(x: Float32Array): Promise<number> {\n this.#inputBuffer.set(this.#context, 0);\n this.#inputBuffer.set(x, this.#contextSize);\n\n return await this.#session\n .run({\n input: new Tensor('float32', this.#inputBuffer, [\n 1,\n this.#contextSize + this.#windowSizeSamples,\n ]),\n state: new Tensor('float32', this.#rnnState, [2, 1, 128]),\n sr: new Tensor('int64', this.#sampleRateNd),\n })\n .then((result) => {\n // this.#state = result.output.data as Float32Array,\n this.#context = this.#inputBuffer.subarray(0, this.#contextSize);\n return (result.output!.data as Float32Array).at(0)!;\n });\n }\n}\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n typeof document === 'undefined'\n ? new URL(`file:${__filename}`).href\n : (document.currentScript && document.currentScript.src) ||\n new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACKA,IAAM,mBAAmB,MACvB,OAAO,aAAa,cAChB,IAAI,IAAI,QAAQ,UAAU,EAAE,EAAE,OAC7B,SAAS,iBAAiB,SAAS,cAAc,OAClD,IAAI,IAAI,WAAW,SAAS,OAAO,EAAE;AAEpC,IAAM,gBAAgC,iCAAiB;ADR9D,sBAA8B;AAC9B,8BAAyC;AAIlC,MAAM,sBAAsB,CAAC,aAAsB;AACxD,SAAO,yCAAiB,WAAO,+BAAc,IAAI,IAAI,mBAAmB,aAAe,EAAE,IAAI,GAAG;AAAA,IAC9F,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,oBAAoB,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC,IAAI;AAAA,EACrD,CAAC;AACH;AAEO,MAAM,UAAU;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA,YAAY,SAA2B,YAAwB;AAC7D,SAAK,WAAW;AAChB,SAAK,cAAc;AAEnB,YAAQ,YAAY;AAAA,MAClB,KAAK;AACH,aAAK,qBAAqB;AAC1B,aAAK,eAAe;AACpB;AAAA,MACF,KAAK;AACH,aAAK,qBAAqB;AAC1B,aAAK,eAAe;AACpB;AAAA,IACJ;AAEA,SAAK,gBAAgB,cAAc,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAC5D,SAAK,WAAW,IAAI,aAAa,KAAK,YAAY;AAClD,SAAK,YAAY,IAAI,aAAa,IAAI,IAAI,GAAG;AAC7C,SAAK,eAAe,IAAI,aAAa,KAAK,eAAe,KAAK,kBAAkB;AAAA,EAClF;AAAA,EAEA,IAAI,aAAqB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,oBAA4B;AAC9B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,cAAsB;AACxB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,IAAI,GAAkC;AAC1C,SAAK,aAAa,IAAI,KAAK,UAAU,CAAC;AACtC,SAAK,aAAa,IAAI,GAAG,KAAK,YAAY;AAE1C,WAAO,MAAM,KAAK,SACf,IAAI;AAAA,MACH,OAAO,IAAI,+BAAO,WAAW,KAAK,cAAc;AAAA,QAC9C;AAAA,QACA,KAAK,eAAe,KAAK;AAAA,MAC3B,CAAC;AAAA,MACD,OAAO,IAAI,+BAAO,WAAW,KAAK,WAAW,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,MACxD,IAAI,IAAI,+BAAO,SAAS,KAAK,aAAa;AAAA,IAC5C,CAAC,EACA,KAAK,CAAC,WAAW;AAEhB,WAAK,WAAW,KAAK,aAAa,SAAS,GAAG,KAAK,YAAY;AAC/D,aAAQ,OAAO,OAAQ,KAAsB,GAAG,CAAC;AAAA,IACnD,CAAC;AAAA,EACL;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/onnx_model.ts","../../../node_modules/.pnpm/tsup@8.4.0_@microsoft+api-extractor@7.43.7_@types+node@22.19.1__postcss@8.4.38_tsx@4.20.4_typescript@5.4.5/node_modules/tsup/assets/cjs_shims.js"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { fileURLToPath } from 'node:url';\nimport { InferenceSession, Tensor } from 'onnxruntime-node';\n\nexport type SampleRate = 8000 | 16000;\n\nexport const newInferenceSession = (forceCPU: boolean) => {\n return InferenceSession.create(fileURLToPath(new URL('silero_vad.onnx', import.meta.url).href), {\n interOpNumThreads: 1,\n intraOpNumThreads: 1,\n executionMode: 'sequential',\n executionProviders: forceCPU ? [{ name: 'cpu' }] : undefined,\n });\n};\n\nexport class OnnxModel {\n #session: InferenceSession;\n #sampleRate: number;\n #windowSizeSamples: number;\n #contextSize: number;\n #sampleRateNd: BigInt64Array;\n #context: Float32Array;\n #rnnState: Float32Array;\n #inputBuffer: Float32Array;\n\n constructor(session: InferenceSession, sampleRate: SampleRate) {\n this.#session = session;\n this.#sampleRate = sampleRate;\n\n switch (sampleRate) {\n case 8000:\n this.#windowSizeSamples = 256;\n this.#contextSize = 32;\n break;\n case 16000:\n this.#windowSizeSamples = 512;\n this.#contextSize = 64;\n break;\n }\n\n this.#sampleRateNd = BigInt64Array.from([BigInt(sampleRate)]);\n this.#context = new Float32Array(this.#contextSize);\n this.#rnnState = new Float32Array(2 * 1 * 128);\n this.#inputBuffer = new Float32Array(this.#contextSize + this.#windowSizeSamples);\n }\n\n get sampleRate(): number {\n return this.#sampleRate;\n }\n\n get windowSizeSamples(): number {\n return this.#windowSizeSamples;\n }\n\n get contextSize(): number {\n return this.#contextSize;\n }\n\n async run(x: Float32Array): Promise<number> {\n this.#inputBuffer.set(this.#context, 0);\n this.#inputBuffer.set(x, this.#contextSize);\n\n return await this.#session\n .run({\n input: new Tensor('float32', this.#inputBuffer, [\n 1,\n this.#contextSize + this.#windowSizeSamples,\n ]),\n state: new Tensor('float32', this.#rnnState, [2, 1, 128]),\n sr: new Tensor('int64', this.#sampleRateNd),\n })\n .then((result) => {\n this.#rnnState.set(result.stateN!.data as Float32Array);\n this.#context = this.#inputBuffer.slice(-this.#contextSize);\n return (result.output!.data as Float32Array).at(0)!;\n });\n }\n}\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n typeof document === 'undefined'\n ? new URL(`file:${__filename}`).href\n : (document.currentScript && document.currentScript.src) ||\n new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACKA,IAAM,mBAAmB,MACvB,OAAO,aAAa,cAChB,IAAI,IAAI,QAAQ,UAAU,EAAE,EAAE,OAC7B,SAAS,iBAAiB,SAAS,cAAc,OAClD,IAAI,IAAI,WAAW,SAAS,OAAO,EAAE;AAEpC,IAAM,gBAAgC,iCAAiB;ADR9D,sBAA8B;AAC9B,8BAAyC;AAIlC,MAAM,sBAAsB,CAAC,aAAsB;AACxD,SAAO,yCAAiB,WAAO,+BAAc,IAAI,IAAI,mBAAmB,aAAe,EAAE,IAAI,GAAG;AAAA,IAC9F,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,oBAAoB,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC,IAAI;AAAA,EACrD,CAAC;AACH;AAEO,MAAM,UAAU;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,SAA2B,YAAwB;AAC7D,SAAK,WAAW;AAChB,SAAK,cAAc;AAEnB,YAAQ,YAAY;AAAA,MAClB,KAAK;AACH,aAAK,qBAAqB;AAC1B,aAAK,eAAe;AACpB;AAAA,MACF,KAAK;AACH,aAAK,qBAAqB;AAC1B,aAAK,eAAe;AACpB;AAAA,IACJ;AAEA,SAAK,gBAAgB,cAAc,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAC5D,SAAK,WAAW,IAAI,aAAa,KAAK,YAAY;AAClD,SAAK,YAAY,IAAI,aAAa,IAAI,IAAI,GAAG;AAC7C,SAAK,eAAe,IAAI,aAAa,KAAK,eAAe,KAAK,kBAAkB;AAAA,EAClF;AAAA,EAEA,IAAI,aAAqB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,oBAA4B;AAC9B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,cAAsB;AACxB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,IAAI,GAAkC;AAC1C,SAAK,aAAa,IAAI,KAAK,UAAU,CAAC;AACtC,SAAK,aAAa,IAAI,GAAG,KAAK,YAAY;AAE1C,WAAO,MAAM,KAAK,SACf,IAAI;AAAA,MACH,OAAO,IAAI,+BAAO,WAAW,KAAK,cAAc;AAAA,QAC9C;AAAA,QACA,KAAK,eAAe,KAAK;AAAA,MAC3B,CAAC;AAAA,MACD,OAAO,IAAI,+BAAO,WAAW,KAAK,WAAW,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,MACxD,IAAI,IAAI,+BAAO,SAAS,KAAK,aAAa;AAAA,IAC5C,CAAC,EACA,KAAK,CAAC,WAAW;AAChB,WAAK,UAAU,IAAI,OAAO,OAAQ,IAAoB;AACtD,WAAK,WAAW,KAAK,aAAa,MAAM,CAAC,KAAK,YAAY;AAC1D,aAAQ,OAAO,OAAQ,KAAsB,GAAG,CAAC;AAAA,IACnD,CAAC;AAAA,EACL;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"onnx_model.d.ts","sourceRoot":"","sources":["../src/onnx_model.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,gBAAgB,EAAU,MAAM,kBAAkB,CAAC;AAE5D,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,KAAK,CAAC;AAEtC,eAAO,MAAM,mBAAmB,aAAc,OAAO,8BAOpD,CAAC;AAEF,qBAAa,SAAS;;gBAWR,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU;IAqB7D,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAEK,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;CAmB5C"}
1
+ {"version":3,"file":"onnx_model.d.ts","sourceRoot":"","sources":["../src/onnx_model.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,gBAAgB,EAAU,MAAM,kBAAkB,CAAC;AAE5D,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,KAAK,CAAC;AAEtC,eAAO,MAAM,mBAAmB,aAAc,OAAO,8BAOpD,CAAC;AAEF,qBAAa,SAAS;;gBAUR,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU;IAqB7D,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAEK,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;CAmB5C"}
@@ -15,7 +15,6 @@ class OnnxModel {
15
15
  #contextSize;
16
16
  #sampleRateNd;
17
17
  #context;
18
- // #state: Float32Array;
19
18
  #rnnState;
20
19
  #inputBuffer;
21
20
  constructor(session, sampleRate) {
@@ -56,7 +55,8 @@ class OnnxModel {
56
55
  state: new Tensor("float32", this.#rnnState, [2, 1, 128]),
57
56
  sr: new Tensor("int64", this.#sampleRateNd)
58
57
  }).then((result) => {
59
- this.#context = this.#inputBuffer.subarray(0, this.#contextSize);
58
+ this.#rnnState.set(result.stateN.data);
59
+ this.#context = this.#inputBuffer.slice(-this.#contextSize);
60
60
  return result.output.data.at(0);
61
61
  });
62
62
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/onnx_model.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { fileURLToPath } from 'node:url';\nimport { InferenceSession, Tensor } from 'onnxruntime-node';\n\nexport type SampleRate = 8000 | 16000;\n\nexport const newInferenceSession = (forceCPU: boolean) => {\n return InferenceSession.create(fileURLToPath(new URL('silero_vad.onnx', import.meta.url).href), {\n interOpNumThreads: 1,\n intraOpNumThreads: 1,\n executionMode: 'sequential',\n executionProviders: forceCPU ? [{ name: 'cpu' }] : undefined,\n });\n};\n\nexport class OnnxModel {\n #session: InferenceSession;\n #sampleRate: number;\n #windowSizeSamples: number;\n #contextSize: number;\n #sampleRateNd: BigInt64Array;\n #context: Float32Array;\n // #state: Float32Array;\n #rnnState: Float32Array;\n #inputBuffer: Float32Array;\n\n constructor(session: InferenceSession, sampleRate: SampleRate) {\n this.#session = session;\n this.#sampleRate = sampleRate;\n\n switch (sampleRate) {\n case 8000:\n this.#windowSizeSamples = 256;\n this.#contextSize = 32;\n break;\n case 16000:\n this.#windowSizeSamples = 512;\n this.#contextSize = 64;\n break;\n }\n\n this.#sampleRateNd = BigInt64Array.from([BigInt(sampleRate)]);\n this.#context = new Float32Array(this.#contextSize);\n this.#rnnState = new Float32Array(2 * 1 * 128);\n this.#inputBuffer = new Float32Array(this.#contextSize + this.#windowSizeSamples);\n }\n\n get sampleRate(): number {\n return this.#sampleRate;\n }\n\n get windowSizeSamples(): number {\n return this.#windowSizeSamples;\n }\n\n get contextSize(): number {\n return this.#contextSize;\n }\n\n async run(x: Float32Array): Promise<number> {\n this.#inputBuffer.set(this.#context, 0);\n this.#inputBuffer.set(x, this.#contextSize);\n\n return await this.#session\n .run({\n input: new Tensor('float32', this.#inputBuffer, [\n 1,\n this.#contextSize + this.#windowSizeSamples,\n ]),\n state: new Tensor('float32', this.#rnnState, [2, 1, 128]),\n sr: new Tensor('int64', this.#sampleRateNd),\n })\n .then((result) => {\n // this.#state = result.output.data as Float32Array,\n this.#context = this.#inputBuffer.subarray(0, this.#contextSize);\n return (result.output!.data as Float32Array).at(0)!;\n });\n }\n}\n"],"mappings":"AAGA,SAAS,qBAAqB;AAC9B,SAAS,kBAAkB,cAAc;AAIlC,MAAM,sBAAsB,CAAC,aAAsB;AACxD,SAAO,iBAAiB,OAAO,cAAc,IAAI,IAAI,mBAAmB,YAAY,GAAG,EAAE,IAAI,GAAG;AAAA,IAC9F,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,oBAAoB,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC,IAAI;AAAA,EACrD,CAAC;AACH;AAEO,MAAM,UAAU;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA,YAAY,SAA2B,YAAwB;AAC7D,SAAK,WAAW;AAChB,SAAK,cAAc;AAEnB,YAAQ,YAAY;AAAA,MAClB,KAAK;AACH,aAAK,qBAAqB;AAC1B,aAAK,eAAe;AACpB;AAAA,MACF,KAAK;AACH,aAAK,qBAAqB;AAC1B,aAAK,eAAe;AACpB;AAAA,IACJ;AAEA,SAAK,gBAAgB,cAAc,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAC5D,SAAK,WAAW,IAAI,aAAa,KAAK,YAAY;AAClD,SAAK,YAAY,IAAI,aAAa,IAAI,IAAI,GAAG;AAC7C,SAAK,eAAe,IAAI,aAAa,KAAK,eAAe,KAAK,kBAAkB;AAAA,EAClF;AAAA,EAEA,IAAI,aAAqB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,oBAA4B;AAC9B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,cAAsB;AACxB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,IAAI,GAAkC;AAC1C,SAAK,aAAa,IAAI,KAAK,UAAU,CAAC;AACtC,SAAK,aAAa,IAAI,GAAG,KAAK,YAAY;AAE1C,WAAO,MAAM,KAAK,SACf,IAAI;AAAA,MACH,OAAO,IAAI,OAAO,WAAW,KAAK,cAAc;AAAA,QAC9C;AAAA,QACA,KAAK,eAAe,KAAK;AAAA,MAC3B,CAAC;AAAA,MACD,OAAO,IAAI,OAAO,WAAW,KAAK,WAAW,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,MACxD,IAAI,IAAI,OAAO,SAAS,KAAK,aAAa;AAAA,IAC5C,CAAC,EACA,KAAK,CAAC,WAAW;AAEhB,WAAK,WAAW,KAAK,aAAa,SAAS,GAAG,KAAK,YAAY;AAC/D,aAAQ,OAAO,OAAQ,KAAsB,GAAG,CAAC;AAAA,IACnD,CAAC;AAAA,EACL;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/onnx_model.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { fileURLToPath } from 'node:url';\nimport { InferenceSession, Tensor } from 'onnxruntime-node';\n\nexport type SampleRate = 8000 | 16000;\n\nexport const newInferenceSession = (forceCPU: boolean) => {\n return InferenceSession.create(fileURLToPath(new URL('silero_vad.onnx', import.meta.url).href), {\n interOpNumThreads: 1,\n intraOpNumThreads: 1,\n executionMode: 'sequential',\n executionProviders: forceCPU ? [{ name: 'cpu' }] : undefined,\n });\n};\n\nexport class OnnxModel {\n #session: InferenceSession;\n #sampleRate: number;\n #windowSizeSamples: number;\n #contextSize: number;\n #sampleRateNd: BigInt64Array;\n #context: Float32Array;\n #rnnState: Float32Array;\n #inputBuffer: Float32Array;\n\n constructor(session: InferenceSession, sampleRate: SampleRate) {\n this.#session = session;\n this.#sampleRate = sampleRate;\n\n switch (sampleRate) {\n case 8000:\n this.#windowSizeSamples = 256;\n this.#contextSize = 32;\n break;\n case 16000:\n this.#windowSizeSamples = 512;\n this.#contextSize = 64;\n break;\n }\n\n this.#sampleRateNd = BigInt64Array.from([BigInt(sampleRate)]);\n this.#context = new Float32Array(this.#contextSize);\n this.#rnnState = new Float32Array(2 * 1 * 128);\n this.#inputBuffer = new Float32Array(this.#contextSize + this.#windowSizeSamples);\n }\n\n get sampleRate(): number {\n return this.#sampleRate;\n }\n\n get windowSizeSamples(): number {\n return this.#windowSizeSamples;\n }\n\n get contextSize(): number {\n return this.#contextSize;\n }\n\n async run(x: Float32Array): Promise<number> {\n this.#inputBuffer.set(this.#context, 0);\n this.#inputBuffer.set(x, this.#contextSize);\n\n return await this.#session\n .run({\n input: new Tensor('float32', this.#inputBuffer, [\n 1,\n this.#contextSize + this.#windowSizeSamples,\n ]),\n state: new Tensor('float32', this.#rnnState, [2, 1, 128]),\n sr: new Tensor('int64', this.#sampleRateNd),\n })\n .then((result) => {\n this.#rnnState.set(result.stateN!.data as Float32Array);\n this.#context = this.#inputBuffer.slice(-this.#contextSize);\n return (result.output!.data as Float32Array).at(0)!;\n });\n }\n}\n"],"mappings":"AAGA,SAAS,qBAAqB;AAC9B,SAAS,kBAAkB,cAAc;AAIlC,MAAM,sBAAsB,CAAC,aAAsB;AACxD,SAAO,iBAAiB,OAAO,cAAc,IAAI,IAAI,mBAAmB,YAAY,GAAG,EAAE,IAAI,GAAG;AAAA,IAC9F,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,oBAAoB,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC,IAAI;AAAA,EACrD,CAAC;AACH;AAEO,MAAM,UAAU;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,SAA2B,YAAwB;AAC7D,SAAK,WAAW;AAChB,SAAK,cAAc;AAEnB,YAAQ,YAAY;AAAA,MAClB,KAAK;AACH,aAAK,qBAAqB;AAC1B,aAAK,eAAe;AACpB;AAAA,MACF,KAAK;AACH,aAAK,qBAAqB;AAC1B,aAAK,eAAe;AACpB;AAAA,IACJ;AAEA,SAAK,gBAAgB,cAAc,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAC5D,SAAK,WAAW,IAAI,aAAa,KAAK,YAAY;AAClD,SAAK,YAAY,IAAI,aAAa,IAAI,IAAI,GAAG;AAC7C,SAAK,eAAe,IAAI,aAAa,KAAK,eAAe,KAAK,kBAAkB;AAAA,EAClF;AAAA,EAEA,IAAI,aAAqB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,oBAA4B;AAC9B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,cAAsB;AACxB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,IAAI,GAAkC;AAC1C,SAAK,aAAa,IAAI,KAAK,UAAU,CAAC;AACtC,SAAK,aAAa,IAAI,GAAG,KAAK,YAAY;AAE1C,WAAO,MAAM,KAAK,SACf,IAAI;AAAA,MACH,OAAO,IAAI,OAAO,WAAW,KAAK,cAAc;AAAA,QAC9C;AAAA,QACA,KAAK,eAAe,KAAK;AAAA,MAC3B,CAAC;AAAA,MACD,OAAO,IAAI,OAAO,WAAW,KAAK,WAAW,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,MACxD,IAAI,IAAI,OAAO,SAAS,KAAK,aAAa;AAAA,IAC5C,CAAC,EACA,KAAK,CAAC,WAAW;AAChB,WAAK,UAAU,IAAI,OAAO,OAAQ,IAAoB;AACtD,WAAK,WAAW,KAAK,aAAa,MAAM,CAAC,KAAK,YAAY;AAC1D,aAAQ,OAAO,OAAQ,KAAsB,GAAG,CAAC;AAAA,IACnD,CAAC;AAAA,EACL;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@livekit/agents-plugin-silero",
3
- "version": "1.0.31",
3
+ "version": "1.0.32",
4
4
  "description": "Silero voice activity detection LiveKit Node Agents",
5
5
  "main": "dist/index.js",
6
6
  "require": "dist/index.cjs",
@@ -31,7 +31,7 @@
31
31
  "onnxruntime-common": "1.21.0",
32
32
  "tsup": "^8.3.5",
33
33
  "typescript": "^5.0.0",
34
- "@livekit/agents": "1.0.31"
34
+ "@livekit/agents": "1.0.32"
35
35
  },
36
36
  "dependencies": {
37
37
  "onnxruntime-node": "1.21.0",
@@ -39,7 +39,7 @@
39
39
  },
40
40
  "peerDependencies": {
41
41
  "@livekit/rtc-node": "^0.13.22",
42
- "@livekit/agents": "1.0.31"
42
+ "@livekit/agents": "1.0.32"
43
43
  },
44
44
  "scripts": {
45
45
  "build": "tsup --onSuccess \"pnpm build:types\" && cp src/silero_vad.onnx dist/",
package/src/onnx_model.ts CHANGED
@@ -22,7 +22,6 @@ export class OnnxModel {
22
22
  #contextSize: number;
23
23
  #sampleRateNd: BigInt64Array;
24
24
  #context: Float32Array;
25
- // #state: Float32Array;
26
25
  #rnnState: Float32Array;
27
26
  #inputBuffer: Float32Array;
28
27
 
@@ -73,8 +72,8 @@ export class OnnxModel {
73
72
  sr: new Tensor('int64', this.#sampleRateNd),
74
73
  })
75
74
  .then((result) => {
76
- // this.#state = result.output.data as Float32Array,
77
- this.#context = this.#inputBuffer.subarray(0, this.#contextSize);
75
+ this.#rnnState.set(result.stateN!.data as Float32Array);
76
+ this.#context = this.#inputBuffer.slice(-this.#contextSize);
78
77
  return (result.output!.data as Float32Array).at(0)!;
79
78
  });
80
79
  }