echogarden 0.0.1 → 0.1.1

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 (295) hide show
  1. package/README.md +65 -1
  2. package/data/lexicons/heteronyms.json +674 -0
  3. package/data/schemas/options.json +1057 -0
  4. package/data/tables/lcid-table.json +7427 -0
  5. package/dist/alignment/DTWMfccSequenceAlignment.d.ts +2 -0
  6. package/dist/alignment/DTWMfccSequenceAlignment.js +26 -0
  7. package/dist/alignment/DTWMfccSequenceAlignment.js.map +1 -0
  8. package/dist/alignment/DTWSequenceAlignment.d.ts +5 -0
  9. package/dist/alignment/DTWSequenceAlignment.js +99 -0
  10. package/dist/alignment/DTWSequenceAlignment.js.map +1 -0
  11. package/dist/alignment/DTWSequenceAlignmentWindowed.d.ts +5 -0
  12. package/dist/alignment/DTWSequenceAlignmentWindowed.js +161 -0
  13. package/dist/alignment/DTWSequenceAlignmentWindowed.js.map +1 -0
  14. package/dist/alignment/LevenshteinSequenceAlignment.d.ts +5 -0
  15. package/dist/alignment/LevenshteinSequenceAlignment.js +102 -0
  16. package/dist/alignment/LevenshteinSequenceAlignment.js.map +1 -0
  17. package/dist/alignment/SpeechAlignment.d.ts +27 -0
  18. package/dist/alignment/SpeechAlignment.js +266 -0
  19. package/dist/alignment/SpeechAlignment.js.map +1 -0
  20. package/dist/api/API.d.ts +8 -0
  21. package/dist/api/API.js +10 -0
  22. package/dist/api/API.js.map +1 -0
  23. package/dist/api/APIOptions.d.ts +12 -0
  24. package/dist/api/APIOptions.js +2 -0
  25. package/dist/api/APIOptions.js.map +1 -0
  26. package/dist/api/Alignment.d.ts +32 -0
  27. package/dist/api/Alignment.js +134 -0
  28. package/dist/api/Alignment.js.map +1 -0
  29. package/dist/api/Denoising.d.ts +14 -0
  30. package/dist/api/Denoising.js +66 -0
  31. package/dist/api/Denoising.js.map +1 -0
  32. package/dist/api/Globals.d.ts +1 -0
  33. package/dist/api/Globals.js +2 -0
  34. package/dist/api/Globals.js.map +1 -0
  35. package/dist/api/LanguageDetection.d.ts +49 -0
  36. package/dist/api/LanguageDetection.js +118 -0
  37. package/dist/api/LanguageDetection.js.map +1 -0
  38. package/dist/api/Recognition.d.ts +49 -0
  39. package/dist/api/Recognition.js +162 -0
  40. package/dist/api/Recognition.js.map +1 -0
  41. package/dist/api/Synthesis.d.ts +125 -0
  42. package/dist/api/Synthesis.js +892 -0
  43. package/dist/api/Synthesis.js.map +1 -0
  44. package/dist/api/Translation.d.ts +25 -0
  45. package/dist/api/Translation.js +69 -0
  46. package/dist/api/Translation.js.map +1 -0
  47. package/dist/api/Vad.d.ts +25 -0
  48. package/dist/api/Vad.js +88 -0
  49. package/dist/api/Vad.js.map +1 -0
  50. package/dist/audio/AudioBufferConversion.d.ts +15 -0
  51. package/dist/audio/AudioBufferConversion.js +228 -0
  52. package/dist/audio/AudioBufferConversion.js.map +1 -0
  53. package/dist/audio/AudioPlayer.d.ts +9 -0
  54. package/dist/audio/AudioPlayer.js +232 -0
  55. package/dist/audio/AudioPlayer.js.map +1 -0
  56. package/dist/audio/AudioRecorder.d.ts +3 -0
  57. package/dist/audio/AudioRecorder.js +68 -0
  58. package/dist/audio/AudioRecorder.js.map +1 -0
  59. package/dist/audio/AudioUtilities.d.ts +48 -0
  60. package/dist/audio/AudioUtilities.js +209 -0
  61. package/dist/audio/AudioUtilities.js.map +1 -0
  62. package/dist/audio/SoxPath.d.ts +1 -0
  63. package/dist/audio/SoxPath.js +19 -0
  64. package/dist/audio/SoxPath.js.map +1 -0
  65. package/dist/cli/CLI.d.ts +8 -0
  66. package/dist/cli/CLI.js +860 -0
  67. package/dist/cli/CLI.js.map +1 -0
  68. package/dist/cli/CLIConfigFile.d.ts +3 -0
  69. package/dist/cli/CLIConfigFile.js +62 -0
  70. package/dist/cli/CLIConfigFile.js.map +1 -0
  71. package/dist/cli/CLILauncher.d.ts +2 -0
  72. package/dist/cli/CLILauncher.js +22 -0
  73. package/dist/cli/CLILauncher.js.map +1 -0
  74. package/dist/cli/CLIOptionsSchema.d.ts +5 -0
  75. package/dist/cli/CLIOptionsSchema.js +36 -0
  76. package/dist/cli/CLIOptionsSchema.js.map +1 -0
  77. package/dist/cli/CLIParser.d.ts +6 -0
  78. package/dist/cli/CLIParser.js +34 -0
  79. package/dist/cli/CLIParser.js.map +1 -0
  80. package/dist/cli/CLIStarter.d.ts +1 -0
  81. package/dist/cli/CLIStarter.js +3 -0
  82. package/dist/cli/CLIStarter.js.map +1 -0
  83. package/dist/codecs/FFMpegTranscoder.d.ts +20 -0
  84. package/dist/codecs/FFMpegTranscoder.js +169 -0
  85. package/dist/codecs/FFMpegTranscoder.js.map +1 -0
  86. package/dist/codecs/TIMITCodec.d.ts +9 -0
  87. package/dist/codecs/TIMITCodec.js +14 -0
  88. package/dist/codecs/TIMITCodec.js.map +1 -0
  89. package/dist/codecs/WaveCodec.d.ts +19 -0
  90. package/dist/codecs/WaveCodec.js +208 -0
  91. package/dist/codecs/WaveCodec.js.map +1 -0
  92. package/dist/denoising/RNNoise.d.ts +6 -0
  93. package/dist/denoising/RNNoise.js +68 -0
  94. package/dist/denoising/RNNoise.js.map +1 -0
  95. package/dist/dsp/BiquadFilter.d.ts +26 -0
  96. package/dist/dsp/BiquadFilter.js +399 -0
  97. package/dist/dsp/BiquadFilter.js.map +1 -0
  98. package/dist/dsp/FFT.d.ts +9 -0
  99. package/dist/dsp/FFT.js +135 -0
  100. package/dist/dsp/FFT.js.map +1 -0
  101. package/dist/dsp/MFCC.d.ts +25 -0
  102. package/dist/dsp/MFCC.js +162 -0
  103. package/dist/dsp/MFCC.js.map +1 -0
  104. package/dist/dsp/MelSpectogram.d.ts +19 -0
  105. package/dist/dsp/MelSpectogram.js +102 -0
  106. package/dist/dsp/MelSpectogram.js.map +1 -0
  107. package/dist/dsp/Rubberband.d.ts +52 -0
  108. package/dist/dsp/Rubberband.js +186 -0
  109. package/dist/dsp/Rubberband.js.map +1 -0
  110. package/dist/dsp/Sonic.d.ts +2 -0
  111. package/dist/dsp/Sonic.js +39 -0
  112. package/dist/dsp/Sonic.js.map +1 -0
  113. package/dist/dsp/SpeexResampler.d.ts +3 -0
  114. package/dist/dsp/SpeexResampler.js +53 -0
  115. package/dist/dsp/SpeexResampler.js.map +1 -0
  116. package/dist/math/VectorMath.d.ts +70 -0
  117. package/dist/math/VectorMath.js +564 -0
  118. package/dist/math/VectorMath.js.map +1 -0
  119. package/dist/nlp/ChineseSegmentation.d.ts +1 -0
  120. package/dist/nlp/ChineseSegmentation.js +53 -0
  121. package/dist/nlp/ChineseSegmentation.js.map +1 -0
  122. package/dist/nlp/CompromiseNLP.d.ts +15 -0
  123. package/dist/nlp/CompromiseNLP.js +66 -0
  124. package/dist/nlp/CompromiseNLP.js.map +1 -0
  125. package/dist/nlp/EspeakPhonemizer.d.ts +4 -0
  126. package/dist/nlp/EspeakPhonemizer.js +133 -0
  127. package/dist/nlp/EspeakPhonemizer.js.map +1 -0
  128. package/dist/nlp/IPA.d.ts +19 -0
  129. package/dist/nlp/IPA.js +113 -0
  130. package/dist/nlp/IPA.js.map +1 -0
  131. package/dist/nlp/JapaneseSegmentation.d.ts +1 -0
  132. package/dist/nlp/JapaneseSegmentation.js +40 -0
  133. package/dist/nlp/JapaneseSegmentation.js.map +1 -0
  134. package/dist/nlp/Lexicon.d.ts +17 -0
  135. package/dist/nlp/Lexicon.js +6 -0
  136. package/dist/nlp/Lexicon.js.map +1 -0
  137. package/dist/nlp/PhoneConversion.d.ts +6 -0
  138. package/dist/nlp/PhoneConversion.js +467 -0
  139. package/dist/nlp/PhoneConversion.js.map +1 -0
  140. package/dist/nlp/Segmentation.d.ts +41 -0
  141. package/dist/nlp/Segmentation.js +158 -0
  142. package/dist/nlp/Segmentation.js.map +1 -0
  143. package/dist/nlp/TextNormalizer.d.ts +4 -0
  144. package/dist/nlp/TextNormalizer.js +69 -0
  145. package/dist/nlp/TextNormalizer.js.map +1 -0
  146. package/dist/recognition/AmazonTranscribeSTT.d.ts +6 -0
  147. package/dist/recognition/AmazonTranscribeSTT.js +79 -0
  148. package/dist/recognition/AmazonTranscribeSTT.js.map +1 -0
  149. package/dist/recognition/AzureCognitiveServicesSTT.d.ts +7 -0
  150. package/dist/recognition/AzureCognitiveServicesSTT.js +51 -0
  151. package/dist/recognition/AzureCognitiveServicesSTT.js.map +1 -0
  152. package/dist/recognition/GoogleCloudSTT.d.ts +7 -0
  153. package/dist/recognition/GoogleCloudSTT.js +66 -0
  154. package/dist/recognition/GoogleCloudSTT.js.map +1 -0
  155. package/dist/recognition/SileroSTT.d.ts +9 -0
  156. package/dist/recognition/SileroSTT.js +125 -0
  157. package/dist/recognition/SileroSTT.js.map +1 -0
  158. package/dist/recognition/VoskSTT.d.ts +10 -0
  159. package/dist/recognition/VoskSTT.js +78 -0
  160. package/dist/recognition/VoskSTT.js.map +1 -0
  161. package/dist/recognition/WhisperSTT.d.ts +69 -0
  162. package/dist/recognition/WhisperSTT.js +977 -0
  163. package/dist/recognition/WhisperSTT.js.map +1 -0
  164. package/dist/server/Server.d.ts +1 -0
  165. package/dist/server/Server.js +18 -0
  166. package/dist/server/Server.js.map +1 -0
  167. package/dist/speech-language-detection/SileroLanguageDetection.d.ts +9 -0
  168. package/dist/speech-language-detection/SileroLanguageDetection.js +47 -0
  169. package/dist/speech-language-detection/SileroLanguageDetection.js.map +1 -0
  170. package/dist/subtitles/Subtitles.d.ts +25 -0
  171. package/dist/subtitles/Subtitles.js +286 -0
  172. package/dist/subtitles/Subtitles.js.map +1 -0
  173. package/dist/synthesis/AwsPollyTTS.d.ts +7 -0
  174. package/dist/synthesis/AwsPollyTTS.js +51 -0
  175. package/dist/synthesis/AwsPollyTTS.js.map +1 -0
  176. package/dist/synthesis/AzureCognitiveServicesTTS.d.ts +9 -0
  177. package/dist/synthesis/AzureCognitiveServicesTTS.js +103 -0
  178. package/dist/synthesis/AzureCognitiveServicesTTS.js.map +1 -0
  179. package/dist/synthesis/CoquiServerTTS.d.ts +6 -0
  180. package/dist/synthesis/CoquiServerTTS.js +22 -0
  181. package/dist/synthesis/CoquiServerTTS.js.map +1 -0
  182. package/dist/synthesis/ElevenLabsTTS.d.ts +8 -0
  183. package/dist/synthesis/ElevenLabsTTS.js +48 -0
  184. package/dist/synthesis/ElevenLabsTTS.js.map +1 -0
  185. package/dist/synthesis/EspeakTTS.d.ts +46 -0
  186. package/dist/synthesis/EspeakTTS.js +353 -0
  187. package/dist/synthesis/EspeakTTS.js.map +1 -0
  188. package/dist/synthesis/FliteTTS.d.ts +17 -0
  189. package/dist/synthesis/FliteTTS.js +326 -0
  190. package/dist/synthesis/FliteTTS.js.map +1 -0
  191. package/dist/synthesis/GoogleCloudTTS.d.ts +17 -0
  192. package/dist/synthesis/GoogleCloudTTS.js +72 -0
  193. package/dist/synthesis/GoogleCloudTTS.js.map +1 -0
  194. package/dist/synthesis/GoogleTranslateTTS.d.ts +13 -0
  195. package/dist/synthesis/GoogleTranslateTTS.js +177 -0
  196. package/dist/synthesis/GoogleTranslateTTS.js.map +1 -0
  197. package/dist/synthesis/MicrosoftEdgeTTS.d.ts +10 -0
  198. package/dist/synthesis/MicrosoftEdgeTTS.js +216 -0
  199. package/dist/synthesis/MicrosoftEdgeTTS.js.map +1 -0
  200. package/dist/synthesis/SamTTS.d.ts +4 -0
  201. package/dist/synthesis/SamTTS.js +21 -0
  202. package/dist/synthesis/SamTTS.js.map +1 -0
  203. package/dist/synthesis/SapiTTS.d.ts +9 -0
  204. package/dist/synthesis/SapiTTS.js +211 -0
  205. package/dist/synthesis/SapiTTS.js.map +1 -0
  206. package/dist/synthesis/StreamlabsPollyTTS.d.ts +12 -0
  207. package/dist/synthesis/StreamlabsPollyTTS.js +88 -0
  208. package/dist/synthesis/StreamlabsPollyTTS.js.map +1 -0
  209. package/dist/synthesis/SvoxPicoTTS.d.ts +11 -0
  210. package/dist/synthesis/SvoxPicoTTS.js +236 -0
  211. package/dist/synthesis/SvoxPicoTTS.js.map +1 -0
  212. package/dist/synthesis/VitsTTS.d.ts +27 -0
  213. package/dist/synthesis/VitsTTS.js +359 -0
  214. package/dist/synthesis/VitsTTS.js.map +1 -0
  215. package/dist/tests/Test.d.ts +1 -0
  216. package/dist/tests/Test.js +10 -0
  217. package/dist/tests/Test.js.map +1 -0
  218. package/dist/text-language-detection/FastTextLanguageDetection.d.ts +2 -0
  219. package/dist/text-language-detection/FastTextLanguageDetection.js +38 -0
  220. package/dist/text-language-detection/FastTextLanguageDetection.js.map +1 -0
  221. package/dist/text-language-detection/TinyLDLanguageDetection.d.ts +2 -0
  222. package/dist/text-language-detection/TinyLDLanguageDetection.js +12 -0
  223. package/dist/text-language-detection/TinyLDLanguageDetection.js.map +1 -0
  224. package/dist/utilities/BinaryArrayConversion.d.ts +15 -0
  225. package/dist/utilities/BinaryArrayConversion.js +115 -0
  226. package/dist/utilities/BinaryArrayConversion.js.map +1 -0
  227. package/dist/utilities/Compression.d.ts +4 -0
  228. package/dist/utilities/Compression.js +67 -0
  229. package/dist/utilities/Compression.js.map +1 -0
  230. package/dist/utilities/FileDownloader.d.ts +3 -0
  231. package/dist/utilities/FileDownloader.js +147 -0
  232. package/dist/utilities/FileDownloader.js.map +1 -0
  233. package/dist/utilities/FileSystem.d.ts +30 -0
  234. package/dist/utilities/FileSystem.js +141 -0
  235. package/dist/utilities/FileSystem.js.map +1 -0
  236. package/dist/utilities/Hashing.d.ts +10 -0
  237. package/dist/utilities/Hashing.js +169 -0
  238. package/dist/utilities/Hashing.js.map +1 -0
  239. package/dist/utilities/Locale.d.ts +9 -0
  240. package/dist/utilities/Locale.js +65 -0
  241. package/dist/utilities/Locale.js.map +1 -0
  242. package/dist/utilities/Logger.d.ts +11 -0
  243. package/dist/utilities/Logger.js +49 -0
  244. package/dist/utilities/Logger.js.map +1 -0
  245. package/dist/utilities/NdArrayUtilities.d.ts +3 -0
  246. package/dist/utilities/NdArrayUtilities.js +22 -0
  247. package/dist/utilities/NdArrayUtilities.js.map +1 -0
  248. package/dist/utilities/ObjectUtilities.d.ts +4 -0
  249. package/dist/utilities/ObjectUtilities.js +132 -0
  250. package/dist/utilities/ObjectUtilities.js.map +1 -0
  251. package/dist/utilities/OpenPromise.d.ts +6 -0
  252. package/dist/utilities/OpenPromise.js +12 -0
  253. package/dist/utilities/OpenPromise.js.map +1 -0
  254. package/dist/utilities/PackageManager.d.ts +4 -0
  255. package/dist/utilities/PackageManager.js +46 -0
  256. package/dist/utilities/PackageManager.js.map +1 -0
  257. package/dist/utilities/RandomGenerator.d.ts +35 -0
  258. package/dist/utilities/RandomGenerator.js +149 -0
  259. package/dist/utilities/RandomGenerator.js.map +1 -0
  260. package/dist/utilities/TarballMaker.d.ts +4 -0
  261. package/dist/utilities/TarballMaker.js +50 -0
  262. package/dist/utilities/TarballMaker.js.map +1 -0
  263. package/dist/utilities/Timeline.d.ts +20 -0
  264. package/dist/utilities/Timeline.js +110 -0
  265. package/dist/utilities/Timeline.js.map +1 -0
  266. package/dist/utilities/Timer.d.ts +13 -0
  267. package/dist/utilities/Timer.js +70 -0
  268. package/dist/utilities/Timer.js.map +1 -0
  269. package/dist/utilities/Utilities.d.ts +68 -0
  270. package/dist/utilities/Utilities.js +305 -0
  271. package/dist/utilities/Utilities.js.map +1 -0
  272. package/dist/utilities/WasmMemoryManager.d.ts +142 -0
  273. package/dist/utilities/WasmMemoryManager.js +407 -0
  274. package/dist/utilities/WasmMemoryManager.js.map +1 -0
  275. package/dist/utilities/WebReader.d.ts +1 -0
  276. package/dist/utilities/WebReader.js +47 -0
  277. package/dist/utilities/WebReader.js.map +1 -0
  278. package/dist/utilities/WikipediaReader.d.ts +1 -0
  279. package/dist/utilities/WikipediaReader.js +31 -0
  280. package/dist/utilities/WikipediaReader.js.map +1 -0
  281. package/dist/voice-activity-detection/SileroVAD.d.ts +13 -0
  282. package/dist/voice-activity-detection/SileroVAD.js +58 -0
  283. package/dist/voice-activity-detection/SileroVAD.js.map +1 -0
  284. package/dist/voice-activity-detection/WebRtcVAD.d.ts +3 -0
  285. package/dist/voice-activity-detection/WebRtcVAD.js +53 -0
  286. package/dist/voice-activity-detection/WebRtcVAD.js.map +1 -0
  287. package/docs/CLI.md +234 -0
  288. package/docs/Development.md +3 -0
  289. package/docs/Engines.md +80 -0
  290. package/docs/Licenses.md +37 -0
  291. package/docs/Options.md +192 -0
  292. package/docs/Roadmap.md +16 -0
  293. package/docs/Technical.md +72 -0
  294. package/package.json +119 -19
  295. package/cli.js +0 -3
@@ -0,0 +1,162 @@
1
+ import { extendDeep } from "../utilities/ObjectUtilities.js";
2
+ import { Logger } from "../utilities/Logger.js";
3
+ import { resampleAudioSpeex } from "./SpeexResampler.js";
4
+ import { computeMelSpectogram } from "./MelSpectogram.js";
5
+ import { powerToDecibels } from "../audio/AudioUtilities.js";
6
+ import { normalizeVectors } from "../math/VectorMath.js";
7
+ export async function computeMFCCs(monoAudio, options = {}) {
8
+ const logger = new Logger();
9
+ logger.start("Initialize options");
10
+ if (monoAudio.audioChannels.length != 1) {
11
+ throw new Error("Audio must be mono");
12
+ }
13
+ options = extendDefaultMfccOptions(options);
14
+ const analysisSampleRate = options.analysisSampleRate;
15
+ const featureCount = options.featureCount;
16
+ const fftOrder = options.fftOrder;
17
+ const windowDuration = options.windowDuration;
18
+ const windowSize = windowDuration * analysisSampleRate;
19
+ const hopDuration = options.hopDuration;
20
+ const hopLength = hopDuration * analysisSampleRate;
21
+ const filterbankCount = options.filterbankCount;
22
+ const lowerFrequencyHz = options.lowerFreq;
23
+ const upperFrequencyHz = options.upperFreq;
24
+ const emphasisFactor = options.emphasisFactor;
25
+ const lifteringFactor = options.lifteringFactor;
26
+ const zeroFirstCoefficient = options.zeroFirstCoefficient;
27
+ const method = options.method;
28
+ logger.start(`Resample audio to analysis sample rate (${analysisSampleRate}Hz)`);
29
+ const resampledAudio = await resampleAudioSpeex(monoAudio, analysisSampleRate);
30
+ let mfccs;
31
+ if (method == "default") {
32
+ if (emphasisFactor > 0) {
33
+ logger.start("Apply emphasis");
34
+ resampledAudio.audioChannels[0] = applyEmphasis(resampledAudio.audioChannels[0], emphasisFactor);
35
+ }
36
+ logger.start("Compute Mel spectogram");
37
+ const { melSpectogram } = await computeMelSpectogram(resampledAudio, fftOrder, windowSize, hopLength, filterbankCount, lowerFrequencyHz, upperFrequencyHz);
38
+ logger.start("Extract MFCCs from Mel spectogram");
39
+ const mfccsFloat32 = melSpectogramToMFCCs(melSpectogram, featureCount);
40
+ mfccs = mfccsFloat32.map(mfcc => Array.from(mfcc));
41
+ }
42
+ else {
43
+ throw new Error("Invalid MFCC method");
44
+ }
45
+ if (options.normalize) {
46
+ logger.start("Normalize MFCCs");
47
+ const { normalizedVectors, mean, stdDeviation } = normalizeVectors(mfccs);
48
+ mfccs = normalizedVectors;
49
+ //mfccs = mfccs.map(mfcc => subtractVectors(mfcc, mean))
50
+ }
51
+ if (lifteringFactor > 0) {
52
+ logger.start("Apply liftering to MFCCs");
53
+ mfccs = applyLiftering(mfccs, lifteringFactor);
54
+ }
55
+ if (zeroFirstCoefficient) {
56
+ for (const mfcc of mfccs) {
57
+ mfcc[0] = 0;
58
+ }
59
+ }
60
+ logger.end();
61
+ return mfccs;
62
+ }
63
+ export function melSpectogramToMFCCs(melSpectogram, mfccFeatureCount) {
64
+ const melBandCount = melSpectogram[0].length;
65
+ const dctMatrix = createDCTType2CoefficientMatrix(mfccFeatureCount, melBandCount);
66
+ const mfccs = melSpectogram.map(frame => melSpectrumToMFCC(frame, mfccFeatureCount, dctMatrix));
67
+ return mfccs;
68
+ }
69
+ export function melSpectrumToMFCC(melSpectrum, mfccFeatureCount, dctMatrix, normalization = "orthonormal") {
70
+ const melBandCount = melSpectrum.length;
71
+ let firstFeatureNormalizationFactor;
72
+ let nonfirstFeatureNormalizationFactor;
73
+ if (normalization == "orthonormal") {
74
+ firstFeatureNormalizationFactor = Math.sqrt(1 / (4 * mfccFeatureCount));
75
+ nonfirstFeatureNormalizationFactor = Math.sqrt(1 / (2 * mfccFeatureCount));
76
+ }
77
+ else {
78
+ firstFeatureNormalizationFactor = 1;
79
+ nonfirstFeatureNormalizationFactor = 1;
80
+ }
81
+ const mfcc = new Float32Array(mfccFeatureCount);
82
+ for (let mfccFeatureIndex = 0; mfccFeatureIndex < mfccFeatureCount; mfccFeatureIndex++) {
83
+ const dctMatrixRow = dctMatrix[mfccFeatureIndex];
84
+ let sum = 0;
85
+ for (let j = 0; j < melBandCount; j++) {
86
+ const dctCoefficient = dctMatrixRow[j];
87
+ const logMel = powerToDecibels(melSpectrum[j]);
88
+ //const logMel = Math.log(1e-40 + melSpectrum[j])
89
+ sum += dctCoefficient * logMel;
90
+ }
91
+ const normalizationFactor = mfccFeatureIndex == 0 ? firstFeatureNormalizationFactor : nonfirstFeatureNormalizationFactor;
92
+ //mfcc[mfccFeatureIndex] = normalizationFactor * sum
93
+ mfcc[mfccFeatureIndex] = normalizationFactor * 2 * sum; // Sum multiplied by 2 to match with librosa
94
+ }
95
+ return mfcc;
96
+ }
97
+ export function createDCTType2CoefficientMatrix(mfccFeatureCount, melBandCount) {
98
+ const dctMatrix = new Array(mfccFeatureCount);
99
+ for (let mfccFeatureIndex = 0; mfccFeatureIndex < mfccFeatureCount; mfccFeatureIndex++) {
100
+ const row = new Float32Array(melBandCount);
101
+ const innerMultiplier = Math.PI * mfccFeatureIndex / melBandCount;
102
+ for (let melBandIndex = 0; melBandIndex < melBandCount; melBandIndex++) {
103
+ row[melBandIndex] = Math.cos(innerMultiplier * (melBandIndex + 0.5));
104
+ }
105
+ dctMatrix[mfccFeatureIndex] = row;
106
+ }
107
+ return dctMatrix;
108
+ }
109
+ export function mfccBufferToVectors(mfccBuffer, mfccFeatureCount) {
110
+ if (mfccBuffer.length % mfccFeatureCount != 0) {
111
+ throw new Error(`MFCC buffer length is not a multiple of the expected feature count (${mfccFeatureCount})`);
112
+ }
113
+ const mfccVectors = [];
114
+ for (let offset = 0; offset < mfccBuffer.length; offset += mfccFeatureCount) {
115
+ const mfccVector = Array.from(mfccBuffer.subarray(offset, offset + mfccFeatureCount));
116
+ mfccVectors.push(mfccVector);
117
+ }
118
+ return mfccVectors;
119
+ }
120
+ export function applyEmphasis(samples, emphasisFactor = 0.97, initialState = 0) {
121
+ const processedSamples = new Float32Array(samples.length);
122
+ processedSamples[0] = samples[0] - (emphasisFactor * initialState);
123
+ for (let i = 1; i < processedSamples.length; i++) {
124
+ processedSamples[i] = samples[i] - (emphasisFactor * samples[i - 1]);
125
+ }
126
+ return processedSamples;
127
+ }
128
+ export function applyLiftering(mfccs, lifteringFactor) {
129
+ const featureCount = mfccs[0].length;
130
+ const lifterMultipliers = new Float32Array(featureCount);
131
+ for (let i = 0; i < featureCount; i++) {
132
+ lifterMultipliers[i] = 1 + (lifteringFactor / 2) * Math.sin(Math.PI * (i + 1) / lifteringFactor);
133
+ }
134
+ const lifteredMfccs = [];
135
+ for (const mfcc of mfccs) {
136
+ const lifteredMfcc = new Array(featureCount);
137
+ for (let i = 0; i < featureCount; i++) {
138
+ lifteredMfcc[i] = mfcc[i] * lifterMultipliers[i];
139
+ }
140
+ lifteredMfccs.push(lifteredMfcc);
141
+ }
142
+ return lifteredMfccs;
143
+ }
144
+ export const defaultMfccOptions = {
145
+ filterbankCount: 40,
146
+ featureCount: 13,
147
+ fftOrder: 512,
148
+ lowerFreq: 133.3333,
149
+ upperFreq: 6855.4976,
150
+ windowDuration: 0.025,
151
+ hopDuration: 0.010,
152
+ emphasisFactor: 0.97,
153
+ analysisSampleRate: 16000,
154
+ lifteringFactor: 0,
155
+ normalize: false,
156
+ zeroFirstCoefficient: false,
157
+ method: "default"
158
+ };
159
+ export function extendDefaultMfccOptions(options) {
160
+ return extendDeep(defaultMfccOptions, options);
161
+ }
162
+ //# sourceMappingURL=MFCC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MFCC.js","sourceRoot":"","sources":["../../src/dsp/MFCC.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { RawAudio } from "../audio/AudioUtilities.js";
2
+ export declare function computeMelSpectogram(rawAudio: RawAudio, fftOrder: number, windowSize: number, hopLength: number, filterbankCount: number, lowerFrequencyHz: number, upperFrequencyHz: number): Promise<{
3
+ melSpectogram: Float32Array[];
4
+ fftFrames: Float32Array[];
5
+ }>;
6
+ export declare function computeMelSpectogramUsingFilterbanks(rawAudio: RawAudio, fftOrder: number, windowSize: number, hopLength: number, filterbanks: Filterbank[]): Promise<{
7
+ melSpectogram: Float32Array[];
8
+ fftFrames: Float32Array[];
9
+ }>;
10
+ export declare function fftFramesToMelSpectogram(fftFrames: Float32Array[], melFilterbanks: Filterbank[]): Float32Array[];
11
+ export declare function powerSpectrumToMelSpectrum(powerSpectrum: Float32Array, filterbanks: Filterbank[]): Float32Array;
12
+ export declare function getMelFilterbanks(powerSpectrumFrequenciesHz: Float32Array, centerFrequenciesMel: Float32Array, lowerFrequencyMel: number, upperFrequencyMel: number): Filterbank[];
13
+ export declare function getMelFilterbanksCenterFrequencies(melBandCount: number, lowerFrequencyMel: number, upperFrequencyMel: number): Float32Array;
14
+ export declare function hertzToMel(frequency: number): number;
15
+ export declare function melToHertz(mel: number): number;
16
+ export type Filterbank = {
17
+ startIndex: number;
18
+ weights: number[];
19
+ };
@@ -0,0 +1,102 @@
1
+ import { Logger } from "../utilities/Logger.js";
2
+ const FFT = await import("./FFT.js");
3
+ export async function computeMelSpectogram(rawAudio, fftOrder, windowSize, hopLength, filterbankCount, lowerFrequencyHz, upperFrequencyHz) {
4
+ const logger = new Logger();
5
+ logger.start("Compute mel filterbank");
6
+ const binCount = (fftOrder / 2) + 2;
7
+ const nyquistFrequency = rawAudio.sampleRate / 2;
8
+ const binFrequencies = FFT.getBinFrequencies(binCount, nyquistFrequency);
9
+ const lowerFrequencyMel = hertzToMel(lowerFrequencyHz);
10
+ const upperFrequencyMel = hertzToMel(upperFrequencyHz);
11
+ const filterbanksCenterFrequencies = getMelFilterbanksCenterFrequencies(filterbankCount, lowerFrequencyMel, upperFrequencyMel);
12
+ const melFilterbanks = getMelFilterbanks(binFrequencies, filterbanksCenterFrequencies, lowerFrequencyMel, upperFrequencyMel);
13
+ logger.end();
14
+ return computeMelSpectogramUsingFilterbanks(rawAudio, fftOrder, windowSize, hopLength, melFilterbanks);
15
+ }
16
+ export async function computeMelSpectogramUsingFilterbanks(rawAudio, fftOrder, windowSize, hopLength, filterbanks) {
17
+ const logger = new Logger();
18
+ logger.start("Compute short-time FFTs");
19
+ const audioSamples = rawAudio.audioChannels[0];
20
+ const fftFrames = await FFT.stftr(audioSamples, fftOrder, windowSize, hopLength, "hann");
21
+ logger.start("Convert FFT frames to a mel spectogram");
22
+ const melSpectogram = fftFramesToMelSpectogram(fftFrames, filterbanks);
23
+ logger.end();
24
+ return { melSpectogram, fftFrames };
25
+ }
26
+ export function fftFramesToMelSpectogram(fftFrames, melFilterbanks) {
27
+ return fftFrames.map(fftFrame => {
28
+ const powerSpectrum = FFT.fftFrameToPowerSpectrum(fftFrame);
29
+ return powerSpectrumToMelSpectrum(powerSpectrum, melFilterbanks);
30
+ });
31
+ }
32
+ export function powerSpectrumToMelSpectrum(powerSpectrum, filterbanks) {
33
+ const filterbankCount = filterbanks.length;
34
+ const melSpectrum = new Float32Array(filterbankCount);
35
+ for (let melBandIndex = 0; melBandIndex < filterbankCount; melBandIndex++) {
36
+ const filterbank = filterbanks[melBandIndex];
37
+ const filterbankStartIndex = filterbank.startIndex;
38
+ const filterbankWeights = filterbank.weights;
39
+ if (filterbankStartIndex == -1) {
40
+ continue;
41
+ }
42
+ let bandValue = 0;
43
+ for (let i = 0; i < filterbankWeights.length; i++) {
44
+ bandValue += filterbankWeights[i] * powerSpectrum[filterbankStartIndex + i];
45
+ }
46
+ melSpectrum[melBandIndex] = bandValue;
47
+ }
48
+ return melSpectrum;
49
+ }
50
+ export function getMelFilterbanks(powerSpectrumFrequenciesHz, centerFrequenciesMel, lowerFrequencyMel, upperFrequencyMel) {
51
+ const filterbankCount = centerFrequenciesMel.length;
52
+ const powerSpectrumFrequenciesMel = powerSpectrumFrequenciesHz.map(frequencyHz => hertzToMel(frequencyHz));
53
+ const filterbanks = [];
54
+ for (let filterbankIndex = 0; filterbankIndex < filterbankCount; filterbankIndex++) {
55
+ const centerFrequency = centerFrequenciesMel[filterbankIndex];
56
+ const leftFrequency = filterbankIndex > 0 ? centerFrequenciesMel[filterbankIndex - 1] : lowerFrequencyMel;
57
+ const rightFrequency = filterbankIndex < filterbankCount - 1 ? centerFrequenciesMel[filterbankIndex + 1] : upperFrequencyMel;
58
+ const width = rightFrequency - leftFrequency;
59
+ const halfWidth = width / 2;
60
+ let startIndex = -1;
61
+ let weights = [];
62
+ let weightSum = 0;
63
+ for (let powerSpectrumBandIndex = 0; powerSpectrumBandIndex < powerSpectrumFrequenciesMel.length; powerSpectrumBandIndex++) {
64
+ const powerSpectrumBandFrequencyMel = powerSpectrumFrequenciesMel[powerSpectrumBandIndex];
65
+ let weight = 0;
66
+ if (powerSpectrumBandFrequencyMel >= leftFrequency && powerSpectrumBandFrequencyMel <= centerFrequency) {
67
+ weight = (powerSpectrumBandFrequencyMel - leftFrequency) / halfWidth;
68
+ }
69
+ else if (powerSpectrumBandFrequencyMel > centerFrequency && powerSpectrumBandFrequencyMel <= rightFrequency) {
70
+ weight = (rightFrequency - powerSpectrumBandFrequencyMel) / halfWidth;
71
+ }
72
+ if (weight > 0) {
73
+ if (startIndex == -1) {
74
+ startIndex = powerSpectrumBandIndex;
75
+ }
76
+ weights.push(weight);
77
+ weightSum += weight;
78
+ }
79
+ else if (startIndex != -1) {
80
+ break;
81
+ }
82
+ }
83
+ weights = weights.map(weight => weight / weightSum);
84
+ filterbanks.push({ startIndex, weights });
85
+ }
86
+ return filterbanks;
87
+ }
88
+ export function getMelFilterbanksCenterFrequencies(melBandCount, lowerFrequencyMel, upperFrequencyMel) {
89
+ const stepSizeMel = (upperFrequencyMel - lowerFrequencyMel) / (melBandCount + 1);
90
+ const centerFrequencies = new Float32Array(melBandCount);
91
+ for (let i = 0; i < melBandCount; i++) {
92
+ centerFrequencies[i] = lowerFrequencyMel + ((i + 1) * stepSizeMel);
93
+ }
94
+ return centerFrequencies;
95
+ }
96
+ export function hertzToMel(frequency) {
97
+ return 2595.0 * Math.log10(1.0 + (frequency / 700.0));
98
+ }
99
+ export function melToHertz(mel) {
100
+ return 700.0 * (Math.pow(10.0, mel / 2595.0) - 1.0);
101
+ }
102
+ //# sourceMappingURL=MelSpectogram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MelSpectogram.js","sourceRoot":"","sources":["../../src/dsp/MelSpectogram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { RawAudio } from "../audio/AudioUtilities.js";
2
+ export declare function stretchTimePitch(rawAudio: RawAudio, speed: number, pitchScale: number, options: RubberbandOptions): Promise<RawAudio>;
3
+ export declare function getRubberbandInstance(): Promise<any>;
4
+ export declare function rubberBandOptionsToFlags(options: RubberbandOptions): number;
5
+ export declare enum RubberBandOptionFlag {
6
+ ProcessOffline = 0,
7
+ ProcessRealTime = 1,
8
+ StretchElastic = 0,
9
+ StretchPrecise = 16,
10
+ TransientsCrisp = 0,
11
+ TransientsMixed = 256,
12
+ TransientsSmooth = 512,
13
+ DetectorCompound = 0,
14
+ DetectorPercussive = 1024,
15
+ DetectorSoft = 2048,
16
+ PhaseLaminar = 0,
17
+ PhaseIndependent = 8192,
18
+ ThreadingAuto = 0,
19
+ ThreadingNever = 65536,
20
+ ThreadingAlways = 131072,
21
+ WindowStandard = 0,
22
+ WindowShort = 1048576,
23
+ WindowLong = 2097152,
24
+ SmoothingOff = 0,
25
+ SmoothingOn = 8388608,
26
+ FormantShifted = 0,
27
+ FormantPreserved = 16777216,
28
+ PitchHighSpeed = 0,
29
+ PitchHighQuality = 33554432,
30
+ PitchHighConsistency = 67108864,
31
+ ChannelsApart = 0,
32
+ ChannelsTogether = 268435456,
33
+ EngineFaster = 0,
34
+ EngineFiner = 536870912
35
+ }
36
+ export declare enum RubberBandPresetOption {
37
+ DefaultOptions = 0,
38
+ PercussiveOptions = 1056768
39
+ }
40
+ export declare const defaultRubberbandOptions: RubberbandOptions;
41
+ export type RubberbandOptions = {
42
+ stretch?: "elastic" | "precise";
43
+ transients?: "crisp" | "mixed" | "smooth";
44
+ detector?: "compound" | "percussive" | "soft";
45
+ phase?: "laminar" | "independent";
46
+ window?: "standard" | "long" | "short";
47
+ smoothing?: "off" | "on";
48
+ formant?: "shited" | "preserved";
49
+ pitch?: "high-speed" | "high-quality" | "high-consistency";
50
+ channels?: "apart" | "together";
51
+ engine?: "faster" | "finer";
52
+ };
@@ -0,0 +1,186 @@
1
+ import { extendDeep } from "../utilities/ObjectUtilities.js";
2
+ import { concatFloat32Arrays } from "../utilities/Utilities.js";
3
+ import { WasmMemoryManager } from "../utilities/WasmMemoryManager.js";
4
+ let rubberbandInstance;
5
+ export async function stretchTimePitch(rawAudio, speed, pitchScale, options) {
6
+ options = extendDeep(defaultRubberbandOptions, options);
7
+ const channels = rawAudio.audioChannels;
8
+ const channelCount = channels.length;
9
+ const sampleCount = channels[0].length;
10
+ const sampleRate = rawAudio.sampleRate;
11
+ const m = await getRubberbandInstance();
12
+ const wasmMemory = new WasmMemoryManager(m);
13
+ const optionFlags = rubberBandOptionsToFlags(options);
14
+ const statePtr = m._rubberband_new(sampleRate, channelCount, optionFlags, 1, 1);
15
+ m._rubberband_set_time_ratio(statePtr, 1 / speed);
16
+ m._rubberband_set_pitch_scale(statePtr, pitchScale);
17
+ const samplesRequired = m._rubberband_get_samples_required(statePtr);
18
+ const bufferSize = Math.min(samplesRequired, sampleCount);
19
+ const bufferChannelPtrsRef = wasmMemory.allocUint32Array(bufferSize);
20
+ const bufferChannelRefs = [];
21
+ for (let i = 0; i < channelCount; i++) {
22
+ const bufferChannelRef = wasmMemory.allocFloat32Array(bufferSize);
23
+ bufferChannelPtrsRef.view[i] = bufferChannelRef.address;
24
+ bufferChannelRefs.push(bufferChannelRef);
25
+ }
26
+ m._rubberband_set_expected_input_duration(statePtr, sampleCount);
27
+ //m._rubberband_set_max_process_size(statePtr, bufferSize)
28
+ for (let offset = 0; offset < sampleCount; offset += bufferSize) {
29
+ let writtenSize;
30
+ let isFinal;
31
+ if (sampleCount - offset > bufferSize) {
32
+ writtenSize = bufferSize;
33
+ isFinal = 0;
34
+ }
35
+ else {
36
+ writtenSize = sampleCount - offset;
37
+ isFinal = 1;
38
+ }
39
+ for (let i = 0; i < channelCount; i++) {
40
+ const samplesToWrite = channels[i].subarray(offset, offset + writtenSize);
41
+ bufferChannelRefs[i].view.set(samplesToWrite);
42
+ }
43
+ m._rubberband_study(statePtr, bufferChannelPtrsRef.address, writtenSize, isFinal);
44
+ }
45
+ const outputAudioChannelChunks = [];
46
+ for (let i = 0; i < channelCount; i++) {
47
+ outputAudioChannelChunks.push([]);
48
+ }
49
+ for (let readOffset = 0; readOffset < sampleCount; readOffset += bufferSize) {
50
+ let writtenSize;
51
+ let isFinal;
52
+ if (sampleCount - readOffset > bufferSize) {
53
+ writtenSize = bufferSize;
54
+ isFinal = 0;
55
+ }
56
+ else {
57
+ writtenSize = sampleCount - readOffset;
58
+ isFinal = 1;
59
+ }
60
+ for (let i = 0; i < channelCount; i++) {
61
+ const samplesToWrite = channels[i].subarray(readOffset, readOffset + writtenSize);
62
+ bufferChannelRefs[i].view.set(samplesToWrite);
63
+ }
64
+ m._rubberband_process(statePtr, bufferChannelPtrsRef.address, writtenSize, isFinal);
65
+ while (true) {
66
+ const samplesAvailable = m._rubberband_available(statePtr);
67
+ if (samplesAvailable <= 0) {
68
+ break;
69
+ }
70
+ const sizeToRead = Math.min(samplesAvailable, bufferSize);
71
+ const readCount = m._rubberband_retrieve(statePtr, bufferChannelPtrsRef.address, sizeToRead);
72
+ for (let i = 0; i < channelCount; i++) {
73
+ const readSamplesForChannel = bufferChannelRefs[i].view.slice(0, readCount);
74
+ outputAudioChannelChunks[i].push(readSamplesForChannel);
75
+ }
76
+ }
77
+ }
78
+ m._rubberband_delete(statePtr);
79
+ wasmMemory.freeAll();
80
+ const outputAudioChannels = outputAudioChannelChunks.map(chunks => concatFloat32Arrays(chunks));
81
+ const outputRawAudio = { audioChannels: outputAudioChannels, sampleRate };
82
+ return outputRawAudio;
83
+ }
84
+ export async function getRubberbandInstance() {
85
+ if (!rubberbandInstance) {
86
+ const { default: RubberbandInitializer } = await import('@echogarden/rubberband-wasm');
87
+ rubberbandInstance = await RubberbandInitializer();
88
+ }
89
+ return rubberbandInstance;
90
+ }
91
+ export function rubberBandOptionsToFlags(options) {
92
+ let flags = 0;
93
+ if (options.stretch == "precise") {
94
+ flags += RubberBandOptionFlag.StretchPrecise;
95
+ }
96
+ if (options.transients == "mixed") {
97
+ flags += RubberBandOptionFlag.TransientsMixed;
98
+ }
99
+ else if (options.transients == "smooth") {
100
+ flags += RubberBandOptionFlag.TransientsSmooth;
101
+ }
102
+ if (options.detector == "percussive") {
103
+ flags += RubberBandOptionFlag.DetectorPercussive;
104
+ }
105
+ else if (options.detector == "soft") {
106
+ flags += RubberBandOptionFlag.DetectorSoft;
107
+ }
108
+ if (options.phase == "independent") {
109
+ flags += RubberBandOptionFlag.PhaseIndependent;
110
+ }
111
+ if (options.window == "short") {
112
+ flags += RubberBandOptionFlag.WindowShort;
113
+ }
114
+ else if (options.window == "long") {
115
+ flags += RubberBandOptionFlag.WindowLong;
116
+ }
117
+ if (options.smoothing == "on") {
118
+ flags += RubberBandOptionFlag.SmoothingOn;
119
+ }
120
+ if (options.formant == "preserved") {
121
+ flags += RubberBandOptionFlag.FormantPreserved;
122
+ }
123
+ if (options.pitch == "high-quality") {
124
+ flags += RubberBandOptionFlag.PitchHighQuality;
125
+ }
126
+ else if (options.pitch == "high-consistency") {
127
+ flags += RubberBandOptionFlag.PitchHighConsistency;
128
+ }
129
+ if (options.channels == "together") {
130
+ flags += RubberBandOptionFlag.ChannelsTogether;
131
+ }
132
+ if (options.engine == "finer") {
133
+ flags += RubberBandOptionFlag.EngineFiner;
134
+ }
135
+ return flags;
136
+ }
137
+ export var RubberBandOptionFlag;
138
+ (function (RubberBandOptionFlag) {
139
+ RubberBandOptionFlag[RubberBandOptionFlag["ProcessOffline"] = 0] = "ProcessOffline";
140
+ RubberBandOptionFlag[RubberBandOptionFlag["ProcessRealTime"] = 1] = "ProcessRealTime";
141
+ RubberBandOptionFlag[RubberBandOptionFlag["StretchElastic"] = 0] = "StretchElastic";
142
+ RubberBandOptionFlag[RubberBandOptionFlag["StretchPrecise"] = 16] = "StretchPrecise";
143
+ RubberBandOptionFlag[RubberBandOptionFlag["TransientsCrisp"] = 0] = "TransientsCrisp";
144
+ RubberBandOptionFlag[RubberBandOptionFlag["TransientsMixed"] = 256] = "TransientsMixed";
145
+ RubberBandOptionFlag[RubberBandOptionFlag["TransientsSmooth"] = 512] = "TransientsSmooth";
146
+ RubberBandOptionFlag[RubberBandOptionFlag["DetectorCompound"] = 0] = "DetectorCompound";
147
+ RubberBandOptionFlag[RubberBandOptionFlag["DetectorPercussive"] = 1024] = "DetectorPercussive";
148
+ RubberBandOptionFlag[RubberBandOptionFlag["DetectorSoft"] = 2048] = "DetectorSoft";
149
+ RubberBandOptionFlag[RubberBandOptionFlag["PhaseLaminar"] = 0] = "PhaseLaminar";
150
+ RubberBandOptionFlag[RubberBandOptionFlag["PhaseIndependent"] = 8192] = "PhaseIndependent";
151
+ RubberBandOptionFlag[RubberBandOptionFlag["ThreadingAuto"] = 0] = "ThreadingAuto";
152
+ RubberBandOptionFlag[RubberBandOptionFlag["ThreadingNever"] = 65536] = "ThreadingNever";
153
+ RubberBandOptionFlag[RubberBandOptionFlag["ThreadingAlways"] = 131072] = "ThreadingAlways";
154
+ RubberBandOptionFlag[RubberBandOptionFlag["WindowStandard"] = 0] = "WindowStandard";
155
+ RubberBandOptionFlag[RubberBandOptionFlag["WindowShort"] = 1048576] = "WindowShort";
156
+ RubberBandOptionFlag[RubberBandOptionFlag["WindowLong"] = 2097152] = "WindowLong";
157
+ RubberBandOptionFlag[RubberBandOptionFlag["SmoothingOff"] = 0] = "SmoothingOff";
158
+ RubberBandOptionFlag[RubberBandOptionFlag["SmoothingOn"] = 8388608] = "SmoothingOn";
159
+ RubberBandOptionFlag[RubberBandOptionFlag["FormantShifted"] = 0] = "FormantShifted";
160
+ RubberBandOptionFlag[RubberBandOptionFlag["FormantPreserved"] = 16777216] = "FormantPreserved";
161
+ RubberBandOptionFlag[RubberBandOptionFlag["PitchHighSpeed"] = 0] = "PitchHighSpeed";
162
+ RubberBandOptionFlag[RubberBandOptionFlag["PitchHighQuality"] = 33554432] = "PitchHighQuality";
163
+ RubberBandOptionFlag[RubberBandOptionFlag["PitchHighConsistency"] = 67108864] = "PitchHighConsistency";
164
+ RubberBandOptionFlag[RubberBandOptionFlag["ChannelsApart"] = 0] = "ChannelsApart";
165
+ RubberBandOptionFlag[RubberBandOptionFlag["ChannelsTogether"] = 268435456] = "ChannelsTogether";
166
+ RubberBandOptionFlag[RubberBandOptionFlag["EngineFaster"] = 0] = "EngineFaster";
167
+ RubberBandOptionFlag[RubberBandOptionFlag["EngineFiner"] = 536870912] = "EngineFiner";
168
+ })(RubberBandOptionFlag = RubberBandOptionFlag || (RubberBandOptionFlag = {}));
169
+ export var RubberBandPresetOption;
170
+ (function (RubberBandPresetOption) {
171
+ RubberBandPresetOption[RubberBandPresetOption["DefaultOptions"] = 0] = "DefaultOptions";
172
+ RubberBandPresetOption[RubberBandPresetOption["PercussiveOptions"] = 1056768] = "PercussiveOptions";
173
+ })(RubberBandPresetOption = RubberBandPresetOption || (RubberBandPresetOption = {}));
174
+ export const defaultRubberbandOptions = {
175
+ stretch: "elastic",
176
+ transients: "crisp",
177
+ detector: "compound",
178
+ phase: "laminar",
179
+ window: "standard",
180
+ smoothing: "off",
181
+ formant: "shited",
182
+ pitch: "high-speed",
183
+ channels: "apart",
184
+ engine: "faster"
185
+ };
186
+ //# sourceMappingURL=Rubberband.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rubberband.js","sourceRoot":"","sources":["../../src/dsp/Rubberband.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { RawAudio } from "../audio/AudioUtilities.js";
2
+ export declare function stretchTimePitch(rawAudio: RawAudio, speed: number, pitchScale: number): Promise<RawAudio>;
@@ -0,0 +1,39 @@
1
+ import { WasmMemoryManager } from "../utilities/WasmMemoryManager.js";
2
+ let sonicInstance;
3
+ export async function stretchTimePitch(rawAudio, speed, pitchScale) {
4
+ const sampleRate = rawAudio.sampleRate;
5
+ const channelCount = rawAudio.audioChannels.length;
6
+ const inputSamples = rawAudio.audioChannels[0];
7
+ const inputSampleCount = rawAudio.audioChannels[0].length;
8
+ const m = await getSonicInstance();
9
+ const wasmMemory = new WasmMemoryManager(m);
10
+ const streamPtr = m._sonicCreateStream(sampleRate, channelCount);
11
+ m._sonicSetSpeed(streamPtr, speed);
12
+ m._sonicSetPitch(streamPtr, pitchScale);
13
+ const inputSamplesRef = wasmMemory.allocFloat32Array(inputSampleCount);
14
+ inputSamplesRef.view.set(inputSamples);
15
+ const writeSuccess = m._sonicWriteFloatToStream(streamPtr, inputSamplesRef.address, inputSampleCount);
16
+ if (writeSuccess != 1) {
17
+ throw new Error("Sonic error: failed write to stream");
18
+ }
19
+ const flushSuccess = m._sonicFlushStream(streamPtr);
20
+ if (flushSuccess != 1) {
21
+ throw new Error("Sonic error: failed flushing stream");
22
+ }
23
+ const samplesAvailable = m._sonicSamplesAvailable(streamPtr);
24
+ const outputSamplesRef = wasmMemory.allocFloat32Array(samplesAvailable);
25
+ const samplesRead = m._sonicReadFloatFromStream(streamPtr, outputSamplesRef.address, outputSamplesRef.length);
26
+ const outputSamples = outputSamplesRef.view.slice(0, samplesRead);
27
+ const resultAudio = { audioChannels: [outputSamples], sampleRate };
28
+ m._sonicDestroyStream(streamPtr);
29
+ wasmMemory.freeAll();
30
+ return resultAudio;
31
+ }
32
+ async function getSonicInstance() {
33
+ if (!sonicInstance) {
34
+ const { default: SonicInitializer } = await import('@echogarden/sonic-wasm');
35
+ sonicInstance = await SonicInitializer();
36
+ }
37
+ return sonicInstance;
38
+ }
39
+ //# sourceMappingURL=Sonic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sonic.js","sourceRoot":"","sources":["../../src/dsp/Sonic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AAErE,IAAI,aAAkB,CAAA;AAEtB,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAkB,EAAE,KAAa,EAAE,UAAkB;IAC3F,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAA;IACtC,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAA;IAClD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;IAC9C,MAAM,gBAAgB,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAEzD,MAAM,CAAC,GAAG,MAAM,gBAAgB,EAAE,CAAA;IAClC,MAAM,UAAU,GAAG,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAE3C,MAAM,SAAS,GAAG,CAAC,CAAC,kBAAkB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAA;IAChE,CAAC,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IAClC,CAAC,CAAC,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;IAEvC,MAAM,eAAe,GAAG,UAAU,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;IACtE,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;IAEtC,MAAM,YAAY,GAAG,CAAC,CAAC,wBAAwB,CAAC,SAAS,EAAE,eAAe,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAA;IAErG,IAAI,YAAY,IAAI,CAAC,EAAE;QACtB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;KACtD;IAED,MAAM,YAAY,GAAG,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;IAEnD,IAAI,YAAY,IAAI,CAAC,EAAE;QACtB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;KACtD;IAED,MAAM,gBAAgB,GAAG,CAAC,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAA;IAE5D,MAAM,gBAAgB,GAAG,UAAU,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;IAEvE,MAAM,WAAW,GAAG,CAAC,CAAC,yBAAyB,CAAC,SAAS,EAAE,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAE7G,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAA;IAEjE,MAAM,WAAW,GAAa,EAAE,aAAa,EAAE,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,CAAA;IAE5E,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAA;IAEhC,UAAU,CAAC,OAAO,EAAE,CAAA;IAEpB,OAAO,WAAW,CAAA;AACnB,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC9B,IAAI,CAAC,aAAa,EAAE;QACnB,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAA;QAE5E,aAAa,GAAG,MAAM,gBAAgB,EAAE,CAAA;KACxC;IAED,OAAO,aAAa,CAAA;AACrB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { RawAudio } from "../audio/AudioUtilities.js";
2
+ export declare function resampleAudioSpeex(rawAudio: RawAudio, outSampleRate: number, quality?: number): Promise<RawAudio>;
3
+ export declare function getSpeexResamplerInstance(): Promise<any>;