echogarden 0.12.2 → 1.0.0

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 (334) hide show
  1. package/README.md +15 -14
  2. package/data/schemas/options.json +398 -111
  3. package/dist/alignment/DTWMfccSequenceAlignment.d.ts +1 -1
  4. package/dist/alignment/DTWMfccSequenceAlignment.js +8 -8
  5. package/dist/alignment/DTWSequenceAlignment.d.ts +1 -1
  6. package/dist/alignment/DTWSequenceAlignment.js +1 -1
  7. package/dist/alignment/DTWSequenceAlignmentWindowed.d.ts +1 -1
  8. package/dist/alignment/DTWSequenceAlignmentWindowed.js +2 -2
  9. package/dist/alignment/LevenshteinSequenceAlignment.d.ts +1 -1
  10. package/dist/alignment/LevenshteinSequenceAlignment.js +1 -1
  11. package/dist/alignment/SpeechAlignment.d.ts +9 -10
  12. package/dist/alignment/SpeechAlignment.js +136 -105
  13. package/dist/alignment/SpeechAlignment.js.map +1 -1
  14. package/dist/api/API.d.ts +13 -12
  15. package/dist/api/API.js +14 -13
  16. package/dist/api/API.js.map +1 -1
  17. package/dist/api/APIOptions.d.ts +5 -4
  18. package/dist/api/Alignment.d.ts +15 -9
  19. package/dist/api/Alignment.js +88 -74
  20. package/dist/api/Alignment.js.map +1 -1
  21. package/dist/api/Common.js +1 -1
  22. package/dist/api/Denoising.d.ts +6 -6
  23. package/dist/api/Denoising.js +23 -23
  24. package/dist/api/Denoising.js.map +1 -1
  25. package/dist/api/LanguageDetection.d.ts +19 -12
  26. package/dist/api/LanguageDetection.js +88 -38
  27. package/dist/api/LanguageDetection.js.map +1 -1
  28. package/dist/api/Recognition.d.ts +16 -6
  29. package/dist/api/Recognition.js +129 -55
  30. package/dist/api/Recognition.js.map +1 -1
  31. package/dist/api/SourceSeparation.d.ts +17 -0
  32. package/dist/api/SourceSeparation.js +61 -0
  33. package/dist/api/SourceSeparation.js.map +1 -0
  34. package/dist/api/Synthesis.d.ts +18 -18
  35. package/dist/api/Synthesis.js +191 -164
  36. package/dist/api/Synthesis.js.map +1 -1
  37. package/dist/api/Translation.d.ts +19 -8
  38. package/dist/api/Translation.js +132 -35
  39. package/dist/api/Translation.js.map +1 -1
  40. package/dist/api/Vad.d.ts +10 -5
  41. package/dist/api/Vad.js +76 -38
  42. package/dist/api/Vad.js.map +1 -1
  43. package/dist/audio/AudioBufferConversion.d.ts +1 -1
  44. package/dist/audio/AudioBufferConversion.js +4 -4
  45. package/dist/audio/AudioPlayer.d.ts +1 -1
  46. package/dist/audio/AudioPlayer.js +26 -26
  47. package/dist/audio/AudioPlayer.js.map +1 -1
  48. package/dist/audio/AudioRecorder.d.ts +1 -1
  49. package/dist/audio/AudioRecorder.js +5 -5
  50. package/dist/audio/AudioUtilities.d.ts +13 -9
  51. package/dist/audio/AudioUtilities.js +86 -24
  52. package/dist/audio/AudioUtilities.js.map +1 -1
  53. package/dist/cli/CLI.d.ts +3 -3
  54. package/dist/cli/CLI.js +271 -162
  55. package/dist/cli/CLI.js.map +1 -1
  56. package/dist/cli/CLIConfigFile.js +8 -8
  57. package/dist/cli/CLILauncher.js +6 -6
  58. package/dist/cli/CLIOptionsSchema.js +2 -2
  59. package/dist/cli/CLIParser.js +5 -5
  60. package/dist/cli/CLIStarter.js +4 -4
  61. package/dist/codecs/FFMpegTranscoder.d.ts +2 -2
  62. package/dist/codecs/FFMpegTranscoder.js +37 -37
  63. package/dist/codecs/FFMpegTranscoder.js.map +1 -1
  64. package/dist/codecs/TIMITCodec.js +5 -5
  65. package/dist/codecs/WaveCodec.d.ts +1 -1
  66. package/dist/codecs/WaveCodec.js +22 -22
  67. package/dist/denoising/RNNoise.d.ts +1 -1
  68. package/dist/denoising/RNNoise.js +9 -9
  69. package/dist/dsp/BiquadFilter.d.ts +3 -2
  70. package/dist/dsp/BiquadFilter.js +18 -11
  71. package/dist/dsp/BiquadFilter.js.map +1 -1
  72. package/dist/dsp/DecayingPeakEstimator.d.ts +16 -0
  73. package/dist/dsp/DecayingPeakEstimator.js +23 -0
  74. package/dist/dsp/DecayingPeakEstimator.js.map +1 -0
  75. package/dist/dsp/FFT.d.ts +8 -4
  76. package/dist/dsp/FFT.js +76 -30
  77. package/dist/dsp/FFT.js.map +1 -1
  78. package/dist/dsp/KWeightingFilter.d.ts +9 -0
  79. package/dist/dsp/KWeightingFilter.js +40 -0
  80. package/dist/dsp/KWeightingFilter.js.map +1 -0
  81. package/dist/dsp/LoudnessEstimator.d.ts +21 -0
  82. package/dist/dsp/LoudnessEstimator.js +47 -0
  83. package/dist/dsp/LoudnessEstimator.js.map +1 -0
  84. package/dist/dsp/MFCC.d.ts +2 -2
  85. package/dist/dsp/MFCC.js +15 -15
  86. package/dist/dsp/MelSpectogram.d.ts +1 -1
  87. package/dist/dsp/MelSpectogram.js +6 -6
  88. package/dist/dsp/Rubberband.d.ts +11 -11
  89. package/dist/dsp/Rubberband.js +27 -27
  90. package/dist/dsp/Sonic.d.ts +1 -1
  91. package/dist/dsp/Sonic.js +3 -3
  92. package/dist/dsp/SpeexResampler.d.ts +1 -1
  93. package/dist/dsp/SpeexResampler.js +2 -2
  94. package/dist/math/VectorMath.d.ts +12 -8
  95. package/dist/math/VectorMath.js +35 -32
  96. package/dist/math/VectorMath.js.map +1 -1
  97. package/dist/nlp/ChineseSegmentation.js +2 -2
  98. package/dist/nlp/CompromiseNLP.js +3 -3
  99. package/dist/nlp/EspeakPhonemizer.js +30 -30
  100. package/dist/nlp/IPA.js +20 -20
  101. package/dist/nlp/JapaneseSegmentation.js +6 -6
  102. package/dist/nlp/Lexicon.d.ts +1 -1
  103. package/dist/nlp/Lexicon.js +7 -7
  104. package/dist/nlp/Segmentation.d.ts +3 -0
  105. package/dist/nlp/Segmentation.js +21 -14
  106. package/dist/nlp/Segmentation.js.map +1 -1
  107. package/dist/nlp/TextNormalizer.js +16 -16
  108. package/dist/recognition/AmazonTranscribeSTT.d.ts +2 -2
  109. package/dist/recognition/AmazonTranscribeSTT.js +13 -14
  110. package/dist/recognition/AmazonTranscribeSTT.js.map +1 -1
  111. package/dist/recognition/AzureCognitiveServicesSTT.js +5 -6
  112. package/dist/recognition/AzureCognitiveServicesSTT.js.map +1 -1
  113. package/dist/recognition/GoogleCloudSTT.d.ts +3 -3
  114. package/dist/recognition/GoogleCloudSTT.js +18 -18
  115. package/dist/recognition/OpenAICloudSTT.d.ts +19 -0
  116. package/dist/recognition/OpenAICloudSTT.js +81 -0
  117. package/dist/recognition/OpenAICloudSTT.js.map +1 -0
  118. package/dist/recognition/SileroSTT.d.ts +2 -2
  119. package/dist/recognition/SileroSTT.js +25 -25
  120. package/dist/recognition/VoskSTT.d.ts +2 -2
  121. package/dist/recognition/VoskSTT.js +8 -8
  122. package/dist/recognition/WhisperCppSTT.d.ts +88 -0
  123. package/dist/recognition/WhisperCppSTT.js +332 -0
  124. package/dist/recognition/WhisperCppSTT.js.map +1 -0
  125. package/dist/recognition/WhisperSTT.d.ts +49 -25
  126. package/dist/recognition/WhisperSTT.js +626 -481
  127. package/dist/recognition/WhisperSTT.js.map +1 -1
  128. package/dist/server/Client.d.ts +1 -1
  129. package/dist/server/Client.js +22 -22
  130. package/dist/server/Server.js +9 -9
  131. package/dist/server/Server.js.map +1 -1
  132. package/dist/server/Worker.d.ts +22 -22
  133. package/dist/server/Worker.js +36 -36
  134. package/dist/server/Worker.js.map +1 -1
  135. package/dist/server/WorkerStarter.js +2 -2
  136. package/dist/source-separation/MDXNetSourceSeparation.d.ts +11 -0
  137. package/dist/source-separation/MDXNetSourceSeparation.js +161 -0
  138. package/dist/source-separation/MDXNetSourceSeparation.js.map +1 -0
  139. package/dist/speech-language-detection/SileroLanguageDetection.d.ts +1 -1
  140. package/dist/speech-language-detection/SileroLanguageDetection.js +7 -7
  141. package/dist/subtitles/Subtitles.d.ts +10 -0
  142. package/dist/subtitles/Subtitles.js +2 -2
  143. package/dist/subtitles/Subtitles.js.map +1 -1
  144. package/dist/synthesis/AwsPollyTTS.d.ts +1 -1
  145. package/dist/synthesis/AwsPollyTTS.js +12 -12
  146. package/dist/synthesis/AzureCognitiveServicesTTS.js +7 -7
  147. package/dist/synthesis/CoquiServerTTS.js +10 -10
  148. package/dist/synthesis/CoquiServerTTS.js.map +1 -1
  149. package/dist/synthesis/ElevenlabsTTS.d.ts +23 -0
  150. package/dist/synthesis/ElevenlabsTTS.js +103 -0
  151. package/dist/synthesis/ElevenlabsTTS.js.map +1 -0
  152. package/dist/synthesis/EspeakTTS.d.ts +6 -5
  153. package/dist/synthesis/EspeakTTS.js +81 -69
  154. package/dist/synthesis/EspeakTTS.js.map +1 -1
  155. package/dist/synthesis/FliteTTS.d.ts +3 -3
  156. package/dist/synthesis/FliteTTS.js +154 -154
  157. package/dist/synthesis/FliteTTS.js.map +1 -1
  158. package/dist/synthesis/GoogleCloudTTS.d.ts +3 -3
  159. package/dist/synthesis/GoogleCloudTTS.js +17 -17
  160. package/dist/synthesis/GoogleCloudTTS.js.map +1 -1
  161. package/dist/synthesis/GoogleTranslateTTS.d.ts +1 -1
  162. package/dist/synthesis/GoogleTranslateTTS.js +103 -103
  163. package/dist/synthesis/MicrosoftEdgeTTS.d.ts +2 -2
  164. package/dist/synthesis/MicrosoftEdgeTTS.js +74 -74
  165. package/dist/synthesis/OpenAICloudTTS.d.ts +13 -0
  166. package/dist/synthesis/OpenAICloudTTS.js +169 -0
  167. package/dist/synthesis/OpenAICloudTTS.js.map +1 -0
  168. package/dist/synthesis/SamTTS.js +3 -3
  169. package/dist/synthesis/SapiTTS.d.ts +3 -3
  170. package/dist/synthesis/SapiTTS.js +26 -26
  171. package/dist/synthesis/StreamlabsPollyTTS.d.ts +2 -2
  172. package/dist/synthesis/StreamlabsPollyTTS.js +27 -27
  173. package/dist/synthesis/SvoxPicoTTS.d.ts +2 -2
  174. package/dist/synthesis/SvoxPicoTTS.js +65 -65
  175. package/dist/synthesis/SvoxPicoTTS.js.map +1 -1
  176. package/dist/synthesis/VitsTTS.d.ts +3 -3
  177. package/dist/synthesis/VitsTTS.js +378 -378
  178. package/dist/synthesis/VitsTTS.js.map +1 -1
  179. package/dist/tests/Test.js +2 -2
  180. package/dist/utilities/Compression.d.ts +5 -0
  181. package/dist/utilities/Compression.js +29 -13
  182. package/dist/utilities/Compression.js.map +1 -1
  183. package/dist/utilities/FileDownloader.d.ts +1 -1
  184. package/dist/utilities/FileDownloader.js +16 -16
  185. package/dist/utilities/FileSystem.js +7 -7
  186. package/dist/utilities/Locale.d.ts +7 -7
  187. package/dist/utilities/Locale.js +15 -15
  188. package/dist/utilities/Logger.js +3 -3
  189. package/dist/utilities/ObjectUtilities.js +19 -19
  190. package/dist/utilities/OpenPromise.js +2 -2
  191. package/dist/utilities/OpenPromise.js.map +1 -1
  192. package/dist/utilities/PackageManager.js +31 -0
  193. package/dist/utilities/PackageManager.js.map +1 -1
  194. package/dist/utilities/PathUtilities.js +8 -8
  195. package/dist/utilities/RandomGenerator.js +2 -2
  196. package/dist/utilities/SmoothEstimator.d.ts +8 -0
  197. package/dist/utilities/SmoothEstimator.js +25 -0
  198. package/dist/utilities/SmoothEstimator.js.map +1 -0
  199. package/dist/utilities/TarballMaker.js +8 -8
  200. package/dist/utilities/Timeline.d.ts +3 -2
  201. package/dist/utilities/Timeline.js +11 -11
  202. package/dist/utilities/Timeline.js.map +1 -1
  203. package/dist/utilities/Timer.js +4 -4
  204. package/dist/utilities/Utilities.d.ts +4 -0
  205. package/dist/utilities/Utilities.js +38 -15
  206. package/dist/utilities/Utilities.js.map +1 -1
  207. package/dist/utilities/WasmMemoryManager.js +7 -7
  208. package/dist/utilities/WebReader.js +23 -23
  209. package/dist/utilities/WikipediaReader.js +2 -2
  210. package/dist/voice-activity-detection/AdaptiveGateVAD.d.ts +28 -0
  211. package/dist/voice-activity-detection/AdaptiveGateVAD.js +138 -0
  212. package/dist/voice-activity-detection/AdaptiveGateVAD.js.map +1 -0
  213. package/dist/voice-activity-detection/SileroVAD.d.ts +1 -1
  214. package/dist/voice-activity-detection/SileroVAD.js +5 -5
  215. package/dist/voice-activity-detection/SileroVAD.js.map +1 -1
  216. package/dist/voice-activity-detection/WebRtcVAD.d.ts +1 -1
  217. package/dist/voice-activity-detection/WebRtcVAD.js +4 -4
  218. package/docs/API.md +29 -11
  219. package/docs/CLI.md +31 -7
  220. package/docs/Contributing.md +38 -0
  221. package/docs/Development.md +93 -19
  222. package/docs/Engines.md +28 -16
  223. package/docs/Licenses.md +4 -1
  224. package/docs/Options.md +158 -78
  225. package/docs/Releases.md +262 -0
  226. package/docs/Server.md +7 -7
  227. package/docs/Tasklist.md +95 -76
  228. package/docs/Technical.md +4 -4
  229. package/package.json +13 -14
  230. package/src/alignment/DTWMfccSequenceAlignment.ts +9 -9
  231. package/src/alignment/DTWSequenceAlignment.ts +2 -2
  232. package/src/alignment/DTWSequenceAlignmentWindowed.ts +3 -3
  233. package/src/alignment/LevenshteinSequenceAlignment.ts +2 -2
  234. package/src/alignment/SpeechAlignment.ts +204 -119
  235. package/src/api/API.ts +14 -13
  236. package/src/api/APIOptions.ts +12 -11
  237. package/src/api/Alignment.ts +147 -90
  238. package/src/api/Common.ts +1 -1
  239. package/src/api/Denoising.ts +28 -28
  240. package/src/api/LanguageDetection.ts +135 -48
  241. package/src/api/Recognition.ts +198 -59
  242. package/src/api/SourceSeparation.ts +99 -0
  243. package/src/api/Synthesis.ts +217 -181
  244. package/src/api/Translation.ts +193 -40
  245. package/src/api/Vad.ts +110 -41
  246. package/src/audio/AudioBufferConversion.ts +4 -4
  247. package/src/audio/AudioPlayer.ts +27 -27
  248. package/src/audio/AudioRecorder.ts +5 -5
  249. package/src/audio/AudioUtilities.ts +107 -24
  250. package/src/cli/CLI.ts +313 -164
  251. package/src/cli/CLIConfigFile.ts +8 -8
  252. package/src/cli/CLILauncher.ts +6 -6
  253. package/src/cli/CLIOptionsSchema.ts +2 -2
  254. package/src/cli/CLIParser.ts +5 -5
  255. package/src/cli/CLIStarter.ts +4 -4
  256. package/src/codecs/FFMpegTranscoder.ts +38 -38
  257. package/src/codecs/TIMITCodec.ts +5 -5
  258. package/src/codecs/WaveCodec.ts +22 -22
  259. package/src/denoising/RNNoise.ts +9 -9
  260. package/src/dsp/BiquadFilter.ts +19 -11
  261. package/src/dsp/DecayingPeakEstimator.ts +35 -0
  262. package/src/dsp/FFT.ts +103 -35
  263. package/src/dsp/KWeightingFilter.ts +43 -0
  264. package/src/dsp/LoudnessEstimator.ts +74 -0
  265. package/src/dsp/MFCC.ts +15 -15
  266. package/src/dsp/MelSpectogram.ts +7 -7
  267. package/src/dsp/Rubberband.ts +38 -38
  268. package/src/dsp/Sonic.ts +4 -4
  269. package/src/dsp/SpeexResampler.ts +2 -2
  270. package/src/math/VectorMath.ts +42 -33
  271. package/src/nlp/ChineseSegmentation.ts +3 -3
  272. package/src/nlp/CompromiseNLP.ts +3 -3
  273. package/src/nlp/EspeakPhonemizer.ts +30 -30
  274. package/src/nlp/IPA.ts +20 -20
  275. package/src/nlp/JapaneseSegmentation.ts +6 -6
  276. package/src/nlp/Lexicon.ts +8 -8
  277. package/src/nlp/Segmentation.ts +23 -14
  278. package/src/nlp/TextNormalizer.ts +16 -16
  279. package/src/recognition/AmazonTranscribeSTT.ts +16 -17
  280. package/src/recognition/AzureCognitiveServicesSTT.ts +8 -6
  281. package/src/recognition/GoogleCloudSTT.ts +21 -21
  282. package/src/recognition/OpenAICloudSTT.ts +142 -0
  283. package/src/recognition/SileroSTT.ts +26 -26
  284. package/src/recognition/VoskSTT.ts +10 -10
  285. package/src/recognition/WhisperCppSTT.ts +555 -0
  286. package/src/recognition/WhisperSTT.ts +760 -507
  287. package/src/server/Client.ts +23 -23
  288. package/src/server/Server.ts +9 -9
  289. package/src/server/Worker.ts +53 -53
  290. package/src/server/WorkerStarter.ts +2 -2
  291. package/src/source-separation/MDXNetSourceSeparation.ts +228 -0
  292. package/src/speech-language-detection/SileroLanguageDetection.ts +8 -8
  293. package/src/subtitles/Subtitles.ts +3 -3
  294. package/src/synthesis/AwsPollyTTS.ts +14 -14
  295. package/src/synthesis/AzureCognitiveServicesTTS.ts +10 -10
  296. package/src/synthesis/CoquiServerTTS.ts +10 -10
  297. package/src/synthesis/ElevenlabsTTS.ts +137 -0
  298. package/src/synthesis/EspeakTTS.ts +90 -71
  299. package/src/synthesis/FliteTTS.ts +157 -157
  300. package/src/synthesis/GoogleCloudTTS.ts +19 -19
  301. package/src/synthesis/GoogleTranslateTTS.ts +104 -104
  302. package/src/synthesis/MicrosoftEdgeTTS.ts +80 -80
  303. package/src/synthesis/OpenAICloudTTS.ts +196 -0
  304. package/src/synthesis/SamTTS.ts +3 -3
  305. package/src/synthesis/SapiTTS.ts +29 -29
  306. package/src/synthesis/StreamlabsPollyTTS.ts +29 -29
  307. package/src/synthesis/SvoxPicoTTS.ts +67 -67
  308. package/src/synthesis/VitsTTS.ts +380 -380
  309. package/src/tests/Test.ts +4 -4
  310. package/src/utilities/Compression.ts +34 -13
  311. package/src/utilities/FileDownloader.ts +19 -19
  312. package/src/utilities/FileSystem.ts +7 -7
  313. package/src/utilities/Locale.ts +22 -22
  314. package/src/utilities/Logger.ts +4 -4
  315. package/src/utilities/ObjectUtilities.ts +19 -19
  316. package/src/utilities/OpenPromise.ts +2 -2
  317. package/src/utilities/PackageManager.ts +40 -0
  318. package/src/utilities/PathUtilities.ts +8 -8
  319. package/src/utilities/RandomGenerator.ts +3 -3
  320. package/src/utilities/SmoothEstimator.ts +35 -0
  321. package/src/utilities/TarballMaker.ts +9 -9
  322. package/src/utilities/Timeline.ts +15 -13
  323. package/src/utilities/Timer.ts +4 -4
  324. package/src/utilities/Utilities.ts +49 -15
  325. package/src/utilities/WasmMemoryManager.ts +7 -7
  326. package/src/utilities/WebReader.ts +23 -23
  327. package/src/utilities/WikipediaReader.ts +2 -2
  328. package/src/voice-activity-detection/AdaptiveGateVAD.ts +202 -0
  329. package/src/voice-activity-detection/SileroVAD.ts +5 -5
  330. package/src/voice-activity-detection/WebRtcVAD.ts +5 -5
  331. package/dist/synthesis/ElevenLabsTTS.d.ts +0 -8
  332. package/dist/synthesis/ElevenLabsTTS.js +0 -82
  333. package/dist/synthesis/ElevenLabsTTS.js.map +0 -1
  334. package/src/synthesis/ElevenLabsTTS.ts +0 -104
@@ -1,15 +1,16 @@
1
- import { deepClone, extendDeep } from "../utilities/ObjectUtilities.js"
1
+ import { deepClone, extendDeep } from '../utilities/ObjectUtilities.js'
2
2
 
3
- import { AudioSourceParam, RawAudio, ensureRawAudio, getRawAudioDuration, normalizeAudioLevel, sliceRawAudioByTime, trimAudioEnd } from "../audio/AudioUtilities.js"
4
- import { Logger } from "../utilities/Logger.js"
3
+ import { AudioSourceParam, RawAudio, ensureRawAudio, getRawAudioDuration, normalizeAudioLevel, sliceRawAudioByTime, trimAudioEnd } from '../audio/AudioUtilities.js'
4
+ import { Logger } from '../utilities/Logger.js'
5
5
 
6
- import * as API from "./API.js"
7
- import { logToStderr } from "../utilities/Utilities.js"
8
- import path from "path"
9
- import { type WhisperOptions } from "../recognition/WhisperSTT.js"
10
- import { formatLanguageCodeWithName, languageCodeToName } from "../utilities/Locale.js"
11
- import { loadPackage } from "../utilities/PackageManager.js"
12
- import chalk from "chalk"
6
+ import * as API from './API.js'
7
+ import { logToStderr } from '../utilities/Utilities.js'
8
+ import path from 'path'
9
+ import { WhisperModelName } from '../recognition/WhisperSTT.js'
10
+ import { formatLanguageCodeWithName, languageCodeToName } from '../utilities/Locale.js'
11
+ import { loadPackage } from '../utilities/PackageManager.js'
12
+ import chalk from 'chalk'
13
+ import { WhisperCppOptions } from '../recognition/WhisperCppSTT.js'
13
14
 
14
15
  const log = logToStderr
15
16
 
@@ -21,7 +22,7 @@ export async function detectSpeechLanguage(input: AudioSourceParam, options: Spe
21
22
 
22
23
  const startTime = logger.getTimestamp()
23
24
 
24
- logger.start("Prepare for speech language detection")
25
+ options = extendDeep(defaultSpeechLanguageDetectionOptions, options)
25
26
 
26
27
  const inputRawAudio = await ensureRawAudio(input)
27
28
 
@@ -29,7 +30,14 @@ export async function detectSpeechLanguage(input: AudioSourceParam, options: Spe
29
30
  sourceRawAudio = normalizeAudioLevel(sourceRawAudio)
30
31
  sourceRawAudio.audioChannels[0] = trimAudioEnd(sourceRawAudio.audioChannels[0])
31
32
 
32
- options = extendDeep(defaultSpeechLanguageDetectionOptions, options)
33
+ if (options.crop) {
34
+ logger.start('Crop using voice activity detection');
35
+ ({ croppedRawAudio: sourceRawAudio } = await API.detectVoiceActivity(sourceRawAudio, options.vad!))
36
+
37
+ logger.end()
38
+ }
39
+
40
+ logger.start('Prepare for speech language detection')
33
41
 
34
42
  const defaultLanguage = options.defaultLanguage!
35
43
  const fallbackThresholdProbability = options.fallbackThresholdProbability!
@@ -39,18 +47,18 @@ export async function detectSpeechLanguage(input: AudioSourceParam, options: Spe
39
47
  let detectedLanguageProbabilities: LanguageDetectionResults
40
48
 
41
49
  switch (options.engine) {
42
- case "silero": {
43
- const SileroLanguageDetection = await import("../speech-language-detection/SileroLanguageDetection.js")
50
+ case 'silero': {
51
+ const SileroLanguageDetection = await import('../speech-language-detection/SileroLanguageDetection.js')
44
52
 
45
53
  logger.end()
46
54
 
47
55
  const sileroOptions = options.silero!
48
56
 
49
- const modelDir = await loadPackage("silero-lang-classifier-95")
57
+ const modelDir = await loadPackage('silero-lang-classifier-95')
50
58
 
51
- const modelPath = path.join(modelDir, "lang_classifier_95.onnx")
52
- const languageDictionaryPath = path.join(modelDir, "lang_dict_95.json")
53
- const languageGroupDictionaryPath = path.join(modelDir, "lang_group_dict_95.json")
59
+ const modelPath = path.join(modelDir, 'lang_classifier_95.onnx')
60
+ const languageDictionaryPath = path.join(modelDir, 'lang_dict_95.json')
61
+ const languageGroupDictionaryPath = path.join(modelDir, 'lang_group_dict_95.json')
54
62
 
55
63
  const languageResults = await SileroLanguageDetection.detectLanguage(
56
64
  sourceRawAudio,
@@ -63,16 +71,32 @@ export async function detectSpeechLanguage(input: AudioSourceParam, options: Spe
63
71
  break
64
72
  }
65
73
 
66
- case "whisper": {
67
- const WhisperSTT = await import("../recognition/WhisperSTT.js")
74
+ case 'whisper': {
75
+ const WhisperSTT = await import('../recognition/WhisperSTT.js')
68
76
 
69
77
  const whisperOptions = options.whisper!
70
78
 
71
- const { modelName, modelDir, tokenizerDir } = await WhisperSTT.loadPackagesAndGetPaths(whisperOptions.model, undefined)
79
+ const { modelName, modelDir } = await WhisperSTT.loadPackagesAndGetPaths(whisperOptions.model, undefined)
80
+
81
+ logger.end()
82
+
83
+ detectedLanguageProbabilities = await WhisperSTT.detectLanguage(sourceRawAudio, modelName, modelDir, whisperOptions.temperature!)
84
+
85
+ break
86
+ }
87
+
88
+ case 'whisper.cpp': {
89
+ const WhisperCppSTT = await import('../recognition/WhisperCppSTT.js')
90
+
91
+ const whisperCppOptions = options.whisperCpp!
72
92
 
73
93
  logger.end()
74
94
 
75
- detectedLanguageProbabilities = await WhisperSTT.detectLanguage(sourceRawAudio, modelName, modelDir, tokenizerDir)
95
+ const { modelName, modelPath } = await WhisperCppSTT.loadModelPackage(whisperCppOptions.model, undefined)
96
+
97
+ logger.end();
98
+
99
+ detectedLanguageProbabilities = await WhisperCppSTT.detectLanguage(sourceRawAudio, modelName, modelPath)
76
100
 
77
101
  break
78
102
  }
@@ -93,9 +117,15 @@ export async function detectSpeechLanguage(input: AudioSourceParam, options: Spe
93
117
  }
94
118
 
95
119
  logger.end()
96
- logger.logDuration("\nTotal detection time", startTime, chalk.magentaBright)
120
+ logger.logDuration('\nTotal detection time', startTime, chalk.magentaBright)
121
+
122
+ return {
123
+ detectedLanguage,
124
+ detectedLanguageName: languageCodeToName(detectedLanguage),
125
+ detectedLanguageProbabilities,
97
126
 
98
- return { detectedLanguage, detectedLanguageName: languageCodeToName(detectedLanguage), detectedLanguageProbabilities, inputRawAudio }
127
+ inputRawAudio,
128
+ }
99
129
  }
100
130
 
101
131
  export interface SpeechLanguageDetectionResult {
@@ -105,11 +135,15 @@ export interface SpeechLanguageDetectionResult {
105
135
  inputRawAudio: RawAudio
106
136
  }
107
137
 
108
- export async function detectSpeechLanguageByParts(sourceRawAudio: RawAudio, getResultsForAudioPart: (audioPart: RawAudio) => Promise<LanguageDetectionResults>, audioPartDuration = 30, hopDuration = 15) {
138
+ export async function detectSpeechLanguageByParts(sourceRawAudio: RawAudio, getResultsForAudioPart: (audioPart: RawAudio) => Promise<LanguageDetectionResults>, audioPartDuration = 30, hopDuration = 25) {
109
139
  const logger = new Logger()
110
140
 
111
141
  const audioDuration = getRawAudioDuration(sourceRawAudio)
112
142
 
143
+ if (audioDuration === 0) {
144
+ return []
145
+ }
146
+
113
147
  const resultsForParts: LanguageDetectionResults[] = []
114
148
 
115
149
  for (let audioTimeOffset = 0; audioTimeOffset < audioDuration; audioTimeOffset += hopDuration) {
@@ -126,7 +160,13 @@ export async function detectSpeechLanguageByParts(sourceRawAudio: RawAudio, getR
126
160
 
127
161
  const sortedResultsForPart = deepClone(resultsForPart).sort((a, b) => b.probability - a.probability)
128
162
 
129
- logger.logTitledMessage(`Top candidates`, `${formatLanguageCodeWithName(sortedResultsForPart[0].language)}: ${sortedResultsForPart[0].probability.toFixed(3)}, ${formatLanguageCodeWithName(sortedResultsForPart[1].language)}: ${sortedResultsForPart[1].probability.toFixed(3)}, ${formatLanguageCodeWithName(sortedResultsForPart[3].language)}: ${sortedResultsForPart[3].probability.toFixed(3)}`)
163
+ let topCandidatesStrings: string[] = []
164
+
165
+ for (let i = 0; i < Math.min(3, sortedResultsForPart.length); i++) {
166
+ topCandidatesStrings.push(`${formatLanguageCodeWithName(sortedResultsForPart[i].language)}: ${sortedResultsForPart[i].probability.toFixed(3)}`)
167
+ }
168
+
169
+ logger.logTitledMessage(`Top candidates`, topCandidatesStrings.join(', '))
130
170
 
131
171
  if (audioPartLength < audioPartDuration) {
132
172
  break
@@ -149,27 +189,49 @@ export async function detectSpeechLanguageByParts(sourceRawAudio: RawAudio, getR
149
189
  return averagedResults
150
190
  }
151
191
 
152
- export type SpeechLanguageDetectionEngine = "silero" | "whisper"
192
+ export type SpeechLanguageDetectionEngine = 'silero' | 'whisper' | 'whisper.cpp'
153
193
 
154
194
  export interface SpeechLanguageDetectionOptions {
155
195
  engine?: SpeechLanguageDetectionEngine
156
196
  defaultLanguage?: string,
157
197
  fallbackThresholdProbability?: number
158
198
 
199
+ crop?: boolean
200
+
159
201
  silero?: {
160
202
  }
161
203
 
162
- whisper?: WhisperOptions
204
+ whisper?: {
205
+ model?: WhisperModelName
206
+ temperature?: number
207
+ }
208
+
209
+ whisperCpp?: WhisperCppOptions
210
+
211
+ vad?: API.VADOptions
163
212
  }
164
213
 
165
214
  export const defaultSpeechLanguageDetectionOptions: SpeechLanguageDetectionOptions = {
166
- engine: "silero",
215
+ engine: 'whisper',
216
+ defaultLanguage: 'en',
217
+ fallbackThresholdProbability: 0.05,
218
+
219
+ crop: true,
167
220
 
168
221
  silero: {
169
222
  },
170
223
 
171
224
  whisper: {
172
- model: "tiny",
225
+ model: 'tiny',
226
+ temperature: 1.0
227
+ },
228
+
229
+ whisperCpp: {
230
+ model: 'tiny'
231
+ },
232
+
233
+ vad: {
234
+ engine: 'adaptive-gate'
173
235
  }
174
236
  }
175
237
 
@@ -189,20 +251,20 @@ export async function detectTextLanguage(input: string, options: TextLanguageDet
189
251
  logger.start(`Initialize ${options.engine} module`)
190
252
 
191
253
  switch (options.engine) {
192
- case "tinyld": {
193
- const { detectLanguage } = await import("../text-language-detection/TinyLDLanguageDetection.js")
254
+ case 'tinyld': {
255
+ const { detectLanguage } = await import('../text-language-detection/TinyLDLanguageDetection.js')
194
256
 
195
- logger.start("Detecting text language using tinyld")
257
+ logger.start('Detecting text language using tinyld')
196
258
 
197
259
  detectedLanguageProbabilities = await detectLanguage(input)
198
260
 
199
261
  break
200
262
  }
201
263
 
202
- case "fasttext": {
203
- const { detectLanguage } = await import("../text-language-detection/FastTextLanguageDetection.js")
264
+ case 'fasttext': {
265
+ const { detectLanguage } = await import('../text-language-detection/FastTextLanguageDetection.js')
204
266
 
205
- logger.start("Detecting text language using FastText")
267
+ logger.start('Detecting text language using FastText')
206
268
 
207
269
  detectedLanguageProbabilities = await detectLanguage(input)
208
270
 
@@ -226,9 +288,17 @@ export async function detectTextLanguage(input: string, options: TextLanguageDet
226
288
 
227
289
  logger.end()
228
290
 
229
- return { detectedLanguage, detectedLanguageName: languageCodeToName(detectedLanguage), detectedLanguageProbabilities }
291
+ return {
292
+ detectedLanguage,
293
+ detectedLanguageName: languageCodeToName(detectedLanguage),
294
+ detectedLanguageProbabilities
295
+ }
230
296
  }
231
297
 
298
+ /////////////////////////////////////////////////////////////////////////////////////////////
299
+ // Types
300
+ /////////////////////////////////////////////////////////////////////////////////////////////
301
+
232
302
  export interface TextLanguageDetectionResult {
233
303
  detectedLanguage: string
234
304
  detectedLanguageName: string
@@ -236,23 +306,34 @@ export interface TextLanguageDetectionResult {
236
306
  }
237
307
 
238
308
  export type LanguageDetectionResults = LanguageDetectionResultsEntry[]
239
- export type LanguageDetectionResultsEntry = { language: string, languageName: string, probability: number }
309
+ export interface LanguageDetectionResultsEntry {
310
+ language: string
311
+ languageName: string
312
+ probability: number
313
+ }
240
314
 
241
315
  export type LanguageDetectionGroupResults = LanguageDetectionGroupResultsEntry[]
242
- export type LanguageDetectionGroupResultsEntry = { languageGroup: string, probability: number }
316
+ export interface LanguageDetectionGroupResultsEntry {
317
+ languageGroup: string
318
+ probability: number
319
+ }
243
320
 
244
- export type TextLanguageDetectionEngine = "tinyld" | "fasttext"
321
+ export type TextLanguageDetectionEngine = 'tinyld' | 'fasttext'
245
322
 
246
- export type TextLanguageDetectionOptions = {
247
- engine?: TextLanguageDetectionEngine,
248
- defaultLanguage?: string,
323
+ export interface TextLanguageDetectionOptions {
324
+ engine?: TextLanguageDetectionEngine
325
+ defaultLanguage?: string
249
326
  fallbackThresholdProbability?: number
250
327
  }
251
328
 
329
+ /////////////////////////////////////////////////////////////////////////////////////////////
330
+ // Constants
331
+ /////////////////////////////////////////////////////////////////////////////////////////////
332
+
252
333
  export const defaultTextLanguageDetectionOptions: TextLanguageDetectionOptions = {
253
- engine: "tinyld",
254
- defaultLanguage: "en",
255
- fallbackThresholdProbability: 0.05
334
+ engine: 'tinyld',
335
+ defaultLanguage: 'en',
336
+ fallbackThresholdProbability: 0.05,
256
337
  }
257
338
 
258
339
  export const speechLanguageDetectionEngines: API.EngineMetadata[] = [
@@ -265,7 +346,13 @@ export const speechLanguageDetectionEngines: API.EngineMetadata[] = [
265
346
  {
266
347
  id: 'whisper',
267
348
  name: 'OpenAI Whisper',
268
- description: 'Uses the language token produced by the Whisper model to guess the language of the speech (first 30 seconds only).',
349
+ description: 'Uses the language tokens produced by the Whisper model to classify the spoken langauge.',
350
+ type: 'local'
351
+ },
352
+ {
353
+ id: 'whisper.cpp',
354
+ name: 'OpenAI Whisper (C++ port)',
355
+ description: 'Uses the language tokens produced by Whisper.cpp to classify the spoken langauge.',
269
356
  type: 'local'
270
357
  },
271
358
  ]
@@ -280,7 +367,7 @@ export const textLanguageDetectionEngines: API.EngineMetadata[] = [
280
367
  {
281
368
  id: 'fasttext',
282
369
  name: 'FastText',
283
- description: 'a library for word representations and sentence classification by Facebook research.',
370
+ description: 'A library for word representations and sentence classification by Facebook research.',
284
371
  type: 'local'
285
372
  },
286
373
  ]