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.
- package/dist/api/API.d.ts +1 -1
- package/dist/api/API.js +1 -1
- package/dist/api/API.js.map +1 -1
- package/dist/api/Alignment.d.ts +1 -1
- package/dist/api/Alignment.js +3 -3
- package/dist/api/Alignment.js.map +1 -1
- package/dist/api/LanguageDetection.d.ts +1 -1
- package/dist/api/LanguageDetection.js +1 -1
- package/dist/api/LanguageDetection.js.map +1 -1
- package/dist/api/Recognition.d.ts +1 -1
- package/dist/api/Synthesis.d.ts +2 -2
- package/dist/api/Synthesis.js.map +1 -1
- package/dist/api/Translation.d.ts +3 -3
- package/dist/api/Translation.js.map +1 -1
- package/dist/api/{Vad.js → VoiceActivityDetection.js} +1 -1
- package/dist/api/VoiceActivityDetection.js.map +1 -0
- package/dist/nlp/Segmentation.js +2 -2
- package/dist/nlp/Segmentation.js.map +1 -1
- package/dist/recognition/SileroSTT.js +1 -1
- package/dist/recognition/SileroSTT.js.map +1 -1
- package/dist/recognition/WhisperSTT.d.ts +11 -2
- package/dist/recognition/WhisperSTT.js +75 -16
- package/dist/recognition/WhisperSTT.js.map +1 -1
- package/dist/source-separation/MDXNetSourceSeparation.d.ts +1 -1
- package/dist/source-separation/MDXNetSourceSeparation.js +2 -1
- package/dist/source-separation/MDXNetSourceSeparation.js.map +1 -1
- package/dist/speech-language-detection/SileroLanguageDetection.d.ts +1 -1
- package/dist/speech-language-detection/SileroLanguageDetection.js +2 -1
- package/dist/speech-language-detection/SileroLanguageDetection.js.map +1 -1
- package/dist/synthesis/VitsTTS.d.ts +2 -2
- package/dist/synthesis/VitsTTS.js.map +1 -1
- package/dist/tests/Test.js +1 -14
- package/dist/tests/Test.js.map +1 -1
- package/dist/voice-activity-detection/SileroVAD.d.ts +5 -5
- package/dist/voice-activity-detection/SileroVAD.js +13 -12
- package/dist/voice-activity-detection/SileroVAD.js.map +1 -1
- package/package.json +7 -7
- package/src/api/API.ts +1 -1
- package/src/api/Alignment.ts +4 -4
- package/src/api/LanguageDetection.ts +2 -2
- package/src/api/Recognition.ts +1 -1
- package/src/api/Synthesis.ts +3 -3
- package/src/api/Translation.ts +3 -3
- package/src/nlp/Segmentation.ts +2 -2
- package/src/recognition/SileroSTT.ts +3 -1
- package/src/recognition/WhisperSTT.ts +108 -27
- package/src/source-separation/MDXNetSourceSeparation.ts +5 -1
- package/src/speech-language-detection/SileroLanguageDetection.ts +5 -1
- package/src/synthesis/VitsTTS.ts +3 -3
- package/src/tests/Test.ts +2 -17
- package/src/voice-activity-detection/SileroVAD.ts +23 -19
- package/dist/api/Vad.js.map +0 -1
- /package/dist/api/{Vad.d.ts → VoiceActivityDetection.d.ts} +0 -0
- /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.
|
|
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 =
|
|
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 =
|
|
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 }
|
package/src/synthesis/VitsTTS.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
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
|
|
42
|
-
modelStateC
|
|
43
|
-
modelSampleRate
|
|
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
|
-
|
|
61
|
-
|
|
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
|
-
|
|
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
|
}
|
package/dist/api/Vad.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Vad.js","sourceRoot":"","sources":["../../src/api/Vad.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAE5D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAA8B,cAAc,EAAE,cAAc,GAAG,MAAM,4BAA4B,CAAA;AACxG,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAG/C,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AAE5D,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,MAAM,GAAG,GAAG,WAAW,CAAA;AAEvB,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAuB,EAAE,OAAmB;IACrF,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAA;IAE3B,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,EAAE,CAAA;IAE5C,MAAM,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAA;IAEpD,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,CAAA;IAEjD,IAAI,cAAc,GAAG,MAAM,cAAc,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;IAElE,OAAO,GAAG,UAAU,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAA;IAEhD,MAAM,CAAC,KAAK,CAAC,8BAA8B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAE5D,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAkB,CAAA;IAEpD,IAAI,eAAyB,CAAA;IAE7B,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;QACxB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACf,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,0CAA0C,CAAC,CAAA;YAE1E,MAAM,aAAa,GAAG,OAAO,CAAC,MAAO,CAAA;YAErC,MAAM,kBAAkB,GAAG,MAAM,SAAS,CAAC,mBAAmB,CAAC,cAAc,EAAE,aAAa,CAAC,aAAc,CAAC,CAAA;YAC5G,MAAM,oBAAoB,GAAG,aAAa,CAAC,aAAc,GAAG,IAAI,CAAA;YAEhE,eAAe,GAAG,4BAA4B,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,CAAC,CAAA;YAE3G,MAAK;QACN,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACf,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,0CAA0C,CAAC,CAAA;YAE1E,MAAM,aAAa,GAAG,OAAO,CAAC,MAAO,CAAA;YAErC,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,CAAA;YAEhD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAA;YACxD,MAAM,aAAa,GAAG,aAAa,CAAC,aAAc,CAAA;YAElD,MAAM,kBAAkB,GAAG,MAAM,SAAS,CAAC,mBAAmB,CAAC,cAAc,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;YACxG,MAAM,oBAAoB,GAAG,aAAa,CAAC,aAAc,GAAG,IAAI,CAAA;YAEhE,eAAe,GAAG,4BAA4B,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,CAAC,CAAA;YAE3G,MAAK;QACN,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YAChB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAA;YAEvD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;YAE/D,MAAM,cAAc,GAAG,OAAO,CAAC,OAAQ,CAAA;YAEvC,MAAM,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;YAExF,MAAM,oBAAoB,GAAG,IAAI,CAAA;YACjC,MAAM,kBAAkB,GAAG,qBAAqB,CAAA;YAEhD,eAAe,GAAG,4BAA4B,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,CAAC,CAAA;YAE3G,MAAK;QACN,CAAC;QAED,KAAK,eAAe,CAAC,CAAC,CAAC;YACtB,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,gDAAgD,CAAC,CAAA;YAEtF,MAAM,mBAAmB,GAAG,OAAO,CAAC,YAAa,CAAA;YAEjD,eAAe,GAAG,MAAM,eAAe,CAAC,mBAAmB,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAA;YAEhG,MAAK;QACN,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,WAAW,OAAO,CAAC,MAAM,oBAAoB,CAAC,CAAA;QAC/D,CAAC;IACF,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAA;IAEzE,MAAM,eAAe,GAAG,cAAc,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAA;IAE/D,MAAM,CAAC,GAAG,EAAE,CAAA;IACZ,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACd,MAAM,CAAC,WAAW,CAAC,qCAAqC,EAAE,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC,CAAA;IAE9F,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,CAAA;AACrE,CAAC;AAED,SAAS,4BAA4B,CAAC,kBAA4B,EAAE,oBAA4B,EAAE,iBAAyB;IAC1H,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpD,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAA;QAE9C,MAAM,SAAS,GAAG,CAAC,GAAG,oBAAoB,CAAA;QAC1C,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,oBAAoB,CAAA;QAE9C,IAAI,gBAAgB,IAAI,iBAAiB,EAAE,CAAC;YAC3C,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9E,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAA;gBAEtE,SAAQ;YACT,CAAC;QACF,CAAC;aAAM,CAAC;YACP,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5E,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAA;gBAExE,SAAQ;YACT,CAAC;QACF,CAAC;QAED,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAA;IAChD,CAAC;IAED,OAAO,QAAQ,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,QAAkB,EAAE,cAAwB;IAC7F,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC9B,KAAK,CAAC,SAAS,GAAG,+BAA+B,CAAC,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;QAClF,KAAK,CAAC,OAAO,GAAG,+BAA+B,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;QAE9E,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,iCAAiC,CAAC,KAAK,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAA;QAClE,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,kBAA0B,EAAE,cAAwB;IACnG,IAAI,oBAAoB,GAAG,CAAC,CAAA;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;QAE/B,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,CAAA;QAErD,MAAM,SAAS,GAAG,oBAAoB,GAAG,aAAa,CAAA;QAEtD,IAAI,CAAC,CAAC,KAAK,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;YACpC,CAAC,kBAAkB,IAAI,oBAAoB,IAAI,kBAAkB,GAAG,SAAS,CAAC,EAAE,CAAC;YACjF,OAAO,KAAK,CAAC,SAAS,GAAG,CAAC,kBAAkB,GAAG,oBAAoB,CAAC,CAAA;QACrE,CAAC;QAED,oBAAoB,IAAI,aAAa,CAAA;IACtC,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;AACzC,CAAC;AAgCD,MAAM,CAAC,MAAM,iBAAiB,GAAe;IAC5C,MAAM,EAAE,QAAQ;IAEhB,iBAAiB,EAAE,GAAG;IAEtB,MAAM,EAAE;QACP,aAAa,EAAE,EAAE;QACjB,IAAI,EAAE,CAAC;KACP;IAED,MAAM,EAAE;QACP,aAAa,EAAE,EAAE;KACjB;IAED,OAAO,EAAE,EACR;IAED,YAAY,EAAE,EACb;CACD,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAqB;IAC3C;QACC,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,8DAA8D;QAC3E,IAAI,EAAE,OAAO;KACb;IACD;QACC,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,6CAA6C;QAC1D,IAAI,EAAE,OAAO;KACb;IACD;QACC,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,8DAA8D;QAC3E,IAAI,EAAE,OAAO;KACb;CACD,CAAA"}
|
|
File without changes
|
|
File without changes
|