echogarden 0.9.3 → 0.10.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 +3 -7
- package/data/schemas/options.json +57 -26
- package/dist/api/API.d.ts +2 -0
- package/dist/api/API.js +2 -0
- package/dist/api/API.js.map +1 -1
- package/dist/api/Alignment.d.ts +4 -4
- package/dist/api/Alignment.js +31 -31
- package/dist/api/Alignment.js.map +1 -1
- package/dist/api/Denoising.d.ts +9 -3
- package/dist/api/Denoising.js +9 -9
- package/dist/api/Denoising.js.map +1 -1
- package/dist/api/LanguageDetection.d.ts +13 -17
- package/dist/api/LanguageDetection.js +13 -17
- package/dist/api/LanguageDetection.js.map +1 -1
- package/dist/api/Recognition.d.ts +4 -4
- package/dist/api/Recognition.js +10 -12
- package/dist/api/Recognition.js.map +1 -1
- package/dist/api/Synthesis.d.ts +10 -6
- package/dist/api/Synthesis.js +61 -25
- package/dist/api/Synthesis.js.map +1 -1
- package/dist/api/Translation.d.ts +4 -4
- package/dist/api/Translation.js +11 -12
- package/dist/api/Translation.js.map +1 -1
- package/dist/api/Vad.d.ts +5 -8
- package/dist/api/Vad.js +12 -14
- package/dist/api/Vad.js.map +1 -1
- package/dist/audio/AudioPlayer.d.ts +1 -1
- package/dist/audio/AudioPlayer.js +12 -14
- package/dist/audio/AudioPlayer.js.map +1 -1
- package/dist/audio/AudioUtilities.d.ts +2 -0
- package/dist/audio/AudioUtilities.js +28 -0
- package/dist/audio/AudioUtilities.js.map +1 -1
- package/dist/audio/SoxPath.js +4 -0
- package/dist/audio/SoxPath.js.map +1 -1
- package/dist/cli/CLI.js +88 -124
- package/dist/cli/CLI.js.map +1 -1
- package/dist/codecs/FFMpegTranscoder.d.ts +1 -0
- package/dist/codecs/FFMpegTranscoder.js +48 -2
- package/dist/codecs/FFMpegTranscoder.js.map +1 -1
- package/dist/denoising/RNNoise.js.map +1 -1
- package/dist/dsp/MFCC.js.map +1 -1
- package/dist/recognition/WhisperSTT.js +2 -2
- package/dist/recognition/WhisperSTT.js.map +1 -1
- package/dist/server/Client.d.ts +10 -8
- package/dist/server/Client.js +56 -59
- package/dist/server/Client.js.map +1 -1
- package/dist/server/Server.d.ts +1 -1
- package/dist/server/Server.js +24 -13
- package/dist/server/Server.js.map +1 -1
- package/dist/server/ServerStarter.js +2 -2
- package/dist/server/ServerStarter.js.map +1 -1
- package/dist/server/Worker.d.ts +28 -11
- package/dist/server/Worker.js +45 -12
- package/dist/server/Worker.js.map +1 -1
- package/dist/speech-language-detection/SileroLanguageDetection.js +2 -2
- package/dist/speech-language-detection/SileroLanguageDetection.js.map +1 -1
- package/dist/synthesis/GoogleTranslateTTS.js.map +1 -1
- package/dist/synthesis/MicrosoftEdgeTTS.js +1 -1
- package/dist/synthesis/MicrosoftEdgeTTS.js.map +1 -1
- package/dist/synthesis/VitsTTS.js.map +1 -1
- package/dist/utilities/Logger.d.ts +2 -2
- package/dist/utilities/Logger.js +7 -9
- package/dist/utilities/Logger.js.map +1 -1
- package/dist/utilities/ObjectUtilities.js +4 -1
- package/dist/utilities/ObjectUtilities.js.map +1 -1
- package/dist/utilities/PackageManager.js +3 -1
- package/dist/utilities/PackageManager.js.map +1 -1
- package/dist/utilities/Timeline.js.map +1 -1
- package/docs/API.md +215 -0
- package/docs/Options.md +30 -23
- package/docs/Server.md +158 -0
- package/docs/Tasklist.md +4 -8
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -31,11 +31,9 @@ npm install echogarden -g
|
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
Additional tools:
|
|
34
|
-
* [`sox`](https://sourceforge.net/projects/sox/): used for the CLI's audio playback and recording
|
|
34
|
+
* [`sox`](https://sourceforge.net/projects/sox/): used for the CLI's audio playback and recording. Auto-installed via an expansion package on Windows, Intel macOS and x64 Linux. On ARM64 macOS, it is recommended to install it via a platform package manager like `brew`.
|
|
35
35
|
* [`ffmpeg`](https://ffmpeg.org/download.html): used for codec conversions. Auto-installed via an expansion package on Windows, Intel macOS, and x64 Linux. On ARM64 macOS, it is recommended to install it via a platform package manager like `brew`.
|
|
36
36
|
|
|
37
|
-
(hopefully in the future all platforms would be covered using expansion packages)
|
|
38
|
-
|
|
39
37
|
### Updating to latest version
|
|
40
38
|
|
|
41
39
|
```bash
|
|
@@ -53,6 +51,8 @@ Development of more graphical and interactive tooling is currently ongoing. A ge
|
|
|
53
51
|
* [Using the command-line interface](docs/CLI.md)
|
|
54
52
|
* [Options reference](docs/Options.md)
|
|
55
53
|
* [Full list of supported engines](docs/Engines.md)
|
|
54
|
+
* [Developer API reference](docs/API.md)
|
|
55
|
+
* [Starting and interfacing with a WebSocket server](docs/Server.md)
|
|
56
56
|
* [Technical overview and Q&A](docs/Technical.md)
|
|
57
57
|
* [Developer's task list](docs/Tasklist.md)
|
|
58
58
|
* [How to help](docs/Development.md)
|
|
@@ -63,8 +63,6 @@ _(For much more detailed information, see the [developer task list](docs/Tasklis
|
|
|
63
63
|
|
|
64
64
|
### In development
|
|
65
65
|
|
|
66
|
-
* (**90**%) Background worker
|
|
67
|
-
* (**90**%) WebSocket-based server and API
|
|
68
66
|
* (**70**%) Browser extension, acting as a bridge to a local or self-hosted server. Includes integration with the Web Speech API, and real-time narration of page content, with live word highlighting
|
|
69
67
|
* (**60**%) New, high-accuracy text language identification model (own work)
|
|
70
68
|
|
|
@@ -72,8 +70,6 @@ _(For much more detailed information, see the [developer task list](docs/Tasklis
|
|
|
72
70
|
|
|
73
71
|
* Web-based UI frontend
|
|
74
72
|
* Real-time, streaming speech recognition
|
|
75
|
-
* Official developer API (it's currently possible to import the `echogarden` npm package as a library, but the official API has not been published yet)
|
|
76
|
-
* Text enhancement, adding breaks to improve phrasing of synthesized text, as well as adding missing punctuation to recognized transcripts, if needed
|
|
77
73
|
|
|
78
74
|
### Future (maybe)
|
|
79
75
|
|
|
@@ -125,6 +125,26 @@
|
|
|
125
125
|
},
|
|
126
126
|
"additionalProperties": false
|
|
127
127
|
},
|
|
128
|
+
"outputAudioFormat": {
|
|
129
|
+
"type": "object",
|
|
130
|
+
"properties": {
|
|
131
|
+
"codec": {
|
|
132
|
+
"type": "string",
|
|
133
|
+
"enum": [
|
|
134
|
+
"wav",
|
|
135
|
+
"mp3",
|
|
136
|
+
"opus",
|
|
137
|
+
"m4a",
|
|
138
|
+
"ogg",
|
|
139
|
+
"flac"
|
|
140
|
+
]
|
|
141
|
+
},
|
|
142
|
+
"bitrate": {
|
|
143
|
+
"type": "number"
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
"additionalProperties": false
|
|
147
|
+
},
|
|
128
148
|
"languageDetection": {
|
|
129
149
|
"$ref": "#/definitions/TextLanguageDetectionOptions"
|
|
130
150
|
},
|
|
@@ -645,16 +665,7 @@
|
|
|
645
665
|
"additionalProperties": false
|
|
646
666
|
},
|
|
647
667
|
"whisper": {
|
|
648
|
-
"
|
|
649
|
-
"properties": {
|
|
650
|
-
"model": {
|
|
651
|
-
"$ref": "#/definitions/WhisperModelName"
|
|
652
|
-
}
|
|
653
|
-
},
|
|
654
|
-
"required": [
|
|
655
|
-
"model"
|
|
656
|
-
],
|
|
657
|
-
"additionalProperties": false
|
|
668
|
+
"$ref": "#/definitions/WhisperOptions"
|
|
658
669
|
}
|
|
659
670
|
},
|
|
660
671
|
"additionalProperties": false
|
|
@@ -666,22 +677,6 @@
|
|
|
666
677
|
"whisper"
|
|
667
678
|
]
|
|
668
679
|
},
|
|
669
|
-
"WhisperModelName": {
|
|
670
|
-
"type": "string",
|
|
671
|
-
"enum": [
|
|
672
|
-
"tiny",
|
|
673
|
-
"tiny.en",
|
|
674
|
-
"base",
|
|
675
|
-
"base.en",
|
|
676
|
-
"small",
|
|
677
|
-
"small.en",
|
|
678
|
-
"medium",
|
|
679
|
-
"medium.en",
|
|
680
|
-
"large",
|
|
681
|
-
"large-v1",
|
|
682
|
-
"large-v2"
|
|
683
|
-
]
|
|
684
|
-
},
|
|
685
680
|
"WhisperOptions": {
|
|
686
681
|
"type": "object",
|
|
687
682
|
"properties": {
|
|
@@ -703,6 +698,22 @@
|
|
|
703
698
|
},
|
|
704
699
|
"additionalProperties": false
|
|
705
700
|
},
|
|
701
|
+
"WhisperModelName": {
|
|
702
|
+
"type": "string",
|
|
703
|
+
"enum": [
|
|
704
|
+
"tiny",
|
|
705
|
+
"tiny.en",
|
|
706
|
+
"base",
|
|
707
|
+
"base.en",
|
|
708
|
+
"small",
|
|
709
|
+
"small.en",
|
|
710
|
+
"medium",
|
|
711
|
+
"medium.en",
|
|
712
|
+
"large",
|
|
713
|
+
"large-v1",
|
|
714
|
+
"large-v2"
|
|
715
|
+
]
|
|
716
|
+
},
|
|
706
717
|
"TimePitchShiftingMethod": {
|
|
707
718
|
"type": "string",
|
|
708
719
|
"enum": [
|
|
@@ -865,6 +876,26 @@
|
|
|
865
876
|
},
|
|
866
877
|
"additionalProperties": false
|
|
867
878
|
},
|
|
879
|
+
"outputAudioFormat": {
|
|
880
|
+
"type": "object",
|
|
881
|
+
"properties": {
|
|
882
|
+
"codec": {
|
|
883
|
+
"type": "string",
|
|
884
|
+
"enum": [
|
|
885
|
+
"wav",
|
|
886
|
+
"mp3",
|
|
887
|
+
"opus",
|
|
888
|
+
"m4a",
|
|
889
|
+
"ogg",
|
|
890
|
+
"flac"
|
|
891
|
+
]
|
|
892
|
+
},
|
|
893
|
+
"bitrate": {
|
|
894
|
+
"type": "number"
|
|
895
|
+
}
|
|
896
|
+
},
|
|
897
|
+
"additionalProperties": false
|
|
898
|
+
},
|
|
868
899
|
"languageDetection": {
|
|
869
900
|
"$ref": "#/definitions/TextLanguageDetectionOptions"
|
|
870
901
|
},
|
package/dist/api/API.d.ts
CHANGED
package/dist/api/API.js
CHANGED
package/dist/api/API.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"API.js","sourceRoot":"","sources":["../../src/api/API.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAEhD,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,wBAAwB,CAAA;AACtC,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"API.js","sourceRoot":"","sources":["../../src/api/API.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAEhD,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,wBAAwB,CAAA;AACtC,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA"}
|
package/dist/api/Alignment.d.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { RawAudio } from "../audio/AudioUtilities.js";
|
|
1
|
+
import { AudioSourceParam, RawAudio } from "../audio/AudioUtilities.js";
|
|
2
2
|
import * as API from "./API.js";
|
|
3
3
|
import { Timeline } from "../utilities/Timeline.js";
|
|
4
4
|
import { WhisperOptions } from "../recognition/WhisperSTT.js";
|
|
5
5
|
import { SubtitlesConfig } from "../subtitles/Subtitles.js";
|
|
6
|
-
export declare function
|
|
6
|
+
export declare function align(input: AudioSourceParam, transcript: string, options: AlignmentOptions): Promise<AlignmentResult>;
|
|
7
7
|
export declare function alignSegments(sourceRawAudio: RawAudio, segmentTimeline: Timeline, alignmentOptions: AlignmentOptions): Promise<Timeline>;
|
|
8
|
-
export declare function align(inputRawAudio: RawAudio, transcript: string, options: AlignmentOptions): Promise<AlignmentResult>;
|
|
9
8
|
export interface AlignmentResult {
|
|
9
|
+
timeline: Timeline;
|
|
10
10
|
wordTimeline: Timeline;
|
|
11
|
-
rawAudio: RawAudio;
|
|
12
11
|
transcript: string;
|
|
13
12
|
language: string;
|
|
13
|
+
inputRawAudio: RawAudio;
|
|
14
14
|
}
|
|
15
15
|
export type AlignmentEngine = "dtw" | "dtw-ra" | "whisper";
|
|
16
16
|
export type PhoneAlignmentMethod = "interpolation" | "dtw";
|
package/dist/api/Alignment.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { extendDeep } from "../utilities/ObjectUtilities.js";
|
|
2
|
-
import * as FFMpegTranscoder from "../codecs/FFMpegTranscoder.js";
|
|
3
2
|
import { logToStderr } from "../utilities/Utilities.js";
|
|
4
|
-
import { downmixToMonoAndNormalize, getRawAudioDuration } from "../audio/AudioUtilities.js";
|
|
3
|
+
import { downmixToMonoAndNormalize, ensureRawAudio, getRawAudioDuration, normalizeAudioLevel, trimAudioEnd } from "../audio/AudioUtilities.js";
|
|
5
4
|
import { Logger } from "../utilities/Logger.js";
|
|
6
5
|
import { resampleAudioSpeex } from "../dsp/SpeexResampler.js";
|
|
7
6
|
import * as API from "./API.js";
|
|
8
|
-
import { addTimeOffsetToTimeline } from "../utilities/Timeline.js";
|
|
7
|
+
import { addTimeOffsetToTimeline, addWordTextOffsetsToTimeline, wordTimelineToSegmentSentenceTimeline } from "../utilities/Timeline.js";
|
|
9
8
|
import { formatLanguageCodeWithName, getDefaultDialectForLanguageCodeIfPossible, getShortLanguageCode, normalizeLanguageCode } from "../utilities/Locale.js";
|
|
10
9
|
import { whisperOptionsDefaults } from "../recognition/WhisperSTT.js";
|
|
11
10
|
import chalk from "chalk";
|
|
@@ -13,37 +12,16 @@ import { createAlignmentReferenceUsingEspeakPreprocessed } from "../alignment/Sp
|
|
|
13
12
|
import { loadLexiconsForLanguage } from "../nlp/Lexicon.js";
|
|
14
13
|
import { defaultSubtitlesConfig } from "../subtitles/Subtitles.js";
|
|
15
14
|
const log = logToStderr;
|
|
16
|
-
export async function
|
|
17
|
-
const rawAudio = await FFMpegTranscoder.decodeToChannels(audioFilename);
|
|
18
|
-
return align(rawAudio, text, options);
|
|
19
|
-
}
|
|
20
|
-
export async function alignSegments(sourceRawAudio, segmentTimeline, alignmentOptions) {
|
|
21
|
-
const timeline = [];
|
|
22
|
-
for (const segmentEntry of segmentTimeline) {
|
|
23
|
-
const segmentText = segmentEntry.text;
|
|
24
|
-
const segmentStartTime = segmentEntry.startTime;
|
|
25
|
-
const segmentEndTime = segmentEntry.endTime;
|
|
26
|
-
const segmentStartSampleIndex = Math.floor(segmentStartTime * sourceRawAudio.sampleRate);
|
|
27
|
-
const segmentEndSampleIndex = Math.floor(segmentEndTime * sourceRawAudio.sampleRate);
|
|
28
|
-
const segmentAudioSamples = sourceRawAudio.audioChannels[0].slice(segmentStartSampleIndex, segmentEndSampleIndex);
|
|
29
|
-
const segmentRawAudio = {
|
|
30
|
-
audioChannels: [segmentAudioSamples],
|
|
31
|
-
sampleRate: sourceRawAudio.sampleRate
|
|
32
|
-
};
|
|
33
|
-
const { wordTimeline: mappedTimeline } = await align(segmentRawAudio, segmentText, alignmentOptions);
|
|
34
|
-
const segmentTimelineWithOffset = addTimeOffsetToTimeline(mappedTimeline, segmentStartTime);
|
|
35
|
-
timeline.push(...segmentTimelineWithOffset);
|
|
36
|
-
}
|
|
37
|
-
return timeline;
|
|
38
|
-
}
|
|
39
|
-
export async function align(inputRawAudio, transcript, options) {
|
|
15
|
+
export async function align(input, transcript, options) {
|
|
40
16
|
const logger = new Logger();
|
|
41
17
|
const startTimestamp = logger.getTimestamp();
|
|
42
18
|
logger.start("Prepare for alignment");
|
|
19
|
+
const inputRawAudio = await ensureRawAudio(input);
|
|
20
|
+
let sourceRawAudio = await ensureRawAudio(inputRawAudio, 16000, 1);
|
|
21
|
+
sourceRawAudio = normalizeAudioLevel(sourceRawAudio);
|
|
22
|
+
sourceRawAudio.audioChannels[0] = trimAudioEnd(sourceRawAudio.audioChannels[0], 0, -40);
|
|
43
23
|
options = extendDeep(defaultAlignmentOptions, options);
|
|
44
24
|
const dtwWindowDuration = options.dtw.windowDuration;
|
|
45
|
-
let sourceRawAudio = downmixToMonoAndNormalize(inputRawAudio);
|
|
46
|
-
sourceRawAudio = await resampleAudioSpeex(sourceRawAudio, 16000);
|
|
47
25
|
let language;
|
|
48
26
|
if (options.language) {
|
|
49
27
|
language = normalizeLanguageCode(options.language);
|
|
@@ -98,7 +76,7 @@ export async function align(inputRawAudio, transcript, options) {
|
|
|
98
76
|
};
|
|
99
77
|
const recognitionOptions = extendDeep(recognitionOptionsDefaults, options.recognition || {});
|
|
100
78
|
logger.end();
|
|
101
|
-
const {
|
|
79
|
+
const { wordTimeline: recognitionTimeline } = await API.recognize(sourceRawAudio, recognitionOptions);
|
|
102
80
|
const { referenceRawAudio, referenceTimeline } = await getAlignmentReference();
|
|
103
81
|
logger.end();
|
|
104
82
|
const phoneAlignmentMethod = options.dtw.phoneAlignmentMethod;
|
|
@@ -124,15 +102,37 @@ export async function align(inputRawAudio, transcript, options) {
|
|
|
124
102
|
throw new Error(`Engine '${options.engine}' is not supported`);
|
|
125
103
|
}
|
|
126
104
|
}
|
|
105
|
+
addWordTextOffsetsToTimeline(mappedTimeline, transcript);
|
|
106
|
+
const { segmentTimeline } = await wordTimelineToSegmentSentenceTimeline(mappedTimeline, transcript, language, options.plainText?.paragraphBreaks, options.plainText?.whitespace);
|
|
127
107
|
logger.end();
|
|
128
108
|
logger.logDuration(`Total alignment time`, startTimestamp, chalk.magentaBright);
|
|
129
109
|
return {
|
|
110
|
+
timeline: segmentTimeline,
|
|
130
111
|
wordTimeline: mappedTimeline,
|
|
131
|
-
|
|
112
|
+
inputRawAudio,
|
|
132
113
|
transcript,
|
|
133
114
|
language
|
|
134
115
|
};
|
|
135
116
|
}
|
|
117
|
+
export async function alignSegments(sourceRawAudio, segmentTimeline, alignmentOptions) {
|
|
118
|
+
const timeline = [];
|
|
119
|
+
for (const segmentEntry of segmentTimeline) {
|
|
120
|
+
const segmentText = segmentEntry.text;
|
|
121
|
+
const segmentStartTime = segmentEntry.startTime;
|
|
122
|
+
const segmentEndTime = segmentEntry.endTime;
|
|
123
|
+
const segmentStartSampleIndex = Math.floor(segmentStartTime * sourceRawAudio.sampleRate);
|
|
124
|
+
const segmentEndSampleIndex = Math.floor(segmentEndTime * sourceRawAudio.sampleRate);
|
|
125
|
+
const segmentAudioSamples = sourceRawAudio.audioChannels[0].slice(segmentStartSampleIndex, segmentEndSampleIndex);
|
|
126
|
+
const segmentRawAudio = {
|
|
127
|
+
audioChannels: [segmentAudioSamples],
|
|
128
|
+
sampleRate: sourceRawAudio.sampleRate
|
|
129
|
+
};
|
|
130
|
+
const { wordTimeline: mappedTimeline } = await align(segmentRawAudio, segmentText, alignmentOptions);
|
|
131
|
+
const segmentTimelineWithOffset = addTimeOffsetToTimeline(mappedTimeline, segmentStartTime);
|
|
132
|
+
timeline.push(...segmentTimelineWithOffset);
|
|
133
|
+
}
|
|
134
|
+
return timeline;
|
|
135
|
+
}
|
|
136
136
|
export const defaultAlignmentOptions = {
|
|
137
137
|
engine: "dtw",
|
|
138
138
|
language: undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Alignment.js","sourceRoot":"","sources":["../../src/api/Alignment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAE5D,OAAO,
|
|
1
|
+
{"version":3,"file":"Alignment.js","sourceRoot":"","sources":["../../src/api/Alignment.ts"],"names":[],"mappings":"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"}
|
package/dist/api/Denoising.d.ts
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
import { RawAudio } from "../audio/AudioUtilities.js";
|
|
1
|
+
import { AudioSourceParam, RawAudio } from "../audio/AudioUtilities.js";
|
|
2
2
|
import { EngineMetadata } from "./Common.js";
|
|
3
|
-
export declare function
|
|
4
|
-
|
|
3
|
+
export declare function denoise(input: AudioSourceParam, options: DenoisingOptions): Promise<{
|
|
4
|
+
denoisedAudio: RawAudio;
|
|
5
|
+
inputRawAudio: RawAudio;
|
|
6
|
+
}>;
|
|
7
|
+
export interface DenoisingResult {
|
|
8
|
+
denoisedAudio: RawAudio;
|
|
9
|
+
inputRawAudio: RawAudio;
|
|
10
|
+
}
|
|
5
11
|
export type DenoisingMethod = "rnnoise";
|
|
6
12
|
export interface DenoisingOptions {
|
|
7
13
|
method?: DenoisingMethod;
|
package/dist/api/Denoising.js
CHANGED
|
@@ -1,23 +1,19 @@
|
|
|
1
1
|
import { extendDeep } from "../utilities/ObjectUtilities.js";
|
|
2
|
-
import
|
|
3
|
-
import { applyGainDecibels, getAudioPeakDecibels, mixAudio, normalizeAudioLevel } from "../audio/AudioUtilities.js";
|
|
2
|
+
import { applyGainDecibels, ensureRawAudio, getAudioPeakDecibels, mixAudio, normalizeAudioLevel } from "../audio/AudioUtilities.js";
|
|
4
3
|
import { Logger } from "../utilities/Logger.js";
|
|
5
4
|
import { logToStderr } from "../utilities/Utilities.js";
|
|
6
5
|
import { resampleAudioSpeex } from "../dsp/SpeexResampler.js";
|
|
7
6
|
import chalk from "chalk";
|
|
8
7
|
const log = logToStderr;
|
|
9
|
-
export async function
|
|
10
|
-
const rawAudio = await FFMpegTranscoder.decodeToChannels(filename);
|
|
11
|
-
return denoise(rawAudio, options);
|
|
12
|
-
}
|
|
13
|
-
export async function denoise(rawAudio, options) {
|
|
8
|
+
export async function denoise(input, options) {
|
|
14
9
|
const logger = new Logger();
|
|
15
10
|
const startTime = logger.getTimestamp();
|
|
16
11
|
logger.start("Prepare for denoising");
|
|
17
12
|
options = extendDeep(defaultDenoisingOptions, options);
|
|
13
|
+
const inputRawAudio = await ensureRawAudio(input);
|
|
18
14
|
const processingSampleRate = 48000;
|
|
19
15
|
logger.start(`Resample audio to ${processingSampleRate} Hz`);
|
|
20
|
-
const resampledRawAudio = await resampleAudioSpeex(
|
|
16
|
+
const resampledRawAudio = await resampleAudioSpeex(inputRawAudio, processingSampleRate, 3);
|
|
21
17
|
logger.start(`Initialize ${options.method} module`);
|
|
22
18
|
let denoisedAudio;
|
|
23
19
|
switch (options.method) {
|
|
@@ -52,8 +48,12 @@ export async function denoise(rawAudio, options) {
|
|
|
52
48
|
denoisedAudio = applyGainDecibels(denoisedAudio, preMixPeakDb - postMixPeakDb);
|
|
53
49
|
}
|
|
54
50
|
logger.end();
|
|
51
|
+
logger.log('');
|
|
55
52
|
logger.logDuration("Total denoising time", startTime, chalk.magentaBright);
|
|
56
|
-
return
|
|
53
|
+
return {
|
|
54
|
+
denoisedAudio,
|
|
55
|
+
inputRawAudio
|
|
56
|
+
};
|
|
57
57
|
}
|
|
58
58
|
export const defaultDenoisingOptions = {
|
|
59
59
|
method: "rnnoise",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Denoising.js","sourceRoot":"","sources":["../../src/api/Denoising.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAE5D,OAAO,
|
|
1
|
+
{"version":3,"file":"Denoising.js","sourceRoot":"","sources":["../../src/api/Denoising.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,33 +1,29 @@
|
|
|
1
|
-
import { RawAudio } from "../audio/AudioUtilities.js";
|
|
1
|
+
import { AudioSourceParam, RawAudio } from "../audio/AudioUtilities.js";
|
|
2
2
|
import * as API from "./API.js";
|
|
3
|
-
import type
|
|
4
|
-
export declare function
|
|
3
|
+
import { type WhisperOptions } from "../recognition/WhisperSTT.js";
|
|
4
|
+
export declare function detectSpeechLanguage(input: AudioSourceParam, options: SpeechLanguageDetectionOptions): Promise<SpeechLanguageDetectionResult>;
|
|
5
|
+
export interface SpeechLanguageDetectionResult {
|
|
5
6
|
detectedLanguage: string;
|
|
6
7
|
detectedLanguageName: string;
|
|
7
|
-
detectedLanguageProbabilities:
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
detectedLanguageName: string;
|
|
12
|
-
detectedLanguageProbabilities: API.LanguageDetectionResults;
|
|
13
|
-
}>;
|
|
14
|
-
export declare function detectLanguageByParts(sourceRawAudio: RawAudio, getResultsForAudioPart: (audioPart: RawAudio) => Promise<LanguageDetectionResults>, audioPartDuration?: number, hopDuration?: number): Promise<API.LanguageDetectionResults>;
|
|
8
|
+
detectedLanguageProbabilities: LanguageDetectionResults;
|
|
9
|
+
inputRawAudio: RawAudio;
|
|
10
|
+
}
|
|
11
|
+
export declare function detectSpeechLanguageByParts(sourceRawAudio: RawAudio, getResultsForAudioPart: (audioPart: RawAudio) => Promise<LanguageDetectionResults>, audioPartDuration?: number, hopDuration?: number): Promise<API.LanguageDetectionResults>;
|
|
15
12
|
export type SpeechLanguageDetectionEngine = "silero" | "whisper";
|
|
16
13
|
export interface SpeechLanguageDetectionOptions {
|
|
17
14
|
engine?: SpeechLanguageDetectionEngine;
|
|
18
15
|
defaultLanguage?: string;
|
|
19
16
|
fallbackThresholdProbability?: number;
|
|
20
17
|
silero?: {};
|
|
21
|
-
whisper?:
|
|
22
|
-
model: WhisperModelName;
|
|
23
|
-
};
|
|
18
|
+
whisper?: WhisperOptions;
|
|
24
19
|
}
|
|
25
20
|
export declare const defaultSpeechLanguageDetectionOptions: SpeechLanguageDetectionOptions;
|
|
26
|
-
export declare function detectTextLanguage(
|
|
21
|
+
export declare function detectTextLanguage(input: string, options: TextLanguageDetectionOptions): Promise<TextLanguageDetectionResult>;
|
|
22
|
+
export interface TextLanguageDetectionResult {
|
|
27
23
|
detectedLanguage: string;
|
|
28
24
|
detectedLanguageName: string;
|
|
29
|
-
detectedLanguageProbabilities:
|
|
30
|
-
}
|
|
25
|
+
detectedLanguageProbabilities: LanguageDetectionResults;
|
|
26
|
+
}
|
|
31
27
|
export type LanguageDetectionResults = LanguageDetectionResultsEntry[];
|
|
32
28
|
export type LanguageDetectionResultsEntry = {
|
|
33
29
|
language: string;
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { deepClone, extendDeep } from "../utilities/ObjectUtilities.js";
|
|
2
|
-
import
|
|
3
|
-
import { downmixToMonoAndNormalize, getRawAudioDuration, sliceRawAudioByTime } from "../audio/AudioUtilities.js";
|
|
2
|
+
import { ensureRawAudio, getRawAudioDuration, normalizeAudioLevel, sliceRawAudioByTime, trimAudioEnd } from "../audio/AudioUtilities.js";
|
|
4
3
|
import { Logger } from "../utilities/Logger.js";
|
|
5
|
-
import { resampleAudioSpeex } from "../dsp/SpeexResampler.js";
|
|
6
4
|
import { logToStderr } from "../utilities/Utilities.js";
|
|
7
5
|
import path from "path";
|
|
8
6
|
import { formatLanguageCodeWithName, languageCodeToName } from "../utilities/Locale.js";
|
|
@@ -12,19 +10,17 @@ const log = logToStderr;
|
|
|
12
10
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
13
11
|
// Speech language detection
|
|
14
12
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
15
|
-
export async function
|
|
16
|
-
const rawAudio = await FFMpegTranscoder.decodeToChannels(filename);
|
|
17
|
-
return detectSpeechLanguage(rawAudio, options);
|
|
18
|
-
}
|
|
19
|
-
export async function detectSpeechLanguage(rawAudio, options) {
|
|
13
|
+
export async function detectSpeechLanguage(input, options) {
|
|
20
14
|
const logger = new Logger();
|
|
21
15
|
const startTime = logger.getTimestamp();
|
|
22
16
|
logger.start("Prepare for speech language detection");
|
|
17
|
+
const inputRawAudio = await ensureRawAudio(input);
|
|
18
|
+
let sourceRawAudio = await ensureRawAudio(inputRawAudio, 16000, 1);
|
|
19
|
+
sourceRawAudio = normalizeAudioLevel(sourceRawAudio);
|
|
20
|
+
sourceRawAudio.audioChannels[0] = trimAudioEnd(sourceRawAudio.audioChannels[0], 0, -40);
|
|
23
21
|
options = extendDeep(defaultSpeechLanguageDetectionOptions, options);
|
|
24
22
|
const defaultLanguage = options.defaultLanguage;
|
|
25
23
|
const fallbackThresholdProbability = options.fallbackThresholdProbability;
|
|
26
|
-
rawAudio = await resampleAudioSpeex(rawAudio, 16000);
|
|
27
|
-
rawAudio = downmixToMonoAndNormalize(rawAudio);
|
|
28
24
|
logger.start(`Initialize ${options.engine} module`);
|
|
29
25
|
let detectedLanguageProbabilities;
|
|
30
26
|
switch (options.engine) {
|
|
@@ -36,7 +32,7 @@ export async function detectSpeechLanguage(rawAudio, options) {
|
|
|
36
32
|
const modelPath = path.join(modelDir, "lang_classifier_95.onnx");
|
|
37
33
|
const languageDictionaryPath = path.join(modelDir, "lang_dict_95.json");
|
|
38
34
|
const languageGroupDictionaryPath = path.join(modelDir, "lang_group_dict_95.json");
|
|
39
|
-
const languageResults = await SileroLanguageDetection.detectLanguage(
|
|
35
|
+
const languageResults = await SileroLanguageDetection.detectLanguage(sourceRawAudio, modelPath, languageDictionaryPath, languageGroupDictionaryPath);
|
|
40
36
|
detectedLanguageProbabilities = languageResults;
|
|
41
37
|
break;
|
|
42
38
|
}
|
|
@@ -45,7 +41,7 @@ export async function detectSpeechLanguage(rawAudio, options) {
|
|
|
45
41
|
const whisperOptions = options.whisper;
|
|
46
42
|
const { modelName, modelDir, tokenizerDir } = await WhisperSTT.loadPackagesAndGetPaths(whisperOptions.model, undefined);
|
|
47
43
|
logger.end();
|
|
48
|
-
detectedLanguageProbabilities = await WhisperSTT.detectLanguage(
|
|
44
|
+
detectedLanguageProbabilities = await WhisperSTT.detectLanguage(sourceRawAudio, modelName, modelDir, tokenizerDir);
|
|
49
45
|
break;
|
|
50
46
|
}
|
|
51
47
|
default: {
|
|
@@ -62,9 +58,9 @@ export async function detectSpeechLanguage(rawAudio, options) {
|
|
|
62
58
|
}
|
|
63
59
|
logger.end();
|
|
64
60
|
logger.logDuration("\nTotal detection time", startTime, chalk.magentaBright);
|
|
65
|
-
return { detectedLanguage, detectedLanguageName: languageCodeToName(detectedLanguage), detectedLanguageProbabilities };
|
|
61
|
+
return { detectedLanguage, detectedLanguageName: languageCodeToName(detectedLanguage), detectedLanguageProbabilities, inputRawAudio };
|
|
66
62
|
}
|
|
67
|
-
export async function
|
|
63
|
+
export async function detectSpeechLanguageByParts(sourceRawAudio, getResultsForAudioPart, audioPartDuration = 30, hopDuration = 15) {
|
|
68
64
|
const logger = new Logger();
|
|
69
65
|
const audioDuration = getRawAudioDuration(sourceRawAudio);
|
|
70
66
|
const resultsForParts = [];
|
|
@@ -104,7 +100,7 @@ export const defaultSpeechLanguageDetectionOptions = {
|
|
|
104
100
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
105
101
|
// Text language detection
|
|
106
102
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
107
|
-
export async function detectTextLanguage(
|
|
103
|
+
export async function detectTextLanguage(input, options) {
|
|
108
104
|
const logger = new Logger();
|
|
109
105
|
options = extendDeep(defaultTextLanguageDetectionOptions, options);
|
|
110
106
|
const defaultLanguage = options.defaultLanguage;
|
|
@@ -115,13 +111,13 @@ export async function detectTextLanguage(text, options) {
|
|
|
115
111
|
case "tinyld": {
|
|
116
112
|
const { detectLanguage } = await import("../text-language-detection/TinyLDLanguageDetection.js");
|
|
117
113
|
logger.start("Detecting text language using tinyld");
|
|
118
|
-
detectedLanguageProbabilities = await detectLanguage(
|
|
114
|
+
detectedLanguageProbabilities = await detectLanguage(input);
|
|
119
115
|
break;
|
|
120
116
|
}
|
|
121
117
|
case "fasttext": {
|
|
122
118
|
const { detectLanguage } = await import("../text-language-detection/FastTextLanguageDetection.js");
|
|
123
119
|
logger.start("Detecting text language using FastText");
|
|
124
|
-
detectedLanguageProbabilities = await detectLanguage(
|
|
120
|
+
detectedLanguageProbabilities = await detectLanguage(input);
|
|
125
121
|
break;
|
|
126
122
|
}
|
|
127
123
|
default: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LanguageDetection.js","sourceRoot":"","sources":["../../src/api/LanguageDetection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAEvE,OAAO,
|
|
1
|
+
{"version":3,"file":"LanguageDetection.js","sourceRoot":"","sources":["../../src/api/LanguageDetection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { RawAudio } from "../audio/AudioUtilities.js";
|
|
1
|
+
import { AudioSourceParam, RawAudio } from "../audio/AudioUtilities.js";
|
|
2
2
|
import * as API from "./API.js";
|
|
3
3
|
import { Timeline } from "../utilities/Timeline.js";
|
|
4
4
|
import { type WhisperOptions } from "../recognition/WhisperSTT.js";
|
|
5
5
|
import { SubtitlesConfig } from "../subtitles/Subtitles.js";
|
|
6
|
-
export declare function
|
|
7
|
-
export declare function recognize(inputRawAudio: RawAudio, options: RecognitionOptions): Promise<RecognitionResult>;
|
|
6
|
+
export declare function recognize(input: AudioSourceParam, options: RecognitionOptions): Promise<RecognitionResult>;
|
|
8
7
|
export interface RecognitionResult {
|
|
9
8
|
transcript: string;
|
|
10
9
|
timeline: Timeline;
|
|
11
|
-
|
|
10
|
+
wordTimeline: Timeline;
|
|
12
11
|
language: string;
|
|
12
|
+
inputRawAudio: RawAudio;
|
|
13
13
|
}
|
|
14
14
|
export type RecognitionEngine = "whisper" | "vosk" | "silero" | "google-cloud" | "microsoft-azure" | "amazon-transcribe";
|
|
15
15
|
export interface RecognitionOptions {
|