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.
- package/README.md +65 -1
- package/data/lexicons/heteronyms.json +674 -0
- package/data/schemas/options.json +1057 -0
- package/data/tables/lcid-table.json +7427 -0
- package/dist/alignment/DTWMfccSequenceAlignment.d.ts +2 -0
- package/dist/alignment/DTWMfccSequenceAlignment.js +26 -0
- package/dist/alignment/DTWMfccSequenceAlignment.js.map +1 -0
- package/dist/alignment/DTWSequenceAlignment.d.ts +5 -0
- package/dist/alignment/DTWSequenceAlignment.js +99 -0
- package/dist/alignment/DTWSequenceAlignment.js.map +1 -0
- package/dist/alignment/DTWSequenceAlignmentWindowed.d.ts +5 -0
- package/dist/alignment/DTWSequenceAlignmentWindowed.js +161 -0
- package/dist/alignment/DTWSequenceAlignmentWindowed.js.map +1 -0
- package/dist/alignment/LevenshteinSequenceAlignment.d.ts +5 -0
- package/dist/alignment/LevenshteinSequenceAlignment.js +102 -0
- package/dist/alignment/LevenshteinSequenceAlignment.js.map +1 -0
- package/dist/alignment/SpeechAlignment.d.ts +27 -0
- package/dist/alignment/SpeechAlignment.js +266 -0
- package/dist/alignment/SpeechAlignment.js.map +1 -0
- package/dist/api/API.d.ts +8 -0
- package/dist/api/API.js +10 -0
- package/dist/api/API.js.map +1 -0
- package/dist/api/APIOptions.d.ts +12 -0
- package/dist/api/APIOptions.js +2 -0
- package/dist/api/APIOptions.js.map +1 -0
- package/dist/api/Alignment.d.ts +32 -0
- package/dist/api/Alignment.js +134 -0
- package/dist/api/Alignment.js.map +1 -0
- package/dist/api/Denoising.d.ts +14 -0
- package/dist/api/Denoising.js +66 -0
- package/dist/api/Denoising.js.map +1 -0
- package/dist/api/Globals.d.ts +1 -0
- package/dist/api/Globals.js +2 -0
- package/dist/api/Globals.js.map +1 -0
- package/dist/api/LanguageDetection.d.ts +49 -0
- package/dist/api/LanguageDetection.js +118 -0
- package/dist/api/LanguageDetection.js.map +1 -0
- package/dist/api/Recognition.d.ts +49 -0
- package/dist/api/Recognition.js +162 -0
- package/dist/api/Recognition.js.map +1 -0
- package/dist/api/Synthesis.d.ts +125 -0
- package/dist/api/Synthesis.js +892 -0
- package/dist/api/Synthesis.js.map +1 -0
- package/dist/api/Translation.d.ts +25 -0
- package/dist/api/Translation.js +69 -0
- package/dist/api/Translation.js.map +1 -0
- package/dist/api/Vad.d.ts +25 -0
- package/dist/api/Vad.js +88 -0
- package/dist/api/Vad.js.map +1 -0
- package/dist/audio/AudioBufferConversion.d.ts +15 -0
- package/dist/audio/AudioBufferConversion.js +228 -0
- package/dist/audio/AudioBufferConversion.js.map +1 -0
- package/dist/audio/AudioPlayer.d.ts +9 -0
- package/dist/audio/AudioPlayer.js +232 -0
- package/dist/audio/AudioPlayer.js.map +1 -0
- package/dist/audio/AudioRecorder.d.ts +3 -0
- package/dist/audio/AudioRecorder.js +68 -0
- package/dist/audio/AudioRecorder.js.map +1 -0
- package/dist/audio/AudioUtilities.d.ts +48 -0
- package/dist/audio/AudioUtilities.js +209 -0
- package/dist/audio/AudioUtilities.js.map +1 -0
- package/dist/audio/SoxPath.d.ts +1 -0
- package/dist/audio/SoxPath.js +19 -0
- package/dist/audio/SoxPath.js.map +1 -0
- package/dist/cli/CLI.d.ts +8 -0
- package/dist/cli/CLI.js +860 -0
- package/dist/cli/CLI.js.map +1 -0
- package/dist/cli/CLIConfigFile.d.ts +3 -0
- package/dist/cli/CLIConfigFile.js +62 -0
- package/dist/cli/CLIConfigFile.js.map +1 -0
- package/dist/cli/CLILauncher.d.ts +2 -0
- package/dist/cli/CLILauncher.js +22 -0
- package/dist/cli/CLILauncher.js.map +1 -0
- package/dist/cli/CLIOptionsSchema.d.ts +5 -0
- package/dist/cli/CLIOptionsSchema.js +36 -0
- package/dist/cli/CLIOptionsSchema.js.map +1 -0
- package/dist/cli/CLIParser.d.ts +6 -0
- package/dist/cli/CLIParser.js +34 -0
- package/dist/cli/CLIParser.js.map +1 -0
- package/dist/cli/CLIStarter.d.ts +1 -0
- package/dist/cli/CLIStarter.js +3 -0
- package/dist/cli/CLIStarter.js.map +1 -0
- package/dist/codecs/FFMpegTranscoder.d.ts +20 -0
- package/dist/codecs/FFMpegTranscoder.js +169 -0
- package/dist/codecs/FFMpegTranscoder.js.map +1 -0
- package/dist/codecs/TIMITCodec.d.ts +9 -0
- package/dist/codecs/TIMITCodec.js +14 -0
- package/dist/codecs/TIMITCodec.js.map +1 -0
- package/dist/codecs/WaveCodec.d.ts +19 -0
- package/dist/codecs/WaveCodec.js +208 -0
- package/dist/codecs/WaveCodec.js.map +1 -0
- package/dist/denoising/RNNoise.d.ts +6 -0
- package/dist/denoising/RNNoise.js +68 -0
- package/dist/denoising/RNNoise.js.map +1 -0
- package/dist/dsp/BiquadFilter.d.ts +26 -0
- package/dist/dsp/BiquadFilter.js +399 -0
- package/dist/dsp/BiquadFilter.js.map +1 -0
- package/dist/dsp/FFT.d.ts +9 -0
- package/dist/dsp/FFT.js +135 -0
- package/dist/dsp/FFT.js.map +1 -0
- package/dist/dsp/MFCC.d.ts +25 -0
- package/dist/dsp/MFCC.js +162 -0
- package/dist/dsp/MFCC.js.map +1 -0
- package/dist/dsp/MelSpectogram.d.ts +19 -0
- package/dist/dsp/MelSpectogram.js +102 -0
- package/dist/dsp/MelSpectogram.js.map +1 -0
- package/dist/dsp/Rubberband.d.ts +52 -0
- package/dist/dsp/Rubberband.js +186 -0
- package/dist/dsp/Rubberband.js.map +1 -0
- package/dist/dsp/Sonic.d.ts +2 -0
- package/dist/dsp/Sonic.js +39 -0
- package/dist/dsp/Sonic.js.map +1 -0
- package/dist/dsp/SpeexResampler.d.ts +3 -0
- package/dist/dsp/SpeexResampler.js +53 -0
- package/dist/dsp/SpeexResampler.js.map +1 -0
- package/dist/math/VectorMath.d.ts +70 -0
- package/dist/math/VectorMath.js +564 -0
- package/dist/math/VectorMath.js.map +1 -0
- package/dist/nlp/ChineseSegmentation.d.ts +1 -0
- package/dist/nlp/ChineseSegmentation.js +53 -0
- package/dist/nlp/ChineseSegmentation.js.map +1 -0
- package/dist/nlp/CompromiseNLP.d.ts +15 -0
- package/dist/nlp/CompromiseNLP.js +66 -0
- package/dist/nlp/CompromiseNLP.js.map +1 -0
- package/dist/nlp/EspeakPhonemizer.d.ts +4 -0
- package/dist/nlp/EspeakPhonemizer.js +133 -0
- package/dist/nlp/EspeakPhonemizer.js.map +1 -0
- package/dist/nlp/IPA.d.ts +19 -0
- package/dist/nlp/IPA.js +113 -0
- package/dist/nlp/IPA.js.map +1 -0
- package/dist/nlp/JapaneseSegmentation.d.ts +1 -0
- package/dist/nlp/JapaneseSegmentation.js +40 -0
- package/dist/nlp/JapaneseSegmentation.js.map +1 -0
- package/dist/nlp/Lexicon.d.ts +17 -0
- package/dist/nlp/Lexicon.js +6 -0
- package/dist/nlp/Lexicon.js.map +1 -0
- package/dist/nlp/PhoneConversion.d.ts +6 -0
- package/dist/nlp/PhoneConversion.js +467 -0
- package/dist/nlp/PhoneConversion.js.map +1 -0
- package/dist/nlp/Segmentation.d.ts +41 -0
- package/dist/nlp/Segmentation.js +158 -0
- package/dist/nlp/Segmentation.js.map +1 -0
- package/dist/nlp/TextNormalizer.d.ts +4 -0
- package/dist/nlp/TextNormalizer.js +69 -0
- package/dist/nlp/TextNormalizer.js.map +1 -0
- package/dist/recognition/AmazonTranscribeSTT.d.ts +6 -0
- package/dist/recognition/AmazonTranscribeSTT.js +79 -0
- package/dist/recognition/AmazonTranscribeSTT.js.map +1 -0
- package/dist/recognition/AzureCognitiveServicesSTT.d.ts +7 -0
- package/dist/recognition/AzureCognitiveServicesSTT.js +51 -0
- package/dist/recognition/AzureCognitiveServicesSTT.js.map +1 -0
- package/dist/recognition/GoogleCloudSTT.d.ts +7 -0
- package/dist/recognition/GoogleCloudSTT.js +66 -0
- package/dist/recognition/GoogleCloudSTT.js.map +1 -0
- package/dist/recognition/SileroSTT.d.ts +9 -0
- package/dist/recognition/SileroSTT.js +125 -0
- package/dist/recognition/SileroSTT.js.map +1 -0
- package/dist/recognition/VoskSTT.d.ts +10 -0
- package/dist/recognition/VoskSTT.js +78 -0
- package/dist/recognition/VoskSTT.js.map +1 -0
- package/dist/recognition/WhisperSTT.d.ts +69 -0
- package/dist/recognition/WhisperSTT.js +977 -0
- package/dist/recognition/WhisperSTT.js.map +1 -0
- package/dist/server/Server.d.ts +1 -0
- package/dist/server/Server.js +18 -0
- package/dist/server/Server.js.map +1 -0
- package/dist/speech-language-detection/SileroLanguageDetection.d.ts +9 -0
- package/dist/speech-language-detection/SileroLanguageDetection.js +47 -0
- package/dist/speech-language-detection/SileroLanguageDetection.js.map +1 -0
- package/dist/subtitles/Subtitles.d.ts +25 -0
- package/dist/subtitles/Subtitles.js +286 -0
- package/dist/subtitles/Subtitles.js.map +1 -0
- package/dist/synthesis/AwsPollyTTS.d.ts +7 -0
- package/dist/synthesis/AwsPollyTTS.js +51 -0
- package/dist/synthesis/AwsPollyTTS.js.map +1 -0
- package/dist/synthesis/AzureCognitiveServicesTTS.d.ts +9 -0
- package/dist/synthesis/AzureCognitiveServicesTTS.js +103 -0
- package/dist/synthesis/AzureCognitiveServicesTTS.js.map +1 -0
- package/dist/synthesis/CoquiServerTTS.d.ts +6 -0
- package/dist/synthesis/CoquiServerTTS.js +22 -0
- package/dist/synthesis/CoquiServerTTS.js.map +1 -0
- package/dist/synthesis/ElevenLabsTTS.d.ts +8 -0
- package/dist/synthesis/ElevenLabsTTS.js +48 -0
- package/dist/synthesis/ElevenLabsTTS.js.map +1 -0
- package/dist/synthesis/EspeakTTS.d.ts +46 -0
- package/dist/synthesis/EspeakTTS.js +353 -0
- package/dist/synthesis/EspeakTTS.js.map +1 -0
- package/dist/synthesis/FliteTTS.d.ts +17 -0
- package/dist/synthesis/FliteTTS.js +326 -0
- package/dist/synthesis/FliteTTS.js.map +1 -0
- package/dist/synthesis/GoogleCloudTTS.d.ts +17 -0
- package/dist/synthesis/GoogleCloudTTS.js +72 -0
- package/dist/synthesis/GoogleCloudTTS.js.map +1 -0
- package/dist/synthesis/GoogleTranslateTTS.d.ts +13 -0
- package/dist/synthesis/GoogleTranslateTTS.js +177 -0
- package/dist/synthesis/GoogleTranslateTTS.js.map +1 -0
- package/dist/synthesis/MicrosoftEdgeTTS.d.ts +10 -0
- package/dist/synthesis/MicrosoftEdgeTTS.js +216 -0
- package/dist/synthesis/MicrosoftEdgeTTS.js.map +1 -0
- package/dist/synthesis/SamTTS.d.ts +4 -0
- package/dist/synthesis/SamTTS.js +21 -0
- package/dist/synthesis/SamTTS.js.map +1 -0
- package/dist/synthesis/SapiTTS.d.ts +9 -0
- package/dist/synthesis/SapiTTS.js +211 -0
- package/dist/synthesis/SapiTTS.js.map +1 -0
- package/dist/synthesis/StreamlabsPollyTTS.d.ts +12 -0
- package/dist/synthesis/StreamlabsPollyTTS.js +88 -0
- package/dist/synthesis/StreamlabsPollyTTS.js.map +1 -0
- package/dist/synthesis/SvoxPicoTTS.d.ts +11 -0
- package/dist/synthesis/SvoxPicoTTS.js +236 -0
- package/dist/synthesis/SvoxPicoTTS.js.map +1 -0
- package/dist/synthesis/VitsTTS.d.ts +27 -0
- package/dist/synthesis/VitsTTS.js +359 -0
- package/dist/synthesis/VitsTTS.js.map +1 -0
- package/dist/tests/Test.d.ts +1 -0
- package/dist/tests/Test.js +10 -0
- package/dist/tests/Test.js.map +1 -0
- package/dist/text-language-detection/FastTextLanguageDetection.d.ts +2 -0
- package/dist/text-language-detection/FastTextLanguageDetection.js +38 -0
- package/dist/text-language-detection/FastTextLanguageDetection.js.map +1 -0
- package/dist/text-language-detection/TinyLDLanguageDetection.d.ts +2 -0
- package/dist/text-language-detection/TinyLDLanguageDetection.js +12 -0
- package/dist/text-language-detection/TinyLDLanguageDetection.js.map +1 -0
- package/dist/utilities/BinaryArrayConversion.d.ts +15 -0
- package/dist/utilities/BinaryArrayConversion.js +115 -0
- package/dist/utilities/BinaryArrayConversion.js.map +1 -0
- package/dist/utilities/Compression.d.ts +4 -0
- package/dist/utilities/Compression.js +67 -0
- package/dist/utilities/Compression.js.map +1 -0
- package/dist/utilities/FileDownloader.d.ts +3 -0
- package/dist/utilities/FileDownloader.js +147 -0
- package/dist/utilities/FileDownloader.js.map +1 -0
- package/dist/utilities/FileSystem.d.ts +30 -0
- package/dist/utilities/FileSystem.js +141 -0
- package/dist/utilities/FileSystem.js.map +1 -0
- package/dist/utilities/Hashing.d.ts +10 -0
- package/dist/utilities/Hashing.js +169 -0
- package/dist/utilities/Hashing.js.map +1 -0
- package/dist/utilities/Locale.d.ts +9 -0
- package/dist/utilities/Locale.js +65 -0
- package/dist/utilities/Locale.js.map +1 -0
- package/dist/utilities/Logger.d.ts +11 -0
- package/dist/utilities/Logger.js +49 -0
- package/dist/utilities/Logger.js.map +1 -0
- package/dist/utilities/NdArrayUtilities.d.ts +3 -0
- package/dist/utilities/NdArrayUtilities.js +22 -0
- package/dist/utilities/NdArrayUtilities.js.map +1 -0
- package/dist/utilities/ObjectUtilities.d.ts +4 -0
- package/dist/utilities/ObjectUtilities.js +132 -0
- package/dist/utilities/ObjectUtilities.js.map +1 -0
- package/dist/utilities/OpenPromise.d.ts +6 -0
- package/dist/utilities/OpenPromise.js +12 -0
- package/dist/utilities/OpenPromise.js.map +1 -0
- package/dist/utilities/PackageManager.d.ts +4 -0
- package/dist/utilities/PackageManager.js +46 -0
- package/dist/utilities/PackageManager.js.map +1 -0
- package/dist/utilities/RandomGenerator.d.ts +35 -0
- package/dist/utilities/RandomGenerator.js +149 -0
- package/dist/utilities/RandomGenerator.js.map +1 -0
- package/dist/utilities/TarballMaker.d.ts +4 -0
- package/dist/utilities/TarballMaker.js +50 -0
- package/dist/utilities/TarballMaker.js.map +1 -0
- package/dist/utilities/Timeline.d.ts +20 -0
- package/dist/utilities/Timeline.js +110 -0
- package/dist/utilities/Timeline.js.map +1 -0
- package/dist/utilities/Timer.d.ts +13 -0
- package/dist/utilities/Timer.js +70 -0
- package/dist/utilities/Timer.js.map +1 -0
- package/dist/utilities/Utilities.d.ts +68 -0
- package/dist/utilities/Utilities.js +305 -0
- package/dist/utilities/Utilities.js.map +1 -0
- package/dist/utilities/WasmMemoryManager.d.ts +142 -0
- package/dist/utilities/WasmMemoryManager.js +407 -0
- package/dist/utilities/WasmMemoryManager.js.map +1 -0
- package/dist/utilities/WebReader.d.ts +1 -0
- package/dist/utilities/WebReader.js +47 -0
- package/dist/utilities/WebReader.js.map +1 -0
- package/dist/utilities/WikipediaReader.d.ts +1 -0
- package/dist/utilities/WikipediaReader.js +31 -0
- package/dist/utilities/WikipediaReader.js.map +1 -0
- package/dist/voice-activity-detection/SileroVAD.d.ts +13 -0
- package/dist/voice-activity-detection/SileroVAD.js +58 -0
- package/dist/voice-activity-detection/SileroVAD.js.map +1 -0
- package/dist/voice-activity-detection/WebRtcVAD.d.ts +3 -0
- package/dist/voice-activity-detection/WebRtcVAD.js +53 -0
- package/dist/voice-activity-detection/WebRtcVAD.js.map +1 -0
- package/docs/CLI.md +234 -0
- package/docs/Development.md +3 -0
- package/docs/Engines.md +80 -0
- package/docs/Licenses.md +37 -0
- package/docs/Options.md +192 -0
- package/docs/Roadmap.md +16 -0
- package/docs/Technical.md +72 -0
- package/package.json +119 -19
- package/cli.js +0 -3
package/dist/dsp/MFCC.js
ADDED
|
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAE/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAY,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAAmB,EAAE,UAAuB,EAAE;IAChF,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAA;IAC3B,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAA;IAElC,IAAI,SAAS,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE;QACxC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;KACrC;IAED,OAAO,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAA;IAE3C,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAmB,CAAA;IACtD,MAAM,YAAY,GAAG,OAAO,CAAC,YAAa,CAAA;IAE1C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAS,CAAA;IAElC,MAAM,cAAc,GAAG,OAAO,CAAC,cAAe,CAAA;IAC9C,MAAM,UAAU,GAAG,cAAc,GAAG,kBAAkB,CAAA;IACtD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAY,CAAA;IACxC,MAAM,SAAS,GAAG,WAAW,GAAG,kBAAkB,CAAA;IAElD,MAAM,eAAe,GAAG,OAAO,CAAC,eAAgB,CAAA;IAChD,MAAM,gBAAgB,GAAG,OAAO,CAAC,SAAU,CAAA;IAC3C,MAAM,gBAAgB,GAAG,OAAO,CAAC,SAAU,CAAA;IAE3C,MAAM,cAAc,GAAG,OAAO,CAAC,cAAe,CAAA;IAC9C,MAAM,eAAe,GAAG,OAAO,CAAC,eAAgB,CAAA;IAChD,MAAM,oBAAoB,GAAG,OAAO,CAAC,oBAAqB,CAAA;IAE1D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAO,CAAA;IAE9B,MAAM,CAAC,KAAK,CAAC,2CAA2C,kBAAkB,KAAK,CAAC,CAAA;IAChF,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAA;IAE9E,IAAI,KAAiB,CAAA;IAErB,IAAI,MAAM,IAAI,SAAS,EAAE;QACxB,IAAI,cAAc,GAAG,CAAC,EAAE;YACvB,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;YAC9B,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAA;SAChG;QAED,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;QACtC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,oBAAoB,CAAC,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAA;QAE1J,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;QACjD,MAAM,YAAY,GAAG,oBAAoB,CAAC,aAAa,EAAE,YAAY,CAAC,CAAA;QAEtE,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;KAClD;SAAM;QACN,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;KACtC;IAED,IAAI,OAAO,CAAC,SAAU,EAAE;QACvB,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAA;QAE/B,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;QACzE,KAAK,GAAG,iBAAiB,CAAA;QACzB,wDAAwD;KACxD;IAED,IAAI,eAAe,GAAG,CAAC,EAAE;QACxB,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;QACxC,KAAK,GAAG,cAAc,CAAC,KAAK,EAAE,eAAe,CAAC,CAAA;KAC9C;IAED,IAAI,oBAAoB,EAAE;QACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACzB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;SACX;KACD;IAED,MAAM,CAAC,GAAG,EAAE,CAAA;IAEZ,OAAO,KAAK,CAAA;AACb,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,aAA6B,EAAE,gBAAwB;IAC3F,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAC5C,MAAM,SAAS,GAAG,+BAA+B,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAA;IAEjF,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAA;IAE/F,OAAO,KAAK,CAAA;AACb,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,WAAyB,EAAE,gBAAwB,EAAE,SAAyB,EAAE,gBAAwC,aAAa;IACtK,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAA;IAEvC,IAAI,+BAAuC,CAAA;IAC3C,IAAI,kCAA0C,CAAA;IAE9C,IAAI,aAAa,IAAI,aAAa,EAAE;QACnC,+BAA+B,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAA;QACvE,kCAAkC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAA;KAC1E;SAAM;QACN,+BAA+B,GAAG,CAAC,CAAA;QACnC,kCAAkC,GAAG,CAAC,CAAA;KACtC;IAED,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,gBAAgB,CAAC,CAAA;IAE/C,KAAK,IAAI,gBAAgB,GAAG,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,EAAE,gBAAgB,EAAE,EAAE;QACvF,MAAM,YAAY,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAA;QAEhD,IAAI,GAAG,GAAG,CAAC,CAAA;QAEX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,cAAc,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;YACtC,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;YAC9C,iDAAiD;YAEjD,GAAG,IAAI,cAAc,GAAG,MAAM,CAAA;SAC9B;QAED,MAAM,mBAAmB,GAAG,gBAAgB,IAAI,CAAC,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,kCAAkC,CAAA;QAExH,oDAAoD;QACpD,IAAI,CAAC,gBAAgB,CAAC,GAAG,mBAAmB,GAAG,CAAC,GAAG,GAAG,CAAA,CAAC,4CAA4C;KACnG;IAED,OAAO,IAAI,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,gBAAwB,EAAE,YAAoB;IAC7F,MAAM,SAAS,GAAG,IAAI,KAAK,CAAe,gBAAgB,CAAC,CAAA;IAE3D,KAAK,IAAI,gBAAgB,GAAG,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,EAAE,gBAAgB,EAAE,EAAE;QACvF,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,YAAY,CAAC,CAAA;QAE1C,MAAM,eAAe,GAAG,IAAI,CAAC,EAAE,GAAG,gBAAgB,GAAG,YAAY,CAAA;QAEjE,KAAK,IAAI,YAAY,GAAG,CAAC,EAAE,YAAY,GAAG,YAAY,EAAE,YAAY,EAAE,EAAE;YACvE,GAAG,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC,CAAA;SACpE;QAED,SAAS,CAAC,gBAAgB,CAAC,GAAG,GAAG,CAAA;KACjC;IAED,OAAO,SAAS,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAAwB,EAAE,gBAAwB;IACrF,IAAI,UAAU,CAAC,MAAM,GAAG,gBAAgB,IAAI,CAAC,EAAE;QAC9C,MAAM,IAAI,KAAK,CAAC,uEAAuE,gBAAgB,GAAG,CAAC,CAAA;KAC3G;IAED,MAAM,WAAW,GAAe,EAAE,CAAA;IAElC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,IAAI,gBAAgB,EAAE;QAC5E,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAA;QAErF,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;KAC5B;IAED,OAAO,WAAW,CAAA;AACnB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAqB,EAAE,cAAc,GAAG,IAAI,EAAE,YAAY,GAAG,CAAC;IAC3F,MAAM,gBAAgB,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAEzD,gBAAgB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,GAAG,YAAY,CAAC,CAAA;IAElE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACjD,gBAAgB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;KACpE;IAED,OAAO,gBAAgB,CAAA;AACxB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAiB,EAAE,eAAuB;IACxE,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAEpC,MAAM,iBAAiB,GAAG,IAAI,YAAY,CAAC,YAAY,CAAC,CAAA;IAExD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE;QACtC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,CAAA;KAChG;IAED,MAAM,aAAa,GAAe,EAAE,CAAA;IAEpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACzB,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA;QAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE;YACtC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAA;SAChD;QAED,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;KAChC;IAED,OAAO,aAAa,CAAA;AACrB,CAAC;AAkBD,MAAM,CAAC,MAAM,kBAAkB,GAAgB;IAC9C,eAAe,EAAE,EAAE;IACnB,YAAY,EAAE,EAAE;IAChB,QAAQ,EAAE,GAAG;IACb,SAAS,EAAE,QAAQ;IACnB,SAAS,EAAE,SAAS;IACpB,cAAc,EAAE,KAAK;IACrB,WAAW,EAAE,KAAK;IAClB,cAAc,EAAE,IAAI;IACpB,kBAAkB,EAAE,KAAK;IACzB,eAAe,EAAE,CAAC;IAClB,SAAS,EAAE,KAAK;IAChB,oBAAoB,EAAE,KAAK;IAC3B,MAAM,EAAE,SAAS;CACjB,CAAA;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAoB;IAC5D,OAAO,UAAU,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAA;AAC/C,CAAC"}
|
|
@@ -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,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"}
|