echogarden 1.0.2 → 1.0.3

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 (54) hide show
  1. package/dist/api/API.d.ts +1 -1
  2. package/dist/api/API.js +1 -1
  3. package/dist/api/API.js.map +1 -1
  4. package/dist/api/Alignment.d.ts +1 -1
  5. package/dist/api/Alignment.js +3 -3
  6. package/dist/api/Alignment.js.map +1 -1
  7. package/dist/api/LanguageDetection.d.ts +1 -1
  8. package/dist/api/LanguageDetection.js +1 -1
  9. package/dist/api/LanguageDetection.js.map +1 -1
  10. package/dist/api/Recognition.d.ts +1 -1
  11. package/dist/api/Synthesis.d.ts +2 -2
  12. package/dist/api/Synthesis.js.map +1 -1
  13. package/dist/api/Translation.d.ts +3 -3
  14. package/dist/api/Translation.js.map +1 -1
  15. package/dist/api/{Vad.js → VoiceActivityDetection.js} +1 -1
  16. package/dist/api/VoiceActivityDetection.js.map +1 -0
  17. package/dist/nlp/Segmentation.js +2 -2
  18. package/dist/nlp/Segmentation.js.map +1 -1
  19. package/dist/recognition/SileroSTT.js +1 -1
  20. package/dist/recognition/SileroSTT.js.map +1 -1
  21. package/dist/recognition/WhisperSTT.d.ts +11 -2
  22. package/dist/recognition/WhisperSTT.js +75 -16
  23. package/dist/recognition/WhisperSTT.js.map +1 -1
  24. package/dist/source-separation/MDXNetSourceSeparation.d.ts +1 -1
  25. package/dist/source-separation/MDXNetSourceSeparation.js +2 -1
  26. package/dist/source-separation/MDXNetSourceSeparation.js.map +1 -1
  27. package/dist/speech-language-detection/SileroLanguageDetection.d.ts +1 -1
  28. package/dist/speech-language-detection/SileroLanguageDetection.js +2 -1
  29. package/dist/speech-language-detection/SileroLanguageDetection.js.map +1 -1
  30. package/dist/synthesis/VitsTTS.d.ts +2 -2
  31. package/dist/synthesis/VitsTTS.js.map +1 -1
  32. package/dist/tests/Test.js +1 -14
  33. package/dist/tests/Test.js.map +1 -1
  34. package/dist/voice-activity-detection/SileroVAD.d.ts +5 -5
  35. package/dist/voice-activity-detection/SileroVAD.js +13 -12
  36. package/dist/voice-activity-detection/SileroVAD.js.map +1 -1
  37. package/package.json +7 -7
  38. package/src/api/API.ts +1 -1
  39. package/src/api/Alignment.ts +4 -4
  40. package/src/api/LanguageDetection.ts +2 -2
  41. package/src/api/Recognition.ts +1 -1
  42. package/src/api/Synthesis.ts +3 -3
  43. package/src/api/Translation.ts +3 -3
  44. package/src/nlp/Segmentation.ts +2 -2
  45. package/src/recognition/SileroSTT.ts +3 -1
  46. package/src/recognition/WhisperSTT.ts +108 -27
  47. package/src/source-separation/MDXNetSourceSeparation.ts +5 -1
  48. package/src/speech-language-detection/SileroLanguageDetection.ts +5 -1
  49. package/src/synthesis/VitsTTS.ts +3 -3
  50. package/src/tests/Test.ts +2 -17
  51. package/src/voice-activity-detection/SileroVAD.ts +23 -19
  52. package/dist/api/Vad.js.map +0 -1
  53. /package/dist/api/{Vad.d.ts → VoiceActivityDetection.d.ts} +0 -0
  54. /package/src/api/{Vad.ts → VoiceActivityDetection.ts} +0 -0
@@ -1,8 +1,8 @@
1
- import Onnx from 'onnxruntime-node'
1
+ import type * as Onnx from 'onnxruntime-node'
2
2
 
3
3
  import { Logger } from '../utilities/Logger.js'
4
4
  import { computeMelSpectogramUsingFilterbanks, Filterbank } from '../dsp/MelSpectogram.js'
5
- import { clip, getIntegerRange, getRepetitionScoreRelativeToFirstSubstring, splitFloat32Array, yieldToEventLoop } from '../utilities/Utilities.js'
5
+ import { clip, getIntegerRange, getRepetitionScoreRelativeToFirstSubstring, getUTF32Chars, logToStderr, splitFloat32Array, yieldToEventLoop } from '../utilities/Utilities.js'
6
6
  import { indexOfMax, logOfVector, logSumExp, meanOfVector, medianFilter, softmax, stdDeviationOfVector } from '../math/VectorMath.js'
7
7
 
8
8
  import { alignDTWWindowed } from '../alignment/DTWSequenceAlignmentWindowed.js'
@@ -135,8 +135,6 @@ export class Whisper {
135
135
 
136
136
  timestampTokensStart: number
137
137
  timestampTokensEnd: number
138
-
139
- suppressedTokens: Set<number>
140
138
  }
141
139
 
142
140
  randomGen: XorShift32RNG
@@ -163,16 +161,7 @@ export class Whisper {
163
161
 
164
162
  timestampTokensStart: 50364,
165
163
  timestampTokensEnd: 50364 + 1501,
166
-
167
- suppressedTokens: new Set()
168
164
  }
169
-
170
- const suppressedTextTokens = [1, 2, 6, 7, 8, 9, 10, 12, 14, 25, 26, 27, 28, 29, 31, 58, 59, 60, 61, 62, 63, 90, 91, 92, 93, 359, 503, 522, 542, 873, 893, 902, 918, 922, 931, 1350, 1853, 1982, 2460, 2627, 3246, 3253, 3268, 3536, 3846, 3961, 4183, 4667, 6585, 6647, 7273, 9061, 9383, 10428, 10929, 11938, 12033, 12331, 12562, 13793, 14157, 14635, 15265, 15618, 16553, 16604, 18362, 18956, 20075, 21675, 22520, 26130, 26161, 26435, 28279, 29464, 31650, 32302, 32470, 36865, 42863, 47425, 49870, 50254]
171
- const suppressedMetadataTokens = [50256, ...getIntegerRange(50258, 50364)]
172
-
173
- const suppressedTokens = [...suppressedTextTokens, ...suppressedMetadataTokens]
174
-
175
- this.tokenConfig.suppressedTokens = new Set(suppressedTokens)
176
165
  } else {
177
166
  this.tokenConfig = {
178
167
  endOfTextToken: 50256,
@@ -189,16 +178,7 @@ export class Whisper {
189
178
 
190
179
  timestampTokensStart: 50363,
191
180
  timestampTokensEnd: 50363 + 1501,
192
-
193
- suppressedTokens: new Set()
194
181
  }
195
-
196
- const suppressedTextTokens = [1, 2, 7, 8, 9, 10, 14, 25, 26, 27, 28, 29, 31, 58, 59, 60, 61, 62, 63, 90, 91, 92, 93, 357, 366, 438, 532, 685, 705, 796, 930, 1058, 1220, 1267, 1279, 1303, 1343, 1377, 1391, 1635, 1782, 1875, 2162, 2361, 2488, 3467, 4008, 4211, 4600, 4808, 5299, 5855, 6329, 7203, 9609, 9959, 10563, 10786, 11420, 11709, 11907, 13163, 13697, 13700, 14808, 15306, 16410, 16791, 17992, 19203, 19510, 20724, 22305, 22935, 27007, 30109, 30420, 33409, 34949, 40283, 40493, 40549, 47282, 49146]
197
- const suppressedMetadataTokens = [...getIntegerRange(50257, 50363)]
198
-
199
- const suppressedTokens = [...suppressedTextTokens, ...suppressedMetadataTokens]
200
-
201
- this.tokenConfig.suppressedTokens = new Set(suppressedTokens)
202
182
  }
203
183
 
204
184
  this.randomGen = new XorShift32RNG(rngSeed)
@@ -283,6 +263,8 @@ export class Whisper {
283
263
 
284
264
  const encoderFilePath = path.join(this.modelDir, 'encoder.onnx')
285
265
 
266
+ const Onnx = await import('onnxruntime-node')
267
+
286
268
  this.audioEncoder = await Onnx.InferenceSession.create(encoderFilePath, this.onnxOptions)
287
269
 
288
270
  logger.end()
@@ -299,6 +281,8 @@ export class Whisper {
299
281
 
300
282
  const decoderFilePath = path.join(this.modelDir, 'decoder.onnx')
301
283
 
284
+ const Onnx = await import('onnxruntime-node')
285
+
302
286
  this.textDecoder = await Onnx.InferenceSession.create(decoderFilePath, this.onnxOptions)
303
287
 
304
288
  logger.end()
@@ -463,6 +447,8 @@ export class Whisper {
463
447
  const initialTokens = [sotToken]
464
448
  const offset = 0
465
449
 
450
+ const Onnx = await import('onnxruntime-node')
451
+
466
452
  const initialKvDimensions = this.getKvDimensions(1, initialTokens.length)
467
453
  const kvCacheTensor = new Onnx.Tensor('float32', new Float32Array(initialKvDimensions[0] * initialKvDimensions[1] * initialKvDimensions[2] * initialKvDimensions[3]), initialKvDimensions)
468
454
 
@@ -515,21 +501,23 @@ export class Whisper {
515
501
 
516
502
  const logger = new Logger()
517
503
 
504
+ const allowedPunctuationMarks = this.getAllowedPunctuationMarks()
505
+
518
506
  await logger.startAsync('Decode text tokens with Whisper decoder model')
519
507
 
520
508
  options = extendDeep(defaultWhisperOptions, options)
521
509
 
510
+ const Onnx = await import('onnxruntime-node')
511
+
522
512
  const endOfTextToken = this.tokenConfig.endOfTextToken
523
513
 
524
514
  const timestampTokensStart = this.tokenConfig.timestampTokensStart
525
- const suppressedTokens = this.tokenConfig.suppressedTokens
515
+ const suppressedTokens = new Set(this.getSuppressedTokens())
526
516
 
527
517
  const spaceToken = this.textToTokens(' ')[0]
528
518
 
529
519
  const maxDecodedTokenCount = options.maxTokensPerPart!
530
520
 
531
- //const suppressedTokensText = Array.from(this.tokenConfig.suppressedTokens).map(token => this.tokenToText(token, true))
532
-
533
521
  let decodedTokens = initialTokens.slice()
534
522
  const initialKvDimensions = this.getKvDimensions(1, decodedTokens.length)
535
523
  let kvCacheTensor = new Onnx.Tensor('float32', new Float32Array(initialKvDimensions[0] * initialKvDimensions[1] * initialKvDimensions[2] * initialKvDimensions[3]), initialKvDimensions)
@@ -689,7 +677,7 @@ export class Whisper {
689
677
  return maxScore
690
678
  })
691
679
 
692
- const thresholdRepetitionScore = 3
680
+ const thresholdRepetitionScore = 4
693
681
 
694
682
  if (topCandidatesRepetitionScores.every(score => score >= thresholdRepetitionScore)) {
695
683
  const indexOfMaxScore = topCandidatesRepetitionScores.indexOf(Math.max(...topCandidatesRepetitionScores))
@@ -717,7 +705,7 @@ export class Whisper {
717
705
  const rankOfPromisingPunctuationToken = topCandidates.findIndex((entry, index) => {
718
706
  const tokenText = this.tokenToText(entry.token).trim()
719
707
 
720
- const isPunctuationToken = [',', ',', '、', '.', '。', '!', '?'].includes(tokenText)
708
+ const isPunctuationToken = allowedPunctuationMarks.includes(tokenText)
721
709
 
722
710
  if (!isPunctuationToken) {
723
711
  return false
@@ -794,6 +782,8 @@ export class Whisper {
794
782
  async inferCrossAttentionQKs(tokens: number[], audioFeatures: Onnx.Tensor) {
795
783
  const offset = 0
796
784
 
785
+ const Onnx = await import('onnxruntime-node')
786
+
797
787
  const tokensTensor = new Onnx.Tensor('int64', new BigInt64Array(tokens.map(token => BigInt(token))), [1, tokens.length])
798
788
  const offsetTensor = new Onnx.Tensor('int64', new BigInt64Array([BigInt(offset)]), [])
799
789
 
@@ -842,6 +832,8 @@ export class Whisper {
842
832
  async encodeAudio(rawAudio: RawAudio) {
843
833
  await this.initializeEncoderSessionIfNeeded()
844
834
 
835
+ const Onnx = await import('onnxruntime-node')
836
+
845
837
  const logger = new Logger()
846
838
 
847
839
  const audioSamples = rawAudio.audioChannels[0]
@@ -1429,6 +1421,90 @@ export class Whisper {
1429
1421
  getAlignmentHeadIndexes() {
1430
1422
  return alignmentHeadsIndexes[this.modelName]
1431
1423
  }
1424
+
1425
+ getSuppressedTokens() {
1426
+ return [
1427
+ ...this.getSuppressedTextTokens(),
1428
+ ...this.getSuppressedMetadataTokens(),
1429
+ ]
1430
+ }
1431
+
1432
+ getSuppressedTextTokens() {
1433
+ const allowedPunctuationMarks = this.getAllowedPunctuationMarks()
1434
+
1435
+ const nonWordTokensData = this.getNonWordTokenData()
1436
+
1437
+ const suppressedTextTokens = nonWordTokensData
1438
+ .filter(entry => !allowedPunctuationMarks.includes(entry.text))
1439
+ .map(entry => entry.id)
1440
+
1441
+ return suppressedTextTokens
1442
+ }
1443
+
1444
+ getSuppressedMetadataTokens() {
1445
+ if (this.isMultiligualModel) {
1446
+ return [50256, ...getIntegerRange(50258, 50364)]
1447
+ } else {
1448
+ return [...getIntegerRange(50257, 50363)]
1449
+ }
1450
+ }
1451
+
1452
+ getAllowedPunctuationMarks() {
1453
+ const generalPunctuation = [`'`, ',', '.', '?', '!']
1454
+
1455
+ let allowedPunctuation: string[]
1456
+
1457
+ if (this.isMultiligualModel) {
1458
+ const spanish = ['¿', '¡']
1459
+ const chinese = ['、', ',', '。', '?', '!']
1460
+ const arabic = ['،', '؟']
1461
+ const various = ['·', '•', '・']
1462
+
1463
+ allowedPunctuation = [...generalPunctuation, ...arabic, ...chinese, ...spanish, ...various]
1464
+ } else {
1465
+ allowedPunctuation = generalPunctuation
1466
+ }
1467
+
1468
+ return allowedPunctuation
1469
+ }
1470
+
1471
+ getNonWordTokenData() {
1472
+ const nonWordTokenData: WhisperTokenData[] = []
1473
+
1474
+ const invalidUTF8Char = String.fromCharCode(65533)
1475
+
1476
+ for (let i = 0; i < this.tokenConfig.endOfTextToken; i++) {
1477
+ const tokenText = this.tokenToText(i, false)
1478
+ const tokenTextWithoutWhitespace = tokenText.replaceAll(/\s/g, '')
1479
+
1480
+ const isNonWordToken = /^[\p{Punctuation}\p{Symbol}]+$/u.test(tokenTextWithoutWhitespace)
1481
+
1482
+ const containsInvalidUTF8 = getUTF32Chars(tokenTextWithoutWhitespace).utf32chars.includes(invalidUTF8Char)
1483
+
1484
+ if (isNonWordToken && !containsInvalidUTF8) {
1485
+ nonWordTokenData.push({
1486
+ id: i,
1487
+ text: tokenText,
1488
+ })
1489
+ }
1490
+ }
1491
+
1492
+ return nonWordTokenData
1493
+ }
1494
+
1495
+
1496
+ getTokensData(tokens: number[]) {
1497
+ const tokensData: WhisperTokenData[] = []
1498
+
1499
+ for (const token of tokens) {
1500
+ tokensData.push({
1501
+ id: token,
1502
+ text: this.tokenToText(token, true),
1503
+ })
1504
+ }
1505
+
1506
+ return tokensData
1507
+ }
1432
1508
  }
1433
1509
 
1434
1510
  const filterbanks: Filterbank[] = [
@@ -1637,6 +1713,11 @@ export function isEnglishOnlyModel(modelName: WhisperModelName) {
1637
1713
  return modelName.endsWith('.en')
1638
1714
  }
1639
1715
 
1716
+ export type WhisperTokenData = {
1717
+ id: number
1718
+ text: string
1719
+ }
1720
+
1640
1721
  export type WhisperModelName = 'tiny' | 'tiny.en' | 'base' | 'base.en' | 'small' | 'small.en' | 'medium' | 'medium.en' | 'large' | 'large-v1' | 'large-v2' | 'large-v3'
1641
1722
  export type WhisperTask = 'transcribe' | 'translate' | 'detect-language'
1642
1723
 
@@ -1,4 +1,4 @@
1
- import Onnx from 'onnxruntime-node'
1
+ import type * as Onnx from 'onnxruntime-node'
2
2
  import { RawAudio } from '../audio/AudioUtilities.js';
3
3
  import { binBufferToComplex, complexToBinBuffer, getWindowWeights, stftr, stiftr } from '../dsp/FFT.js';
4
4
  import { ComplexNumber } from '../math/VectorMath.js';
@@ -32,6 +32,8 @@ export class MDXNet {
32
32
  await this.initializeSession(this.modelFilePath)
33
33
  }
34
34
 
35
+ const Onnx = await import('onnxruntime-node')
36
+
35
37
  const logger = new Logger()
36
38
 
37
39
  const session = this.session!
@@ -223,6 +225,8 @@ export class MDXNet {
223
225
  logSeverityLevel: 3
224
226
  }
225
227
 
228
+ const Onnx = await import('onnxruntime-node')
229
+
226
230
  this.session = await Onnx.InferenceSession.create(modelPath, onnxOptions)
227
231
  }
228
232
  }
@@ -1,4 +1,4 @@
1
- import Onnx from 'onnxruntime-node'
1
+ import type * as Onnx from 'onnxruntime-node'
2
2
  import { softmax } from '../math/VectorMath.js'
3
3
  import { Logger } from '../utilities/Logger.js'
4
4
  import { RawAudio } from '../audio/AudioUtilities.js'
@@ -50,6 +50,8 @@ export class SileroLanguageDetection {
50
50
  logSeverityLevel: 3
51
51
  }
52
52
 
53
+ const Onnx = await import('onnxruntime-node')
54
+
53
55
  this.session = await Onnx.InferenceSession.create(this.modelPath, onnxOptions)
54
56
 
55
57
  logger.end()
@@ -62,6 +64,8 @@ export class SileroLanguageDetection {
62
64
 
63
65
  const audioSamples = rawAudio.audioChannels[0]
64
66
 
67
+ const Onnx = await import('onnxruntime-node')
68
+
65
69
  const inputTensor = new Onnx.Tensor('float32', audioSamples, [1, audioSamples.length])
66
70
 
67
71
  const inputs = { input: inputTensor }
@@ -1,4 +1,4 @@
1
- import type { InferenceSession } from 'onnxruntime-node'
1
+ import type * as Onnx from 'onnxruntime-node'
2
2
  import { SynthesisVoice } from '../api/API.js'
3
3
  import { Logger } from '../utilities/Logger.js'
4
4
  import { RawAudio, getEmptyRawAudio, getRawAudioDuration } from '../audio/AudioUtilities.js'
@@ -32,7 +32,7 @@ export class VitsTTS {
32
32
  voiceName: string
33
33
  modelPath: string
34
34
 
35
- modelSession?: InferenceSession
35
+ modelSession?: Onnx.InferenceSession
36
36
  metadata?: any
37
37
  phonemeMap?: Map<string, number[]>
38
38
 
@@ -45,7 +45,7 @@ export class VitsTTS {
45
45
  const logger = new Logger()
46
46
  await logger.startAsync('Initialize VITS ONNX synthesis model')
47
47
 
48
- const onnxOptions: InferenceSession.SessionOptions = {
48
+ const onnxOptions: Onnx.InferenceSession.SessionOptions = {
49
49
  logSeverityLevel: 3
50
50
  }
51
51
 
package/src/tests/Test.ts CHANGED
@@ -1,20 +1,17 @@
1
1
  import { getRepetitionScoreRelativeToFirstSubstring, logToStderr, setupProgramTerminationListeners, writeToStderr } from '../utilities/Utilities.js'
2
2
  import { makeTarballsForInstalledPackages } from '../utilities/TarballMaker.js'
3
3
  import { testEspeakSynthesisWithPrePhonemizedInputs, testKirshenbaumPhonemization } from '../synthesis/EspeakTTS.js'
4
- import { isPunctuation } from '../nlp/Segmentation.js'
5
4
 
6
5
  const log = logToStderr
7
6
 
8
7
  setupProgramTerminationListeners()
8
+
9
9
  //process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
10
10
  //process.env.http_proxy = 'http://localhost:8080'
11
11
 
12
12
  //const testText = `After a while, finding that nothing more happened, she decided on going into the garden at once; but, alas for poor Alice! when she got to the door, she found she had forgotten the little golden key, and when she went back to the table for it, she found she could not possibly reach it: she could see it quite plainly through the glass, and she tried her best to climb up one of the legs of the table, but it was too slippery; and when she had tired herself out with trying, the poor little thing sat down and cried.`
13
-
14
13
  //await testKirshenbaumPhonemization(testText)
15
14
 
16
- //await makeTarballsForInstalledPackages(true)
17
-
18
15
  //getRepetitionScoreRelativeToFirstSubstring(['a', 'b', 'c', 'a', 'b', 'c'])
19
16
  //getRepetitionScoreRelativeToFirstSubstring(['a', 'b', 'a', 'd', 'a', 'b', 'a', 'd'])
20
17
  //getRepetitionScoreRelativeToFirstSubstring(['a', 'b', 'a', 'b', 'c', 'a', 'b', 'a', 'b'])
@@ -22,19 +19,7 @@ setupProgramTerminationListeners()
22
19
  //getRepetitionScoreRelativeToFirstSubstring(['a', 'b', 'a', 'c', 'a', 'b', 'a', 'c', 'a'])
23
20
  //getRepetitionScoreRelativeToFirstSubstring(['a', 'a', 'a', 'b', 'b', 'a', 'a', 'a', 'b'])
24
21
 
25
- /*
26
- const allPunctuationChars: string[] = []
27
-
28
- for (let i = 0; i < 65536; i++) {
29
- const char = String.fromCodePoint(i)
30
-
31
- if (isPunctuation(char)) {
32
- allPunctuationChars.push(char)
33
-
34
- writeToStderr(`${char} `)
35
- }
36
- }
37
- */
22
+ //await makeTarballsForInstalledPackages(true)
38
23
 
39
24
  process.exit(0)
40
25
 
@@ -1,4 +1,4 @@
1
- import Onnx from 'onnxruntime-node'
1
+ import type * as Onnx from 'onnxruntime-node'
2
2
 
3
3
  import { concatFloat32Arrays } from '../utilities/Utilities.js'
4
4
  import { RawAudio } from '../audio/AudioUtilities.js'
@@ -38,33 +38,24 @@ export async function detectVoiceActivity(rawAudio: RawAudio, modelPath: string,
38
38
  export class SileroVAD {
39
39
  session?: Onnx.InferenceSession
40
40
 
41
- modelStateH: Onnx.Tensor
42
- modelStateC: Onnx.Tensor
43
- modelSampleRate: Onnx.Tensor
41
+ modelStateH?: Onnx.Tensor
42
+ modelStateC?: Onnx.Tensor
43
+ modelSampleRate?: Onnx.Tensor
44
44
 
45
45
  modelPath: string
46
46
 
47
47
  constructor(modelPath: string) {
48
- this.modelSampleRate = new Onnx.Tensor('int64', new BigInt64Array([BigInt(16000)]), [])
49
-
50
- const h = new Float32Array(2 * 1 * 64)
51
- const c = new Float32Array(2 * 1 * 64)
52
-
53
- this.modelStateH = new Onnx.Tensor('float32', h, [2, 1, 64])
54
- this.modelStateC = new Onnx.Tensor('float32', c, [2, 1, 64])
55
-
56
48
  this.modelPath = modelPath
57
49
  }
58
50
 
59
51
  async predictAudioFrame(frame: Float32Array) {
60
- if (!this.session) {
61
- await this.initializeSession(this.modelPath)
62
- }
52
+ await this.initializeIfNeeded()
53
+
54
+ const Onnx = await import('onnxruntime-node')
63
55
 
64
56
  const inputTensor = new Onnx.Tensor('float32', frame, [1, frame.length])
65
57
 
66
- //const inputs = { input: inputTensor, h0: this.modelStateH, c0: this.modelStateC }
67
- const inputs = { input: inputTensor, sr: this.modelSampleRate, h: this.modelStateH, c: this.modelStateC }
58
+ const inputs = { input: inputTensor, sr: this.modelSampleRate!, h: this.modelStateH!, c: this.modelStateC! }
68
59
 
69
60
  const results = await this.session!.run(inputs)
70
61
 
@@ -75,12 +66,25 @@ export class SileroVAD {
75
66
 
76
67
  return probability
77
68
  }
69
+ private async initializeIfNeeded() {
70
+ if (this.session) {
71
+ return
72
+ }
73
+
74
+ const Onnx = await import('onnxruntime-node')
75
+
76
+ const h = new Float32Array(2 * 1 * 64)
77
+ const c = new Float32Array(2 * 1 * 64)
78
+
79
+ this.modelStateH = new Onnx.Tensor('float32', h, [2, 1, 64])
80
+ this.modelStateC = new Onnx.Tensor('float32', c, [2, 1, 64])
81
+
82
+ this.modelSampleRate = new Onnx.Tensor('int64', new BigInt64Array([BigInt(16000)]), [])
78
83
 
79
- private async initializeSession(modelPath: string) {
80
84
  const onnxOptions: Onnx.InferenceSession.SessionOptions = {
81
85
  logSeverityLevel: 3
82
86
  }
83
87
 
84
- this.session = await Onnx.InferenceSession.create(modelPath, onnxOptions)
88
+ this.session = await Onnx.InferenceSession.create(this.modelPath, onnxOptions)
85
89
  }
86
90
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"Vad.js","sourceRoot":"","sources":["../../src/api/Vad.ts"],"names":[],"mappings":"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"}
File without changes