echogarden 0.12.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -14
- package/data/schemas/options.json +398 -111
- package/dist/alignment/DTWMfccSequenceAlignment.d.ts +1 -1
- package/dist/alignment/DTWMfccSequenceAlignment.js +8 -8
- package/dist/alignment/DTWSequenceAlignment.d.ts +1 -1
- package/dist/alignment/DTWSequenceAlignment.js +1 -1
- package/dist/alignment/DTWSequenceAlignmentWindowed.d.ts +1 -1
- package/dist/alignment/DTWSequenceAlignmentWindowed.js +2 -2
- package/dist/alignment/LevenshteinSequenceAlignment.d.ts +1 -1
- package/dist/alignment/LevenshteinSequenceAlignment.js +1 -1
- package/dist/alignment/SpeechAlignment.d.ts +9 -10
- package/dist/alignment/SpeechAlignment.js +136 -105
- package/dist/alignment/SpeechAlignment.js.map +1 -1
- package/dist/api/API.d.ts +13 -12
- package/dist/api/API.js +14 -13
- package/dist/api/API.js.map +1 -1
- package/dist/api/APIOptions.d.ts +5 -4
- package/dist/api/Alignment.d.ts +15 -9
- package/dist/api/Alignment.js +88 -74
- package/dist/api/Alignment.js.map +1 -1
- package/dist/api/Common.js +1 -1
- package/dist/api/Denoising.d.ts +6 -6
- package/dist/api/Denoising.js +23 -23
- package/dist/api/Denoising.js.map +1 -1
- package/dist/api/LanguageDetection.d.ts +19 -12
- package/dist/api/LanguageDetection.js +88 -38
- package/dist/api/LanguageDetection.js.map +1 -1
- package/dist/api/Recognition.d.ts +16 -6
- package/dist/api/Recognition.js +129 -55
- package/dist/api/Recognition.js.map +1 -1
- package/dist/api/SourceSeparation.d.ts +17 -0
- package/dist/api/SourceSeparation.js +61 -0
- package/dist/api/SourceSeparation.js.map +1 -0
- package/dist/api/Synthesis.d.ts +18 -18
- package/dist/api/Synthesis.js +191 -164
- package/dist/api/Synthesis.js.map +1 -1
- package/dist/api/Translation.d.ts +19 -8
- package/dist/api/Translation.js +132 -35
- package/dist/api/Translation.js.map +1 -1
- package/dist/api/Vad.d.ts +10 -5
- package/dist/api/Vad.js +76 -38
- package/dist/api/Vad.js.map +1 -1
- package/dist/audio/AudioBufferConversion.d.ts +1 -1
- package/dist/audio/AudioBufferConversion.js +4 -4
- package/dist/audio/AudioPlayer.d.ts +1 -1
- package/dist/audio/AudioPlayer.js +26 -26
- package/dist/audio/AudioPlayer.js.map +1 -1
- package/dist/audio/AudioRecorder.d.ts +1 -1
- package/dist/audio/AudioRecorder.js +5 -5
- package/dist/audio/AudioUtilities.d.ts +13 -9
- package/dist/audio/AudioUtilities.js +86 -24
- package/dist/audio/AudioUtilities.js.map +1 -1
- package/dist/cli/CLI.d.ts +3 -3
- package/dist/cli/CLI.js +271 -162
- package/dist/cli/CLI.js.map +1 -1
- package/dist/cli/CLIConfigFile.js +8 -8
- package/dist/cli/CLILauncher.js +6 -6
- package/dist/cli/CLIOptionsSchema.js +2 -2
- package/dist/cli/CLIParser.js +5 -5
- package/dist/cli/CLIStarter.js +4 -4
- package/dist/codecs/FFMpegTranscoder.d.ts +2 -2
- package/dist/codecs/FFMpegTranscoder.js +37 -37
- package/dist/codecs/FFMpegTranscoder.js.map +1 -1
- package/dist/codecs/TIMITCodec.js +5 -5
- package/dist/codecs/WaveCodec.d.ts +1 -1
- package/dist/codecs/WaveCodec.js +22 -22
- package/dist/denoising/RNNoise.d.ts +1 -1
- package/dist/denoising/RNNoise.js +9 -9
- package/dist/dsp/BiquadFilter.d.ts +3 -2
- package/dist/dsp/BiquadFilter.js +18 -11
- package/dist/dsp/BiquadFilter.js.map +1 -1
- package/dist/dsp/DecayingPeakEstimator.d.ts +16 -0
- package/dist/dsp/DecayingPeakEstimator.js +23 -0
- package/dist/dsp/DecayingPeakEstimator.js.map +1 -0
- package/dist/dsp/FFT.d.ts +8 -4
- package/dist/dsp/FFT.js +76 -30
- package/dist/dsp/FFT.js.map +1 -1
- package/dist/dsp/KWeightingFilter.d.ts +9 -0
- package/dist/dsp/KWeightingFilter.js +40 -0
- package/dist/dsp/KWeightingFilter.js.map +1 -0
- package/dist/dsp/LoudnessEstimator.d.ts +21 -0
- package/dist/dsp/LoudnessEstimator.js +47 -0
- package/dist/dsp/LoudnessEstimator.js.map +1 -0
- package/dist/dsp/MFCC.d.ts +2 -2
- package/dist/dsp/MFCC.js +15 -15
- package/dist/dsp/MelSpectogram.d.ts +1 -1
- package/dist/dsp/MelSpectogram.js +6 -6
- package/dist/dsp/Rubberband.d.ts +11 -11
- package/dist/dsp/Rubberband.js +27 -27
- package/dist/dsp/Sonic.d.ts +1 -1
- package/dist/dsp/Sonic.js +3 -3
- package/dist/dsp/SpeexResampler.d.ts +1 -1
- package/dist/dsp/SpeexResampler.js +2 -2
- package/dist/math/VectorMath.d.ts +12 -8
- package/dist/math/VectorMath.js +35 -32
- package/dist/math/VectorMath.js.map +1 -1
- package/dist/nlp/ChineseSegmentation.js +2 -2
- package/dist/nlp/CompromiseNLP.js +3 -3
- package/dist/nlp/EspeakPhonemizer.js +30 -30
- package/dist/nlp/IPA.js +20 -20
- package/dist/nlp/JapaneseSegmentation.js +6 -6
- package/dist/nlp/Lexicon.d.ts +1 -1
- package/dist/nlp/Lexicon.js +7 -7
- package/dist/nlp/Segmentation.d.ts +3 -0
- package/dist/nlp/Segmentation.js +21 -14
- package/dist/nlp/Segmentation.js.map +1 -1
- package/dist/nlp/TextNormalizer.js +16 -16
- package/dist/recognition/AmazonTranscribeSTT.d.ts +2 -2
- package/dist/recognition/AmazonTranscribeSTT.js +13 -14
- package/dist/recognition/AmazonTranscribeSTT.js.map +1 -1
- package/dist/recognition/AzureCognitiveServicesSTT.js +5 -6
- package/dist/recognition/AzureCognitiveServicesSTT.js.map +1 -1
- package/dist/recognition/GoogleCloudSTT.d.ts +3 -3
- package/dist/recognition/GoogleCloudSTT.js +18 -18
- package/dist/recognition/OpenAICloudSTT.d.ts +19 -0
- package/dist/recognition/OpenAICloudSTT.js +81 -0
- package/dist/recognition/OpenAICloudSTT.js.map +1 -0
- package/dist/recognition/SileroSTT.d.ts +2 -2
- package/dist/recognition/SileroSTT.js +25 -25
- package/dist/recognition/VoskSTT.d.ts +2 -2
- package/dist/recognition/VoskSTT.js +8 -8
- package/dist/recognition/WhisperCppSTT.d.ts +88 -0
- package/dist/recognition/WhisperCppSTT.js +332 -0
- package/dist/recognition/WhisperCppSTT.js.map +1 -0
- package/dist/recognition/WhisperSTT.d.ts +49 -25
- package/dist/recognition/WhisperSTT.js +626 -481
- package/dist/recognition/WhisperSTT.js.map +1 -1
- package/dist/server/Client.d.ts +1 -1
- package/dist/server/Client.js +22 -22
- package/dist/server/Server.js +9 -9
- package/dist/server/Server.js.map +1 -1
- package/dist/server/Worker.d.ts +22 -22
- package/dist/server/Worker.js +36 -36
- package/dist/server/Worker.js.map +1 -1
- package/dist/server/WorkerStarter.js +2 -2
- package/dist/source-separation/MDXNetSourceSeparation.d.ts +11 -0
- package/dist/source-separation/MDXNetSourceSeparation.js +161 -0
- package/dist/source-separation/MDXNetSourceSeparation.js.map +1 -0
- package/dist/speech-language-detection/SileroLanguageDetection.d.ts +1 -1
- package/dist/speech-language-detection/SileroLanguageDetection.js +7 -7
- package/dist/subtitles/Subtitles.d.ts +10 -0
- package/dist/subtitles/Subtitles.js +2 -2
- package/dist/subtitles/Subtitles.js.map +1 -1
- package/dist/synthesis/AwsPollyTTS.d.ts +1 -1
- package/dist/synthesis/AwsPollyTTS.js +12 -12
- package/dist/synthesis/AzureCognitiveServicesTTS.js +7 -7
- package/dist/synthesis/CoquiServerTTS.js +10 -10
- package/dist/synthesis/CoquiServerTTS.js.map +1 -1
- package/dist/synthesis/ElevenlabsTTS.d.ts +23 -0
- package/dist/synthesis/ElevenlabsTTS.js +103 -0
- package/dist/synthesis/ElevenlabsTTS.js.map +1 -0
- package/dist/synthesis/EspeakTTS.d.ts +6 -5
- package/dist/synthesis/EspeakTTS.js +81 -69
- package/dist/synthesis/EspeakTTS.js.map +1 -1
- package/dist/synthesis/FliteTTS.d.ts +3 -3
- package/dist/synthesis/FliteTTS.js +154 -154
- package/dist/synthesis/FliteTTS.js.map +1 -1
- package/dist/synthesis/GoogleCloudTTS.d.ts +3 -3
- package/dist/synthesis/GoogleCloudTTS.js +17 -17
- package/dist/synthesis/GoogleCloudTTS.js.map +1 -1
- package/dist/synthesis/GoogleTranslateTTS.d.ts +1 -1
- package/dist/synthesis/GoogleTranslateTTS.js +103 -103
- package/dist/synthesis/MicrosoftEdgeTTS.d.ts +2 -2
- package/dist/synthesis/MicrosoftEdgeTTS.js +74 -74
- package/dist/synthesis/OpenAICloudTTS.d.ts +13 -0
- package/dist/synthesis/OpenAICloudTTS.js +169 -0
- package/dist/synthesis/OpenAICloudTTS.js.map +1 -0
- package/dist/synthesis/SamTTS.js +3 -3
- package/dist/synthesis/SapiTTS.d.ts +3 -3
- package/dist/synthesis/SapiTTS.js +26 -26
- package/dist/synthesis/StreamlabsPollyTTS.d.ts +2 -2
- package/dist/synthesis/StreamlabsPollyTTS.js +27 -27
- package/dist/synthesis/SvoxPicoTTS.d.ts +2 -2
- package/dist/synthesis/SvoxPicoTTS.js +65 -65
- package/dist/synthesis/SvoxPicoTTS.js.map +1 -1
- package/dist/synthesis/VitsTTS.d.ts +3 -3
- package/dist/synthesis/VitsTTS.js +378 -378
- package/dist/synthesis/VitsTTS.js.map +1 -1
- package/dist/tests/Test.js +2 -2
- package/dist/utilities/Compression.d.ts +5 -0
- package/dist/utilities/Compression.js +29 -13
- package/dist/utilities/Compression.js.map +1 -1
- package/dist/utilities/FileDownloader.d.ts +1 -1
- package/dist/utilities/FileDownloader.js +16 -16
- package/dist/utilities/FileSystem.js +7 -7
- package/dist/utilities/Locale.d.ts +7 -7
- package/dist/utilities/Locale.js +15 -15
- package/dist/utilities/Logger.js +3 -3
- package/dist/utilities/ObjectUtilities.js +19 -19
- package/dist/utilities/OpenPromise.js +2 -2
- package/dist/utilities/OpenPromise.js.map +1 -1
- package/dist/utilities/PackageManager.js +31 -0
- package/dist/utilities/PackageManager.js.map +1 -1
- package/dist/utilities/PathUtilities.js +8 -8
- package/dist/utilities/RandomGenerator.js +2 -2
- package/dist/utilities/SmoothEstimator.d.ts +8 -0
- package/dist/utilities/SmoothEstimator.js +25 -0
- package/dist/utilities/SmoothEstimator.js.map +1 -0
- package/dist/utilities/TarballMaker.js +8 -8
- package/dist/utilities/Timeline.d.ts +3 -2
- package/dist/utilities/Timeline.js +11 -11
- package/dist/utilities/Timeline.js.map +1 -1
- package/dist/utilities/Timer.js +4 -4
- package/dist/utilities/Utilities.d.ts +4 -0
- package/dist/utilities/Utilities.js +38 -15
- package/dist/utilities/Utilities.js.map +1 -1
- package/dist/utilities/WasmMemoryManager.js +7 -7
- package/dist/utilities/WebReader.js +23 -23
- package/dist/utilities/WikipediaReader.js +2 -2
- package/dist/voice-activity-detection/AdaptiveGateVAD.d.ts +28 -0
- package/dist/voice-activity-detection/AdaptiveGateVAD.js +138 -0
- package/dist/voice-activity-detection/AdaptiveGateVAD.js.map +1 -0
- package/dist/voice-activity-detection/SileroVAD.d.ts +1 -1
- package/dist/voice-activity-detection/SileroVAD.js +5 -5
- package/dist/voice-activity-detection/SileroVAD.js.map +1 -1
- package/dist/voice-activity-detection/WebRtcVAD.d.ts +1 -1
- package/dist/voice-activity-detection/WebRtcVAD.js +4 -4
- package/docs/API.md +29 -11
- package/docs/CLI.md +31 -7
- package/docs/Contributing.md +38 -0
- package/docs/Development.md +93 -19
- package/docs/Engines.md +28 -16
- package/docs/Licenses.md +4 -1
- package/docs/Options.md +158 -78
- package/docs/Releases.md +262 -0
- package/docs/Server.md +7 -7
- package/docs/Tasklist.md +95 -76
- package/docs/Technical.md +4 -4
- package/package.json +13 -14
- package/src/alignment/DTWMfccSequenceAlignment.ts +9 -9
- package/src/alignment/DTWSequenceAlignment.ts +2 -2
- package/src/alignment/DTWSequenceAlignmentWindowed.ts +3 -3
- package/src/alignment/LevenshteinSequenceAlignment.ts +2 -2
- package/src/alignment/SpeechAlignment.ts +204 -119
- package/src/api/API.ts +14 -13
- package/src/api/APIOptions.ts +12 -11
- package/src/api/Alignment.ts +147 -90
- package/src/api/Common.ts +1 -1
- package/src/api/Denoising.ts +28 -28
- package/src/api/LanguageDetection.ts +135 -48
- package/src/api/Recognition.ts +198 -59
- package/src/api/SourceSeparation.ts +99 -0
- package/src/api/Synthesis.ts +217 -181
- package/src/api/Translation.ts +193 -40
- package/src/api/Vad.ts +110 -41
- package/src/audio/AudioBufferConversion.ts +4 -4
- package/src/audio/AudioPlayer.ts +27 -27
- package/src/audio/AudioRecorder.ts +5 -5
- package/src/audio/AudioUtilities.ts +107 -24
- package/src/cli/CLI.ts +313 -164
- package/src/cli/CLIConfigFile.ts +8 -8
- package/src/cli/CLILauncher.ts +6 -6
- package/src/cli/CLIOptionsSchema.ts +2 -2
- package/src/cli/CLIParser.ts +5 -5
- package/src/cli/CLIStarter.ts +4 -4
- package/src/codecs/FFMpegTranscoder.ts +38 -38
- package/src/codecs/TIMITCodec.ts +5 -5
- package/src/codecs/WaveCodec.ts +22 -22
- package/src/denoising/RNNoise.ts +9 -9
- package/src/dsp/BiquadFilter.ts +19 -11
- package/src/dsp/DecayingPeakEstimator.ts +35 -0
- package/src/dsp/FFT.ts +103 -35
- package/src/dsp/KWeightingFilter.ts +43 -0
- package/src/dsp/LoudnessEstimator.ts +74 -0
- package/src/dsp/MFCC.ts +15 -15
- package/src/dsp/MelSpectogram.ts +7 -7
- package/src/dsp/Rubberband.ts +38 -38
- package/src/dsp/Sonic.ts +4 -4
- package/src/dsp/SpeexResampler.ts +2 -2
- package/src/math/VectorMath.ts +42 -33
- package/src/nlp/ChineseSegmentation.ts +3 -3
- package/src/nlp/CompromiseNLP.ts +3 -3
- package/src/nlp/EspeakPhonemizer.ts +30 -30
- package/src/nlp/IPA.ts +20 -20
- package/src/nlp/JapaneseSegmentation.ts +6 -6
- package/src/nlp/Lexicon.ts +8 -8
- package/src/nlp/Segmentation.ts +23 -14
- package/src/nlp/TextNormalizer.ts +16 -16
- package/src/recognition/AmazonTranscribeSTT.ts +16 -17
- package/src/recognition/AzureCognitiveServicesSTT.ts +8 -6
- package/src/recognition/GoogleCloudSTT.ts +21 -21
- package/src/recognition/OpenAICloudSTT.ts +142 -0
- package/src/recognition/SileroSTT.ts +26 -26
- package/src/recognition/VoskSTT.ts +10 -10
- package/src/recognition/WhisperCppSTT.ts +555 -0
- package/src/recognition/WhisperSTT.ts +760 -507
- package/src/server/Client.ts +23 -23
- package/src/server/Server.ts +9 -9
- package/src/server/Worker.ts +53 -53
- package/src/server/WorkerStarter.ts +2 -2
- package/src/source-separation/MDXNetSourceSeparation.ts +228 -0
- package/src/speech-language-detection/SileroLanguageDetection.ts +8 -8
- package/src/subtitles/Subtitles.ts +3 -3
- package/src/synthesis/AwsPollyTTS.ts +14 -14
- package/src/synthesis/AzureCognitiveServicesTTS.ts +10 -10
- package/src/synthesis/CoquiServerTTS.ts +10 -10
- package/src/synthesis/ElevenlabsTTS.ts +137 -0
- package/src/synthesis/EspeakTTS.ts +90 -71
- package/src/synthesis/FliteTTS.ts +157 -157
- package/src/synthesis/GoogleCloudTTS.ts +19 -19
- package/src/synthesis/GoogleTranslateTTS.ts +104 -104
- package/src/synthesis/MicrosoftEdgeTTS.ts +80 -80
- package/src/synthesis/OpenAICloudTTS.ts +196 -0
- package/src/synthesis/SamTTS.ts +3 -3
- package/src/synthesis/SapiTTS.ts +29 -29
- package/src/synthesis/StreamlabsPollyTTS.ts +29 -29
- package/src/synthesis/SvoxPicoTTS.ts +67 -67
- package/src/synthesis/VitsTTS.ts +380 -380
- package/src/tests/Test.ts +4 -4
- package/src/utilities/Compression.ts +34 -13
- package/src/utilities/FileDownloader.ts +19 -19
- package/src/utilities/FileSystem.ts +7 -7
- package/src/utilities/Locale.ts +22 -22
- package/src/utilities/Logger.ts +4 -4
- package/src/utilities/ObjectUtilities.ts +19 -19
- package/src/utilities/OpenPromise.ts +2 -2
- package/src/utilities/PackageManager.ts +40 -0
- package/src/utilities/PathUtilities.ts +8 -8
- package/src/utilities/RandomGenerator.ts +3 -3
- package/src/utilities/SmoothEstimator.ts +35 -0
- package/src/utilities/TarballMaker.ts +9 -9
- package/src/utilities/Timeline.ts +15 -13
- package/src/utilities/Timer.ts +4 -4
- package/src/utilities/Utilities.ts +49 -15
- package/src/utilities/WasmMemoryManager.ts +7 -7
- package/src/utilities/WebReader.ts +23 -23
- package/src/utilities/WikipediaReader.ts +2 -2
- package/src/voice-activity-detection/AdaptiveGateVAD.ts +202 -0
- package/src/voice-activity-detection/SileroVAD.ts +5 -5
- package/src/voice-activity-detection/WebRtcVAD.ts +5 -5
- package/dist/synthesis/ElevenLabsTTS.d.ts +0 -8
- package/dist/synthesis/ElevenLabsTTS.js +0 -82
- package/dist/synthesis/ElevenLabsTTS.js.map +0 -1
- package/src/synthesis/ElevenLabsTTS.ts +0 -104
package/dist/api/Vad.js
CHANGED
|
@@ -1,87 +1,125 @@
|
|
|
1
|
-
import { extendDeep } from
|
|
2
|
-
import { logToStderr } from
|
|
3
|
-
import { ensureRawAudio, } from
|
|
4
|
-
import { Logger } from
|
|
5
|
-
import path from
|
|
6
|
-
import { loadPackage } from
|
|
7
|
-
import chalk from
|
|
1
|
+
import { extendDeep } from '../utilities/ObjectUtilities.js';
|
|
2
|
+
import { logToStderr } from '../utilities/Utilities.js';
|
|
3
|
+
import { cropToTimeline, ensureRawAudio, } from '../audio/AudioUtilities.js';
|
|
4
|
+
import { Logger } from '../utilities/Logger.js';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { loadPackage } from '../utilities/PackageManager.js';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
8
|
const log = logToStderr;
|
|
9
9
|
export async function detectVoiceActivity(input, options) {
|
|
10
10
|
const logger = new Logger();
|
|
11
11
|
const startTimestamp = logger.getTimestamp();
|
|
12
|
-
logger.start(
|
|
12
|
+
logger.start('Prepare for voice activity detection');
|
|
13
13
|
const inputRawAudio = await ensureRawAudio(input);
|
|
14
14
|
let sourceRawAudio = await ensureRawAudio(inputRawAudio, 16000, 1);
|
|
15
15
|
options = extendDeep(defaultVADOptions, options);
|
|
16
16
|
logger.start(`Detect voice activity with ${options.engine}`);
|
|
17
|
-
|
|
18
|
-
let
|
|
17
|
+
const activityThreshold = options.activityThreshold;
|
|
18
|
+
let verboseTimeline;
|
|
19
19
|
switch (options.engine) {
|
|
20
|
-
case
|
|
21
|
-
const WebRtcVAD = await import(
|
|
20
|
+
case 'webrtc': {
|
|
21
|
+
const WebRtcVAD = await import('../voice-activity-detection/WebRtcVAD.js');
|
|
22
22
|
const webrtcOptions = options.webrtc;
|
|
23
|
-
frameProbabilities = await WebRtcVAD.detectVoiceActivity(sourceRawAudio, webrtcOptions.frameDuration);
|
|
24
|
-
frameDurationSeconds = webrtcOptions.frameDuration / 1000;
|
|
23
|
+
const frameProbabilities = await WebRtcVAD.detectVoiceActivity(sourceRawAudio, webrtcOptions.frameDuration);
|
|
24
|
+
const frameDurationSeconds = webrtcOptions.frameDuration / 1000;
|
|
25
|
+
verboseTimeline = frameProbabilitiesToTimeline(frameProbabilities, frameDurationSeconds, activityThreshold);
|
|
25
26
|
break;
|
|
26
27
|
}
|
|
27
|
-
case
|
|
28
|
-
const SileroVAD = await import(
|
|
28
|
+
case 'silero': {
|
|
29
|
+
const SileroVAD = await import('../voice-activity-detection/SileroVAD.js');
|
|
29
30
|
const sileroOptions = options.silero;
|
|
30
|
-
const modelDir = await loadPackage(
|
|
31
|
-
const modelPath = path.join(modelDir,
|
|
31
|
+
const modelDir = await loadPackage('silero-vad');
|
|
32
|
+
const modelPath = path.join(modelDir, 'silero-vad.onnx');
|
|
32
33
|
const frameDuration = sileroOptions.frameDuration;
|
|
33
|
-
frameProbabilities = await SileroVAD.detectVoiceActivity(sourceRawAudio, modelPath, frameDuration);
|
|
34
|
-
frameDurationSeconds = sileroOptions.frameDuration / 1000;
|
|
34
|
+
const frameProbabilities = await SileroVAD.detectVoiceActivity(sourceRawAudio, modelPath, frameDuration);
|
|
35
|
+
const frameDurationSeconds = sileroOptions.frameDuration / 1000;
|
|
36
|
+
verboseTimeline = frameProbabilitiesToTimeline(frameProbabilities, frameDurationSeconds, activityThreshold);
|
|
35
37
|
break;
|
|
36
38
|
}
|
|
37
|
-
case
|
|
38
|
-
const RNNoise = await import(
|
|
39
|
+
case 'rnnoise': {
|
|
40
|
+
const RNNoise = await import('../denoising/RNNoise.js');
|
|
41
|
+
const audio48k = await ensureRawAudio(sourceRawAudio, 48000, 1);
|
|
39
42
|
const rnnoiseOptions = options.rnnoise;
|
|
40
|
-
const { denoisedRawAudio, frameVadProbabilities } = await RNNoise.denoiseAudio(
|
|
41
|
-
frameDurationSeconds = 0.01;
|
|
42
|
-
frameProbabilities = frameVadProbabilities;
|
|
43
|
+
const { denoisedRawAudio, frameVadProbabilities } = await RNNoise.denoiseAudio(audio48k);
|
|
44
|
+
const frameDurationSeconds = 0.01;
|
|
45
|
+
const frameProbabilities = frameVadProbabilities;
|
|
46
|
+
verboseTimeline = frameProbabilitiesToTimeline(frameProbabilities, frameDurationSeconds, activityThreshold);
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
case 'adaptive-gate': {
|
|
50
|
+
const AdaptiveGateVAD = await import('../voice-activity-detection/AdaptiveGateVAD.js');
|
|
51
|
+
const adaptiveGateOptions = options.adaptiveGate;
|
|
52
|
+
verboseTimeline = await AdaptiveGateVAD.detectVoiceActivity(sourceRawAudio, adaptiveGateOptions);
|
|
43
53
|
break;
|
|
44
54
|
}
|
|
45
55
|
default: {
|
|
46
56
|
throw new Error(`Engine '${options.engine}' is not supported`);
|
|
47
57
|
}
|
|
48
58
|
}
|
|
59
|
+
const timeline = verboseTimeline.filter(entry => entry.text === 'active');
|
|
60
|
+
const croppedRawAudio = cropToTimeline(inputRawAudio, timeline);
|
|
61
|
+
logger.end();
|
|
62
|
+
logger.log('');
|
|
63
|
+
logger.logDuration(`Total voice activity detection time`, startTimestamp, chalk.magentaBright);
|
|
64
|
+
return { timeline, verboseTimeline, inputRawAudio, croppedRawAudio };
|
|
65
|
+
}
|
|
66
|
+
function frameProbabilitiesToTimeline(frameProbabilities, frameDurationSeconds, activityThreshold) {
|
|
49
67
|
const timeline = [];
|
|
50
68
|
for (let i = 0; i < frameProbabilities.length; i++) {
|
|
51
69
|
const frameProbability = frameProbabilities[i];
|
|
52
70
|
const startTime = i * frameDurationSeconds;
|
|
53
71
|
const endTime = (i + 1) * frameDurationSeconds;
|
|
54
|
-
if (frameProbability >=
|
|
55
|
-
if (timeline.length == 0 || timeline[timeline.length - 1].text ==
|
|
56
|
-
timeline.push({ type:
|
|
72
|
+
if (frameProbability >= activityThreshold) {
|
|
73
|
+
if (timeline.length == 0 || timeline[timeline.length - 1].text == 'inactive') {
|
|
74
|
+
timeline.push({ type: 'segment', text: 'active', startTime, endTime });
|
|
57
75
|
continue;
|
|
58
76
|
}
|
|
59
77
|
}
|
|
60
78
|
else {
|
|
61
|
-
if (timeline.length == 0 || timeline[timeline.length - 1].text ==
|
|
62
|
-
timeline.push({ type:
|
|
79
|
+
if (timeline.length == 0 || timeline[timeline.length - 1].text == 'active') {
|
|
80
|
+
timeline.push({ type: 'segment', text: 'inactive', startTime, endTime });
|
|
63
81
|
continue;
|
|
64
82
|
}
|
|
65
83
|
}
|
|
66
84
|
timeline[timeline.length - 1].endTime = endTime;
|
|
67
85
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
86
|
+
return timeline;
|
|
87
|
+
}
|
|
88
|
+
export function convertCroppedToUncroppedTimeline(timeline, uncropTimeline) {
|
|
89
|
+
for (const entry of timeline) {
|
|
90
|
+
entry.startTime = mapTimestampUsingUncropTimeline(entry.startTime, uncropTimeline);
|
|
91
|
+
entry.endTime = mapTimestampUsingUncropTimeline(entry.endTime, uncropTimeline);
|
|
92
|
+
if (entry.timeline) {
|
|
93
|
+
convertCroppedToUncroppedTimeline(entry.timeline, uncropTimeline);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export function mapTimestampUsingUncropTimeline(timeInCroppedAudio, uncropTimeline) {
|
|
98
|
+
let offsetInCroppedAudio = 0;
|
|
99
|
+
for (let i = 0; i < uncropTimeline.length; i++) {
|
|
100
|
+
const entry = uncropTimeline[i];
|
|
101
|
+
const entryDuration = entry.endTime - entry.startTime;
|
|
102
|
+
const endOffset = offsetInCroppedAudio + entryDuration;
|
|
103
|
+
if ((i === uncropTimeline.length - 1) ||
|
|
104
|
+
(timeInCroppedAudio >= offsetInCroppedAudio && timeInCroppedAudio < endOffset)) {
|
|
105
|
+
return entry.startTime + (timeInCroppedAudio - offsetInCroppedAudio);
|
|
106
|
+
}
|
|
107
|
+
offsetInCroppedAudio += entryDuration;
|
|
108
|
+
}
|
|
109
|
+
throw new Error(`Should not be reached`);
|
|
72
110
|
}
|
|
73
111
|
export const defaultVADOptions = {
|
|
74
|
-
engine:
|
|
112
|
+
engine: 'silero',
|
|
75
113
|
activityThreshold: 0.5,
|
|
76
114
|
webrtc: {
|
|
77
115
|
frameDuration: 30,
|
|
78
116
|
mode: 1
|
|
79
117
|
},
|
|
80
118
|
silero: {
|
|
81
|
-
modelPath: undefined,
|
|
82
119
|
frameDuration: 90,
|
|
83
120
|
},
|
|
84
|
-
rnnoise: {}
|
|
121
|
+
rnnoise: {},
|
|
122
|
+
adaptiveGate: {}
|
|
85
123
|
};
|
|
86
124
|
export const vadEngines = [
|
|
87
125
|
{
|
|
@@ -99,7 +137,7 @@ export const vadEngines = [
|
|
|
99
137
|
{
|
|
100
138
|
id: 'rnnoise',
|
|
101
139
|
name: 'RNNoise',
|
|
102
|
-
description:
|
|
140
|
+
description: `Uses RNNoise's internal speech probabilities as VAD metrics.`,
|
|
103
141
|
type: 'local'
|
|
104
142
|
}
|
|
105
143
|
];
|
package/dist/api/Vad.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Vad.js","sourceRoot":"","sources":["../../src/api/Vad.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAE5D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAA8B,cAAc,GAAG,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"Vad.js","sourceRoot":"","sources":["../../src/api/Vad.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
import { BitDepth, SampleFormat } from
|
|
2
|
+
import { BitDepth, SampleFormat } from '../codecs/WaveCodec.js';
|
|
3
3
|
export declare function encodeToAudioBuffer(audioChannels: Float32Array[], targetBitDepth?: BitDepth, targetSampleFormat?: SampleFormat): Buffer;
|
|
4
4
|
export declare function decodeToChannels(audioBuffer: Buffer, channelCount: number, sourceBitDepth: number, sourceSampleFormat: SampleFormat): Float32Array[];
|
|
5
5
|
export declare function uint8PcmToFloat32(input: Uint8Array): Float32Array;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import AlawMulaw from
|
|
1
|
+
import AlawMulaw from 'alawmulaw';
|
|
2
2
|
import * as BinaryArrayConversion from '../utilities/BinaryArrayConversion.js';
|
|
3
|
-
import { SampleFormat } from
|
|
3
|
+
import { SampleFormat } from '../codecs/WaveCodec.js';
|
|
4
4
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
5
5
|
// Low level audio sample conversions
|
|
6
6
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
@@ -179,7 +179,7 @@ export function float32ToInt32Pcm(input) {
|
|
|
179
179
|
export function interleaveChannels(channels) {
|
|
180
180
|
const channelCount = channels.length;
|
|
181
181
|
if (channelCount == 0) {
|
|
182
|
-
throw new Error(
|
|
182
|
+
throw new Error('Empty channel array received');
|
|
183
183
|
}
|
|
184
184
|
if (channelCount == 1) {
|
|
185
185
|
return channels[0];
|
|
@@ -197,7 +197,7 @@ export function interleaveChannels(channels) {
|
|
|
197
197
|
}
|
|
198
198
|
export function deInterleaveChannels(interleavedChannels, channelCount) {
|
|
199
199
|
if (channelCount == 0) {
|
|
200
|
-
throw new Error(
|
|
200
|
+
throw new Error('0 channel count received');
|
|
201
201
|
}
|
|
202
202
|
if (channelCount == 1) {
|
|
203
203
|
return [interleavedChannels];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RawAudio } from
|
|
1
|
+
import { RawAudio } from './AudioUtilities.js';
|
|
2
2
|
import { Timeline } from '../utilities/Timeline.js';
|
|
3
3
|
import { SignalChannel } from '../utilities/SignalChannel.js';
|
|
4
4
|
export declare function playAudioFileWithTimelineFile(audioFilename: string, timelineFileName: string, transcriptFileName?: string): Promise<void>;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { parentPort } from 'node:worker_threads';
|
|
2
2
|
import { spawn } from 'child_process';
|
|
3
|
-
import {
|
|
3
|
+
import { encodeRawAudioToWave, fadeAudioInOut, getRawAudioDuration, sliceRawAudioByTime } from './AudioUtilities.js';
|
|
4
4
|
import * as AudioBufferConversion from './AudioBufferConversion.js';
|
|
5
|
-
import * as FFMpegTranscoder from
|
|
6
|
-
import { Timer } from
|
|
5
|
+
import * as FFMpegTranscoder from '../codecs/FFMpegTranscoder.js';
|
|
6
|
+
import { Timer } from '../utilities/Timer.js';
|
|
7
7
|
import { getRandomHexString, waitTimeout, writeToStderr } from '../utilities/Utilities.js';
|
|
8
8
|
import { encodeToAudioBuffer } from './AudioBufferConversion.js';
|
|
9
9
|
import { OpenPromise } from '../utilities/OpenPromise.js';
|
|
@@ -20,7 +20,7 @@ export async function playAudioFileWithTimelineFile(audioFilename, timelineFileN
|
|
|
20
20
|
const timeline = await readAndParseJsonFile(timelineFileName);
|
|
21
21
|
let transcript;
|
|
22
22
|
if (transcriptFileName) {
|
|
23
|
-
transcript = await readFile(transcriptFileName,
|
|
23
|
+
transcript = await readFile(transcriptFileName, 'utf8');
|
|
24
24
|
}
|
|
25
25
|
await playAudioWithWordTimeline(rawAudio, timeline, transcript);
|
|
26
26
|
}
|
|
@@ -42,7 +42,7 @@ export async function playAudioWithWordTimeline(rawAudio, wordTimeline, transcri
|
|
|
42
42
|
const wordStartOffset = entry.startOffsetUtf16;
|
|
43
43
|
let wordEndOffset = entry.endOffsetUtf16;
|
|
44
44
|
if (wordStartOffset == null || wordEndOffset == null) {
|
|
45
|
-
//writeToStderr(` [No offset
|
|
45
|
+
//writeToStderr(` [No offset available for '${entry.text}'] `)
|
|
46
46
|
continue;
|
|
47
47
|
}
|
|
48
48
|
while (wordEndOffset < text.length &&
|
|
@@ -54,20 +54,20 @@ export async function playAudioWithWordTimeline(rawAudio, wordTimeline, transcri
|
|
|
54
54
|
transcriptOffset = wordEndOffset;
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
|
-
writeToStderr(
|
|
57
|
+
writeToStderr('\n');
|
|
58
58
|
const signalChannel = new SignalChannel();
|
|
59
59
|
const keypressListenerStartTimestamp = Date.now();
|
|
60
60
|
function keypressHandler(message) {
|
|
61
|
-
if (message.name ==
|
|
61
|
+
if (message.name == 'keypress' &&
|
|
62
62
|
message.key.name == 'return' &&
|
|
63
63
|
message.timestamp >= keypressListenerStartTimestamp) {
|
|
64
|
-
signalChannel.send(
|
|
64
|
+
signalChannel.send('abort');
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
parentPort?.on('message', keypressHandler);
|
|
68
68
|
await playAudioSamples(rawAudio, onTimePosition, signalChannel);
|
|
69
69
|
parentPort?.off('message', keypressHandler);
|
|
70
|
-
writeToStderr(
|
|
70
|
+
writeToStderr('\n');
|
|
71
71
|
}
|
|
72
72
|
export async function playAudioWithTimelinePhones(rawAudio, timeline) {
|
|
73
73
|
let wordIndex = 0;
|
|
@@ -76,7 +76,7 @@ export async function playAudioWithTimelinePhones(rawAudio, timeline) {
|
|
|
76
76
|
for (; wordIndex < timeline.length; wordIndex++) {
|
|
77
77
|
const wordEntry = timeline[wordIndex];
|
|
78
78
|
const phoneTimeline = wordEntry.timeline;
|
|
79
|
-
if (phoneTimeline.every(phoneEntry => phoneEntry.text ==
|
|
79
|
+
if (phoneTimeline.every(phoneEntry => phoneEntry.text == '')) {
|
|
80
80
|
continue;
|
|
81
81
|
}
|
|
82
82
|
for (; phoneIndex < phoneTimeline.length; phoneIndex++) {
|
|
@@ -90,13 +90,13 @@ export async function playAudioWithTimelinePhones(rawAudio, timeline) {
|
|
|
90
90
|
phoneIndex = 0;
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
|
-
writeToStderr(
|
|
93
|
+
writeToStderr('\n');
|
|
94
94
|
await playAudioSamples(rawAudio, onTimePosition);
|
|
95
|
-
writeToStderr(
|
|
95
|
+
writeToStderr('\n');
|
|
96
96
|
}
|
|
97
97
|
export async function playAudioPairWithTimelineInterleaved(rawAudio1, rawAudio2, timeline1, timeline2) {
|
|
98
98
|
if (timeline1.length != timeline2.length) {
|
|
99
|
-
throw new Error(
|
|
99
|
+
throw new Error('Timelines have different lengths');
|
|
100
100
|
}
|
|
101
101
|
for (let i = 0; i < timeline1.length; i++) {
|
|
102
102
|
writeToStderr(`${timeline1[i].text} `);
|
|
@@ -105,7 +105,7 @@ export async function playAudioPairWithTimelineInterleaved(rawAudio1, rawAudio2,
|
|
|
105
105
|
await playAudioSamples(sliceRawAudioByTime(rawAudio2, timeline2[i].startTime, timeline2[i].endTime));
|
|
106
106
|
await waitTimeout(500);
|
|
107
107
|
}
|
|
108
|
-
writeToStderr(
|
|
108
|
+
writeToStderr('\n');
|
|
109
109
|
}
|
|
110
110
|
export function playAudioSamples(rawAudio, onTimePosition, signalChannel, microFadeInOut = true) {
|
|
111
111
|
return new Promise(async (resolve, reject) => {
|
|
@@ -117,12 +117,12 @@ export function playAudioSamples(rawAudio, onTimePosition, signalChannel, microF
|
|
|
117
117
|
const audioDuration = getRawAudioDuration(rawAudio);
|
|
118
118
|
const playerSpawnedOpenPromise = new OpenPromise();
|
|
119
119
|
const soxPath = await tryResolvingSoxPath();
|
|
120
|
-
let aborted = false;
|
|
121
120
|
if (!soxPath) {
|
|
122
121
|
throw new Error(`Couldn't find or install the SoX utility. Please install the SoX utility on your system path to enable audio playback.`);
|
|
123
122
|
}
|
|
123
|
+
let aborted = false;
|
|
124
124
|
let streamToStdin = true;
|
|
125
|
-
if (process.platform ==
|
|
125
|
+
if (process.platform == 'darwin') {
|
|
126
126
|
streamToStdin = false;
|
|
127
127
|
}
|
|
128
128
|
let tempFilePath;
|
|
@@ -139,32 +139,32 @@ export function playAudioSamples(rawAudio, onTimePosition, signalChannel, microF
|
|
|
139
139
|
}
|
|
140
140
|
else {
|
|
141
141
|
tempFilePath = path.join(getAppTempDir(appName), `${getRandomHexString(16)}.wav`);
|
|
142
|
-
const waveFileBuffer =
|
|
142
|
+
const waveFileBuffer = encodeRawAudioToWave(rawAudio);
|
|
143
143
|
await outputFile(tempFilePath, waveFileBuffer);
|
|
144
144
|
playerProcess = spawn(soxPath, [tempFilePath, '-d'], {});
|
|
145
145
|
}
|
|
146
146
|
if (signalChannel) {
|
|
147
|
-
signalChannel.on(
|
|
147
|
+
signalChannel.on('abort', () => {
|
|
148
148
|
aborted = true;
|
|
149
149
|
playerProcess.kill('SIGKILL');
|
|
150
150
|
});
|
|
151
151
|
}
|
|
152
152
|
// Required to work around SoX bug:
|
|
153
|
-
playerProcess.stderr.on(
|
|
153
|
+
playerProcess.stderr.on('data', (data) => {
|
|
154
154
|
//writeToStderr(data.toString('utf-8'))
|
|
155
155
|
});
|
|
156
|
-
playerProcess.stdout.on(
|
|
156
|
+
playerProcess.stdout.on('data', (data) => {
|
|
157
157
|
//writeToStderr(data.toString('utf-8'))
|
|
158
158
|
});
|
|
159
|
-
playerProcess.once(
|
|
159
|
+
playerProcess.once('spawn', () => {
|
|
160
160
|
if (audioBuffer != undefined) {
|
|
161
161
|
playerProcess.stdin.write(audioBuffer);
|
|
162
162
|
playerProcess.stdin.end();
|
|
163
|
-
playerProcess.stdin.on(
|
|
163
|
+
playerProcess.stdin.on('error', () => { });
|
|
164
164
|
}
|
|
165
165
|
playerSpawnedOpenPromise.resolve(null);
|
|
166
166
|
});
|
|
167
|
-
playerProcess.once(
|
|
167
|
+
playerProcess.once('error', async (e) => {
|
|
168
168
|
await cleanup();
|
|
169
169
|
playerProcessClosed = true;
|
|
170
170
|
reject(e);
|
|
@@ -204,7 +204,7 @@ export function playAudioSamples_Speaker(rawAudio, onTimePosition, microFadeInOu
|
|
|
204
204
|
bitDepth: 16,
|
|
205
205
|
sampleRate: rawAudio.sampleRate,
|
|
206
206
|
});
|
|
207
|
-
speaker.on(
|
|
207
|
+
speaker.on('error', (e) => {
|
|
208
208
|
reject(e);
|
|
209
209
|
});
|
|
210
210
|
const bytesPerSecond = rawAudio.sampleRate * 2 * channelCount;
|
|
@@ -214,7 +214,7 @@ export function playAudioSamples_Speaker(rawAudio, onTimePosition, microFadeInOu
|
|
|
214
214
|
const audioDuration = byteCountToDuration(audioData.length);
|
|
215
215
|
let mpg123AudioBufferSize;
|
|
216
216
|
let mpg123AudioBufferDuration;
|
|
217
|
-
if (process.platform ==
|
|
217
|
+
if (process.platform == 'win32') {
|
|
218
218
|
mpg123AudioBufferSize = 65536;
|
|
219
219
|
mpg123AudioBufferDuration = byteCountToDuration(mpg123AudioBufferSize);
|
|
220
220
|
}
|
|
@@ -251,5 +251,5 @@ export function playAudioSamples_Speaker(rawAudio, onTimePosition, microFadeInOu
|
|
|
251
251
|
}
|
|
252
252
|
});
|
|
253
253
|
}
|
|
254
|
-
export const charactersToWriteAhead = [
|
|
254
|
+
export const charactersToWriteAhead = [',', '.', ',', '、', ':', ';', '。', ':', ';', '?', '!', ')', ']', '}', `"`, `'`, '”', '’', '-', '—', '»'];
|
|
255
255
|
//# sourceMappingURL=AudioPlayer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioPlayer.js","sourceRoot":"","sources":["../../src/audio/AudioPlayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,OAAO,EAAkC,KAAK,EAAE,MAAM,eAAe,CAAA;AAErE,OAAO,EAAY,
|
|
1
|
+
{"version":3,"file":"AudioPlayer.js","sourceRoot":"","sources":["../../src/audio/AudioPlayer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { RawAudio } from
|
|
1
|
+
import { RawAudio } from './AudioUtilities.js';
|
|
2
2
|
export declare function recordAudioInput(channelCount?: number, sampleRate?: number, maxTime?: number): Promise<RawAudio>;
|
|
3
3
|
export declare function captureAudioInput(channelCount?: number, sampleRate?: number, maxTime?: number, onAudioSamples?: (rawAudio: Float32Array[]) => void): Promise<void>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { spawn } from 'child_process';
|
|
2
|
-
import { concatAudioSegments } from
|
|
2
|
+
import { concatAudioSegments } from './AudioUtilities.js';
|
|
3
3
|
import * as AudioBufferConversion from './AudioBufferConversion.js';
|
|
4
|
-
import { Timer } from
|
|
4
|
+
import { Timer } from '../utilities/Timer.js';
|
|
5
5
|
import { logToStderr } from '../utilities/Utilities.js';
|
|
6
6
|
import { OpenPromise } from '../utilities/OpenPromise.js';
|
|
7
7
|
import { SampleFormat } from '../codecs/WaveCodec.js';
|
|
@@ -25,7 +25,7 @@ export function captureAudioInput(channelCount = 1, sampleRate = 48000, maxTime
|
|
|
25
25
|
const recorderSpawnedOpenPromise = new OpenPromise();
|
|
26
26
|
const soxPath = await tryResolvingSoxPath();
|
|
27
27
|
if (!soxPath) {
|
|
28
|
-
throw new Error(
|
|
28
|
+
throw new Error('Could not resolve a SoX executable');
|
|
29
29
|
}
|
|
30
30
|
let args;
|
|
31
31
|
if (process.platform == 'win32') {
|
|
@@ -39,10 +39,10 @@ export function captureAudioInput(channelCount = 1, sampleRate = 48000, maxTime
|
|
|
39
39
|
'-t', 'raw', '-'];
|
|
40
40
|
}
|
|
41
41
|
else {
|
|
42
|
-
throw new Error(
|
|
42
|
+
throw new Error('');
|
|
43
43
|
}
|
|
44
44
|
const recorder = spawn(soxPath, args, {});
|
|
45
|
-
recorder.once(
|
|
45
|
+
recorder.once('spawn', () => {
|
|
46
46
|
recorderSpawnedOpenPromise.resolve(null);
|
|
47
47
|
timer.restart();
|
|
48
48
|
});
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
import { SampleFormat, BitDepth } from
|
|
3
|
-
|
|
4
|
-
export declare function
|
|
2
|
+
import { SampleFormat, BitDepth } from '../codecs/WaveCodec.js';
|
|
3
|
+
import { Timeline } from '../utilities/Timeline.js';
|
|
4
|
+
export declare function encodeRawAudioToWave(rawAudio: RawAudio, bitDepth?: BitDepth, sampleFormat?: SampleFormat, speakerPositionMask?: number): Buffer;
|
|
5
|
+
export declare function decodeWaveToRawAudio(waveFileBuffer: Buffer, ignoreTruncatedChunks?: boolean): {
|
|
5
6
|
rawAudio: {
|
|
6
7
|
audioChannels: Float32Array[];
|
|
7
8
|
sampleRate: number;
|
|
@@ -14,25 +15,28 @@ export declare function trimAudioStart(audioSamples: Float32Array, targetStartSi
|
|
|
14
15
|
export declare function trimAudioEnd(audioSamples: Float32Array, targetEndSilentSampleCount?: number, amplitudeThresholdDecibels?: number): Float32Array;
|
|
15
16
|
export declare function getStartingSilentSampleCount(audioSamples: Float32Array, amplitudeThresholdDecibels?: number): number;
|
|
16
17
|
export declare function getEndingSilentSampleCount(audioSamples: Float32Array, amplitudeThresholdDecibels?: number): number;
|
|
17
|
-
export declare function downmixToMonoAndNormalize(rawAudio: RawAudio,
|
|
18
|
-
export declare function
|
|
18
|
+
export declare function downmixToMonoAndNormalize(rawAudio: RawAudio, targetPeakDecibels?: number): RawAudio;
|
|
19
|
+
export declare function attenuateIfClipping(rawAudio: RawAudio): RawAudio;
|
|
20
|
+
export declare function normalizeAudioLevel(rawAudio: RawAudio, targetPeakDecibels?: number, maxGainIncreaseDecibels?: number): RawAudio;
|
|
19
21
|
export declare function correctDCBias(rawAudio: RawAudio): RawAudio;
|
|
20
|
-
export declare function applyGainDecibels(rawAudio: RawAudio,
|
|
21
|
-
export declare function
|
|
22
|
+
export declare function applyGainDecibels(rawAudio: RawAudio, gainDecibels: number): RawAudio;
|
|
23
|
+
export declare function applyGainFactor(rawAudio: RawAudio, gainFactor: number): RawAudio;
|
|
22
24
|
export declare function downmixToMono(rawAudio: RawAudio): RawAudio;
|
|
23
|
-
export declare function
|
|
24
|
-
export declare function
|
|
25
|
+
export declare function getSamplePeakDecibels(audioChannels: Float32Array[]): number;
|
|
26
|
+
export declare function getSamplePeakAmplitude(audioChannels: Float32Array[]): number;
|
|
25
27
|
export declare function mixAudio(rawAudio1: RawAudio, rawAudio2: RawAudio): RawAudio;
|
|
26
28
|
export declare function sliceRawAudioByTime(rawAudio: RawAudio, startTime: number, endTime: number): RawAudio;
|
|
27
29
|
export declare function sliceRawAudio(rawAudio: RawAudio, startSampleIndex: number, endSampleIndex: number): RawAudio;
|
|
28
30
|
export declare function sliceAudioChannels(audioChannels: Float32Array[], startSampleIndex: number, endSampleIndex: number): Float32Array[];
|
|
29
31
|
export declare function concatAudioSegments(audioSegments: Float32Array[][]): Float32Array[];
|
|
32
|
+
export declare function cropToTimeline(rawAudio: RawAudio, timeline: Timeline): RawAudio;
|
|
30
33
|
export declare function fadeAudioInOut(rawAudio: RawAudio, fadeTime: number): RawAudio;
|
|
31
34
|
export declare function cloneRawAudio(rawAudio: RawAudio): RawAudio;
|
|
32
35
|
export declare function getSilentAudio(sampleCount: number, channelCount: number): Float32Array[];
|
|
33
36
|
export declare function getEmptyRawAudio(channelCount: number, sampleRate: number): RawAudio;
|
|
34
37
|
export declare function getRawAudioDuration(rawAudio: RawAudio): number;
|
|
35
38
|
export declare function ensureRawAudio(input: AudioSourceParam, outSampleRate?: number, outChannelCount?: number): Promise<RawAudio>;
|
|
39
|
+
export declare function subtractAudio(audio1: RawAudio, audio2: RawAudio): RawAudio;
|
|
36
40
|
export declare function gainFactorToDecibels(gainFactor: number): number;
|
|
37
41
|
export declare function decibelsToGainFactor(decibels: number): number;
|
|
38
42
|
export declare function powerToDecibels(power: number): number;
|