echogarden 0.11.12 → 0.11.13
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/data/schemas/options.json +16 -0
- package/dist/api/Alignment.js +2 -2
- package/dist/api/Alignment.js.map +1 -1
- package/dist/api/Recognition.js +2 -2
- package/dist/api/Recognition.js.map +1 -1
- package/dist/api/Synthesis.js +5 -4
- package/dist/api/Synthesis.js.map +1 -1
- package/dist/api/Translation.js +2 -2
- package/dist/api/Translation.js.map +1 -1
- package/dist/audio/AudioUtilities.d.ts +1 -0
- package/dist/audio/AudioUtilities.js +25 -7
- package/dist/audio/AudioUtilities.js.map +1 -1
- package/dist/cli/CLI.js +2 -2
- package/dist/cli/CLI.js.map +1 -1
- package/dist/recognition/WhisperSTT.js +2 -2
- package/dist/recognition/WhisperSTT.js.map +1 -1
- package/dist/subtitles/Subtitles.d.ts +10 -7
- package/dist/subtitles/Subtitles.js +268 -207
- package/dist/subtitles/Subtitles.js.map +1 -1
- package/docs/Options.md +4 -2
- package/package.json +7 -6
- package/src/alignment/DTWMfccSequenceAlignment.ts +43 -0
- package/src/alignment/DTWSequenceAlignment.ts +121 -0
- package/src/alignment/DTWSequenceAlignmentWindowed.ts +210 -0
- package/src/alignment/LevenshteinSequenceAlignment.ts +126 -0
- package/src/alignment/SpeechAlignment.ts +488 -0
- package/src/api/API.ts +12 -0
- package/src/api/APIOptions.ts +15 -0
- package/src/api/Alignment.ts +329 -0
- package/src/api/Common.ts +16 -0
- package/src/api/Denoising.ts +120 -0
- package/src/api/LanguageDetection.ts +286 -0
- package/src/api/Recognition.ts +344 -0
- package/src/api/Synthesis.ts +1735 -0
- package/src/api/Translation.ts +143 -0
- package/src/api/Vad.ts +172 -0
- package/src/audio/AudioBufferConversion.ts +248 -0
- package/src/audio/AudioPlayer.ts +358 -0
- package/src/audio/AudioRecorder.ts +91 -0
- package/src/audio/AudioUtilities.ts +392 -0
- package/src/audio/SoxPath.ts +24 -0
- package/src/cli/CLI.ts +1360 -0
- package/src/cli/CLIConfigFile.ts +91 -0
- package/src/cli/CLILauncher.ts +26 -0
- package/src/cli/CLIOptionsSchema.ts +54 -0
- package/src/cli/CLIParser.ts +41 -0
- package/src/cli/CLIStarter.ts +40 -0
- package/src/codecs/FFMpegTranscoder.ts +214 -0
- package/src/codecs/TIMITCodec.ts +17 -0
- package/src/codecs/WaveCodec.ts +260 -0
- package/src/denoising/RNNoise.ts +95 -0
- package/src/dsp/BiquadFilter.ts +488 -0
- package/src/dsp/FFT.ts +187 -0
- package/src/dsp/MFCC.ts +227 -0
- package/src/dsp/MelSpectogram.ts +145 -0
- package/src/dsp/Rubberband.ts +249 -0
- package/src/dsp/Sonic.ts +59 -0
- package/src/dsp/SpeexResampler.ts +79 -0
- package/src/math/VectorMath.ts +812 -0
- package/src/nlp/ChineseSegmentation.ts +68 -0
- package/src/nlp/CompromiseNLP.ts +113 -0
- package/src/nlp/EspeakPhonemizer.ts +168 -0
- package/src/nlp/IPA.ts +139 -0
- package/src/nlp/JapaneseSegmentation.ts +53 -0
- package/src/nlp/Lexicon.ts +119 -0
- package/src/nlp/PhoneConversion.ts +508 -0
- package/src/nlp/Segmentation.ts +237 -0
- package/src/nlp/TextNormalizer.ts +160 -0
- package/src/recognition/AmazonTranscribeSTT.ts +112 -0
- package/src/recognition/AzureCognitiveServicesSTT.ts +76 -0
- package/src/recognition/GoogleCloudSTT.ts +92 -0
- package/src/recognition/SileroSTT.ts +173 -0
- package/src/recognition/VoskSTT.ts +112 -0
- package/src/recognition/WhisperSTT.ts +1518 -0
- package/src/server/Client.ts +297 -0
- package/src/server/Server.ts +178 -0
- package/src/server/ServerStarter.ts +12 -0
- package/src/server/Worker.ts +400 -0
- package/src/server/WorkerStarter.ts +38 -0
- package/src/speech-language-detection/SileroLanguageDetection.ts +105 -0
- package/src/subtitles/Subtitles.ts +478 -0
- package/src/synthesis/AwsPollyTTS.ts +78 -0
- package/src/synthesis/AzureCognitiveServicesTTS.ts +146 -0
- package/src/synthesis/CoquiServerTTS.ts +29 -0
- package/src/synthesis/ElevenLabsTTS.ts +104 -0
- package/src/synthesis/EspeakTTS.ts +552 -0
- package/src/synthesis/FliteTTS.ts +387 -0
- package/src/synthesis/GoogleCloudTTS.ts +112 -0
- package/src/synthesis/GoogleTranslateTTS.ts +210 -0
- package/src/synthesis/MicrosoftEdgeTTS.ts +298 -0
- package/src/synthesis/SamTTS.ts +30 -0
- package/src/synthesis/SapiTTS.ts +222 -0
- package/src/synthesis/StreamlabsPollyTTS.ts +114 -0
- package/src/synthesis/SvoxPicoTTS.ts +318 -0
- package/src/synthesis/VitsTTS.ts +734 -0
- package/src/tests/Test.ts +24 -0
- package/src/text-language-detection/FastTextLanguageDetection.ts +53 -0
- package/src/text-language-detection/TinyLDLanguageDetection.ts +16 -0
- package/src/typings/Fillers.d.ts +41 -0
- package/src/utilities/BinaryArrayConversion.ts +159 -0
- package/src/utilities/Compression.ts +91 -0
- package/src/utilities/FileDownloader.ts +201 -0
- package/src/utilities/FileSystem.ts +265 -0
- package/src/utilities/Hashing.ts +230 -0
- package/src/utilities/Locale.ts +119 -0
- package/src/utilities/Logger.ts +72 -0
- package/src/utilities/NdArrayUtilities.ts +31 -0
- package/src/utilities/ObjectUtilities.ts +169 -0
- package/src/utilities/OpenPromise.ts +13 -0
- package/src/utilities/PackageManager.ts +97 -0
- package/src/utilities/Queue.ts +17 -0
- package/src/utilities/RandomGenerator.ts +237 -0
- package/src/utilities/SignalChannel.ts +22 -0
- package/src/utilities/TarballMaker.ts +68 -0
- package/src/utilities/Timeline.ts +231 -0
- package/src/utilities/Timer.ts +93 -0
- package/src/utilities/Utilities.ts +574 -0
- package/src/utilities/WasmMemoryManager.ts +516 -0
- package/src/utilities/WebReader.ts +55 -0
- package/src/utilities/WikipediaReader.ts +41 -0
- package/src/voice-activity-detection/SileroVAD.ts +86 -0
- package/src/voice-activity-detection/WebRtcVAD.ts +76 -0
|
@@ -1,286 +1,347 @@
|
|
|
1
1
|
import { convert as convertHtmlToText } from 'html-to-text';
|
|
2
|
-
import { formatHMS, formatMS, secondsToHMS, secondsToMS, startsWithAnyOf } from
|
|
2
|
+
import { formatHMS, formatMS, secondsToHMS, secondsToMS, startsWithAnyOf } from '../utilities/Utilities.js';
|
|
3
3
|
import { isWord, isWordOrSymbolWord } from '../nlp/Segmentation.js';
|
|
4
4
|
import { charactersToWriteAhead } from '../audio/AudioPlayer.js';
|
|
5
5
|
import { readFile } from '../utilities/FileSystem.js';
|
|
6
6
|
import { deepClone } from '../utilities/ObjectUtilities.js';
|
|
7
7
|
export async function subtitlesFileToText(filename) {
|
|
8
|
-
return subtitlesToText(await readFile(filename,
|
|
8
|
+
return subtitlesToText(await readFile(filename, 'utf8'));
|
|
9
9
|
}
|
|
10
10
|
export function subtitlesToText(subtitles) {
|
|
11
|
-
return subtitlesToTimeline(subtitles, true).map(entry => entry.text).join(
|
|
11
|
+
return subtitlesToTimeline(subtitles, true).map(entry => entry.text).join(' ');
|
|
12
12
|
}
|
|
13
13
|
export function subtitlesToTimeline(subtitles, removeMarkup = true) {
|
|
14
14
|
const lines = subtitles.split(/\r?\n/);
|
|
15
15
|
const timeline = [];
|
|
16
16
|
let isWithinCue = false;
|
|
17
|
+
// Parse lines of subtitles text
|
|
17
18
|
for (let line of lines) {
|
|
18
19
|
line = line.trim();
|
|
19
20
|
if (line.length == 0) {
|
|
20
21
|
isWithinCue = false;
|
|
21
22
|
continue;
|
|
22
23
|
}
|
|
23
|
-
|
|
24
|
-
const timeRangePatternWithHours = /^(\d+)\:(\d+)\:(\d+)[\.,](\d+)[ ]*-->[ ]*(\d+)\:(\d+)\:(\d+)[\.,](\d+)/;
|
|
25
|
-
const match = timeRangePatternWithHours.exec(line);
|
|
26
|
-
if (!match) {
|
|
27
|
-
return { startTime: -1, endTime: -1, succeeded: false };
|
|
28
|
-
}
|
|
29
|
-
const startHours = parseInt(match[1]);
|
|
30
|
-
const startMinutes = parseInt(match[2]);
|
|
31
|
-
const startSeconds = parseInt(match[3]);
|
|
32
|
-
const startMilliseconds = parseInt(match[4]);
|
|
33
|
-
const endHours = parseInt(match[5]);
|
|
34
|
-
const endMinutes = parseInt(match[6]);
|
|
35
|
-
const endSeconds = parseInt(match[7]);
|
|
36
|
-
const endMilliseconds = parseInt(match[8]);
|
|
37
|
-
const startTime = (startMilliseconds / 1000) + (startSeconds) + (startMinutes * 60) + (startHours * 60 * 60);
|
|
38
|
-
const endTime = (endMilliseconds / 1000) + (endSeconds) + (endMinutes * 60) + (endHours * 60 * 60);
|
|
39
|
-
return { startTime, endTime, succeeded: true };
|
|
40
|
-
}
|
|
41
|
-
function tryParseTimeRangePatternWithoutHours() {
|
|
42
|
-
const timeRangePatternWithHours = /^(\d+)\:(\d+)[\.,](\d+)[ ]*-->[ ]*(\d+)\:(\d+)[\.,](\d+)/;
|
|
43
|
-
const match = timeRangePatternWithHours.exec(line);
|
|
44
|
-
if (!match) {
|
|
45
|
-
return { startTime: -1, endTime: -1, succeeded: false };
|
|
46
|
-
}
|
|
47
|
-
const startMinutes = parseInt(match[1]);
|
|
48
|
-
const startSeconds = parseInt(match[2]);
|
|
49
|
-
const startMilliseconds = parseInt(match[3]);
|
|
50
|
-
const endMinutes = parseInt(match[4]);
|
|
51
|
-
const endSeconds = parseInt(match[5]);
|
|
52
|
-
const endMilliseconds = parseInt(match[6]);
|
|
53
|
-
const startTime = (startMilliseconds / 1000) + (startSeconds) + (startMinutes * 60);
|
|
54
|
-
const endTime = (endMilliseconds / 1000) + (endSeconds) + (endMinutes * 60);
|
|
55
|
-
return { startTime, endTime, succeeded: true };
|
|
56
|
-
}
|
|
57
|
-
let result = tryParseTimeRangePatternWithHours();
|
|
24
|
+
let result = tryParseTimeRangePatternWithHours(line);
|
|
58
25
|
if (!result.succeeded) {
|
|
59
|
-
result = tryParseTimeRangePatternWithoutHours();
|
|
26
|
+
result = tryParseTimeRangePatternWithoutHours(line);
|
|
60
27
|
}
|
|
61
28
|
if (result.succeeded) {
|
|
62
29
|
timeline.push({
|
|
63
|
-
type:
|
|
30
|
+
type: 'segment',
|
|
64
31
|
startTime: result.startTime,
|
|
65
32
|
endTime: result.endTime,
|
|
66
|
-
text:
|
|
33
|
+
text: ''
|
|
67
34
|
});
|
|
68
35
|
isWithinCue = true;
|
|
69
36
|
}
|
|
70
37
|
else if (isWithinCue && timeline.length > 0) {
|
|
71
38
|
const lastEntry = timeline[timeline.length - 1];
|
|
72
|
-
if (lastEntry.text ==
|
|
39
|
+
if (lastEntry.text == '') {
|
|
73
40
|
lastEntry.text = line;
|
|
74
41
|
}
|
|
75
42
|
else {
|
|
76
|
-
lastEntry.text +=
|
|
43
|
+
lastEntry.text += ' ' + line;
|
|
77
44
|
}
|
|
78
45
|
}
|
|
79
46
|
}
|
|
80
47
|
if (!removeMarkup) {
|
|
81
48
|
return timeline;
|
|
82
49
|
}
|
|
83
|
-
|
|
50
|
+
// Remove markup in each entry text
|
|
51
|
+
const timelineWithoutMarkup = timeline.map((entry) => {
|
|
84
52
|
let plainText = entry.text;
|
|
85
|
-
plainText = plainText.replaceAll(/<[^>]*>/g,
|
|
53
|
+
plainText = plainText.replaceAll(/<[^>]*>/g, '');
|
|
86
54
|
plainText = convertHtmlToText(plainText, { wordwrap: false });
|
|
87
|
-
plainText = plainText.replaceAll(/\s+/g,
|
|
55
|
+
plainText = plainText.replaceAll(/\s+/g, ' ').trim();
|
|
88
56
|
return { ...entry, text: plainText };
|
|
89
57
|
});
|
|
90
|
-
return
|
|
58
|
+
return timelineWithoutMarkup;
|
|
91
59
|
}
|
|
92
|
-
export function timelineToSubtitles(timeline, subtitlesConfig
|
|
60
|
+
export function timelineToSubtitles(timeline, subtitlesConfig) {
|
|
61
|
+
// Prepare subtitle configuration
|
|
93
62
|
timeline = deepClone(timeline);
|
|
94
63
|
let config = subtitlesConfig || {};
|
|
95
|
-
if (config.format && config.format ==
|
|
96
|
-
config = { ...
|
|
64
|
+
if (config.format && config.format == 'webvtt') {
|
|
65
|
+
config = { ...defaultSubtitlesBaseConfig, ...webVttConfigExtension, ...config };
|
|
97
66
|
}
|
|
98
67
|
else {
|
|
99
|
-
config = { ...
|
|
68
|
+
config = { ...defaultSubtitlesBaseConfig, ...srtConfigExtension, ...config };
|
|
100
69
|
}
|
|
70
|
+
// Initialize subtitle file content
|
|
101
71
|
const lineBreakString = config.lineBreakString;
|
|
102
|
-
let
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
result += `WEBVTT${lineBreakString}Kind: captions${lineBreakString}`;
|
|
72
|
+
let outText = '';
|
|
73
|
+
if (config.format == 'webvtt') {
|
|
74
|
+
outText += `WEBVTT${lineBreakString}Kind: captions${lineBreakString}`;
|
|
106
75
|
if (config.language) {
|
|
107
|
-
|
|
76
|
+
outText += `Language: ${config.language}${lineBreakString}`;
|
|
108
77
|
}
|
|
109
|
-
|
|
78
|
+
outText += lineBreakString;
|
|
110
79
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
if
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
formattedEndTime = formatHMS(secondsToHMS(cue.endTime), config.decimalSeparator);
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
formattedStartTime = formatMS(secondsToMS(cue.startTime), config.decimalSeparator);
|
|
126
|
-
formattedEndTime = formatMS(secondsToMS(cue.endTime), config.decimalSeparator);
|
|
80
|
+
// Generate the cues from the given timeline
|
|
81
|
+
let cues;
|
|
82
|
+
if (config.kind == 'segment' || config.kind == 'sentence') {
|
|
83
|
+
cues = getCuesFromTimeline_IsolateSegmentSentence(timeline, config);
|
|
84
|
+
// Extend cue end times to maximum duration set, if possible
|
|
85
|
+
if (config.maxAddedDuration > 0) {
|
|
86
|
+
for (let i = 1; i < cues.length; i++) {
|
|
87
|
+
const currentCue = cues[i];
|
|
88
|
+
const previousCue = cues[i - 1];
|
|
89
|
+
previousCue.endTime = Math.min(previousCue.endTime + config.maxAddedDuration, currentCue.startTime);
|
|
90
|
+
}
|
|
127
91
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
92
|
+
}
|
|
93
|
+
else if (config.kind == 'word' || config.kind == 'phone' || config.kind == 'word-phone') {
|
|
94
|
+
cues = getCuesFromTimeline_IsolateWordPhone(timeline, config);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
throw new Error('Invalid subtitles mode.');
|
|
98
|
+
}
|
|
99
|
+
// Write cues to output text
|
|
100
|
+
for (let cueIndex = 0; cueIndex < cues.length; cueIndex++) {
|
|
101
|
+
outText += cueObjectToText(cues[cueIndex], cueIndex + 1, config);
|
|
102
|
+
}
|
|
103
|
+
return outText;
|
|
104
|
+
}
|
|
105
|
+
// Generates subtitle cues from timeline. Ensures each segment or sentence starts in a new cue.
|
|
106
|
+
function getCuesFromTimeline_IsolateSegmentSentence(timeline, config) {
|
|
107
|
+
if (timeline.length == 0) {
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
// If the given timeline is a word timeline, wrap it with a segment and call again
|
|
111
|
+
if (timeline[0].type == 'word') {
|
|
112
|
+
const wordTimeline = timeline.filter(entry => isWordOrSymbolWord(entry.text));
|
|
113
|
+
const text = wordTimeline.map(entry => entry.text).join(' ');
|
|
114
|
+
const segmentEntry = {
|
|
115
|
+
type: 'segment',
|
|
116
|
+
text: text,
|
|
117
|
+
startTime: wordTimeline[0].startTime,
|
|
118
|
+
endTime: wordTimeline[wordTimeline.length - 1].endTime,
|
|
119
|
+
timeline: wordTimeline
|
|
120
|
+
};
|
|
121
|
+
return getCuesFromTimeline_IsolateSegmentSentence([segmentEntry], config);
|
|
134
122
|
}
|
|
135
123
|
const cues = [];
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
text: text,
|
|
146
|
-
startTime: wordTimeline[0].startTime,
|
|
147
|
-
endTime: wordTimeline[wordTimeline.length - 1].endTime,
|
|
148
|
-
timeline: wordTimeline
|
|
149
|
-
};
|
|
150
|
-
addCuesFromTimeline([segmentEntry], recurse);
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
for (const entry of timeline) {
|
|
154
|
-
if (entry.type == 'segment' && entry.timeline?.[0].type == 'sentence') {
|
|
155
|
-
addCuesFromTimeline(entry.timeline, recurse);
|
|
124
|
+
// Generate one or more cues from each segment or sentence in the timeline.
|
|
125
|
+
for (let entry of timeline) {
|
|
126
|
+
if (entry.type == 'segment' && entry.timeline?.[0].type == 'sentence') {
|
|
127
|
+
if (config.kind == 'segment') {
|
|
128
|
+
// If the mode is 'segment', flatten all sentences to a single word timeline
|
|
129
|
+
entry.timeline = entry.timeline.flatMap(t => t.timeline);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
cues.push(...getCuesFromTimeline_IsolateSegmentSentence(entry.timeline, config));
|
|
156
133
|
continue;
|
|
157
134
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
135
|
+
}
|
|
136
|
+
const entryText = entry.text;
|
|
137
|
+
const maxLineWidth = config.maxLineWidth;
|
|
138
|
+
if (entryText.length <= maxLineWidth) {
|
|
139
|
+
cues.push({
|
|
140
|
+
lines: [entryText],
|
|
141
|
+
startTime: entry.startTime,
|
|
142
|
+
endTime: entry.endTime
|
|
143
|
+
});
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (!entry.timeline || entry.timeline?.[0]?.type != 'word') {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const wordTimeline = entry.timeline.filter(entry => isWord(entry.text));
|
|
150
|
+
// First, add word start and end offsets for all word entries
|
|
151
|
+
let lastWordEndOffset = 0;
|
|
152
|
+
for (const wordEntry of wordTimeline) {
|
|
153
|
+
const wordStartOffset = entryText.indexOf(wordEntry.text, lastWordEndOffset);
|
|
154
|
+
if (wordStartOffset == -1) {
|
|
155
|
+
throw new Error(`Couldn't find word '${wordEntry.text}' in its parent entry text`);
|
|
166
156
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
157
|
+
let wordEndOffset = wordStartOffset + wordEntry.text.length;
|
|
158
|
+
lastWordEndOffset = wordEndOffset;
|
|
159
|
+
wordEntry.startOffsetUtf16 = wordStartOffset;
|
|
160
|
+
wordEntry.endOffsetUtf16 = wordEndOffset;
|
|
161
|
+
}
|
|
162
|
+
// Add cues
|
|
163
|
+
let currentCue = {
|
|
164
|
+
lines: [],
|
|
165
|
+
startTime: -1,
|
|
166
|
+
endTime: -1
|
|
167
|
+
};
|
|
168
|
+
let lineStartWordOffset = 0;
|
|
169
|
+
let lineStartOffset = 0;
|
|
170
|
+
for (let wordIndex = 0; wordIndex < wordTimeline.length; wordIndex++) {
|
|
171
|
+
const isLastWord = wordIndex == wordTimeline.length - 1;
|
|
172
|
+
const wordEntry = wordTimeline[wordIndex];
|
|
173
|
+
const wordEndOffset = wordEntry.endOffsetUtf16;
|
|
174
|
+
function getExtendedEndOffset(offset) {
|
|
175
|
+
if (offset == undefined) {
|
|
176
|
+
return entryText.length;
|
|
179
177
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
startTime: -1,
|
|
183
|
-
endTime: -1
|
|
184
|
-
};
|
|
185
|
-
let lineStartWordOffset = 0;
|
|
186
|
-
let lineStartOffset = 0;
|
|
187
|
-
for (let wordIndex = 0; wordIndex < wordTimeline.length; wordIndex++) {
|
|
188
|
-
const isLastWord = wordIndex == wordTimeline.length - 1;
|
|
189
|
-
const wordEntry = wordTimeline[wordIndex];
|
|
190
|
-
const wordEndOffset = wordEntry.endOffsetUtf16;
|
|
191
|
-
function getExtendedEndOffset(offset) {
|
|
192
|
-
if (offset == undefined) {
|
|
193
|
-
return entryText.length;
|
|
194
|
-
}
|
|
195
|
-
while (charactersToWriteAhead.includes(entryText[offset])) {
|
|
196
|
-
offset += 1;
|
|
197
|
-
}
|
|
198
|
-
return offset;
|
|
199
|
-
}
|
|
200
|
-
const wordExtendedEndOffset = getExtendedEndOffset(wordEndOffset);
|
|
201
|
-
const nextWordEntry = wordTimeline[wordIndex + 1];
|
|
202
|
-
const nextWordExtendedEndOffset = getExtendedEndOffset(nextWordEntry?.endOffsetUtf16);
|
|
203
|
-
const lineLength = wordExtendedEndOffset - lineStartOffset;
|
|
204
|
-
const lineLengthWithNextWord = nextWordExtendedEndOffset - lineStartOffset;
|
|
205
|
-
const wordsRemaining = wordTimeline.length - wordIndex - 1;
|
|
206
|
-
const phraseSeparators = [',', ',', '、', ';', ':', '),', '",', '”,'];
|
|
207
|
-
const lineLengthWithNextWordExceedsMaxLineWidth = lineLengthWithNextWord >= maxLineWidth;
|
|
208
|
-
const lineLengthExceedsHalfMaxLineWidth = lineLength >= maxLineWidth / 2;
|
|
209
|
-
const wordsRemainingAreEqualOrLessToMinimumWordsInLine = wordsRemaining <= config.minWordsInLine;
|
|
210
|
-
const remainingTextExceedsMaxLineWidth = entryText.length - lineStartOffset > maxLineWidth;
|
|
211
|
-
const followingSubstringIsPhraseSeparator = startsWithAnyOf(entryText.substring(wordEndOffset), phraseSeparators);
|
|
212
|
-
if (isLastWord ||
|
|
213
|
-
lineLengthWithNextWordExceedsMaxLineWidth ||
|
|
214
|
-
(remainingTextExceedsMaxLineWidth &&
|
|
215
|
-
lineLengthExceedsHalfMaxLineWidth &&
|
|
216
|
-
(wordsRemainingAreEqualOrLessToMinimumWordsInLine || followingSubstringIsPhraseSeparator))) {
|
|
217
|
-
let lineEndOffset;
|
|
218
|
-
if (isLastWord) {
|
|
219
|
-
lineEndOffset = entryText.length;
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
222
|
-
lineEndOffset = wordExtendedEndOffset;
|
|
223
|
-
}
|
|
224
|
-
const lineText = entryText.substring(lineStartOffset, lineEndOffset);
|
|
225
|
-
const nextWordStartTime = isLastWord ? entry.endTime : wordTimeline[wordIndex + 1].startTime;
|
|
226
|
-
const lineStartTime = wordTimeline[lineStartWordOffset].startTime;
|
|
227
|
-
const lineEndTime = nextWordStartTime;
|
|
228
|
-
currentCue.lines.push(lineText);
|
|
229
|
-
if (currentCue.startTime == -1) {
|
|
230
|
-
currentCue.startTime = lineStartTime;
|
|
231
|
-
}
|
|
232
|
-
currentCue.endTime = lineEndTime;
|
|
233
|
-
if (isLastWord || currentCue.lines.length == config.maxLineCount) {
|
|
234
|
-
cues.push(currentCue);
|
|
235
|
-
currentCue = {
|
|
236
|
-
lines: [],
|
|
237
|
-
startTime: -1,
|
|
238
|
-
endTime: -1
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
lineStartOffset = lineEndOffset;
|
|
242
|
-
lineStartWordOffset = wordIndex + 1;
|
|
243
|
-
}
|
|
178
|
+
while (charactersToWriteAhead.includes(entryText[offset])) {
|
|
179
|
+
offset += 1;
|
|
244
180
|
}
|
|
181
|
+
return offset;
|
|
245
182
|
}
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
183
|
+
const wordExtendedEndOffset = getExtendedEndOffset(wordEndOffset);
|
|
184
|
+
const nextWordEntry = wordTimeline[wordIndex + 1];
|
|
185
|
+
const nextWordExtendedEndOffset = getExtendedEndOffset(nextWordEntry?.endOffsetUtf16);
|
|
186
|
+
// Decide if to add to a new line
|
|
187
|
+
const lineLength = wordExtendedEndOffset - lineStartOffset;
|
|
188
|
+
const lineLengthWithNextWord = nextWordExtendedEndOffset - lineStartOffset;
|
|
189
|
+
const wordsRemaining = wordTimeline.length - wordIndex - 1;
|
|
190
|
+
const phraseSeparators = [',', ',', '、', ';', ':', '),', '",', '”,', '.', '".', '”.', '."', '.”', '。'];
|
|
191
|
+
const lineLengthWithNextWordExceedsMaxLineWidth = lineLengthWithNextWord >= maxLineWidth;
|
|
192
|
+
const lineLengthExceedsHalfMaxLineWidth = lineLength >= maxLineWidth / 2;
|
|
193
|
+
const wordsRemainingAreEqualOrLessToMinimumWordsInLine = wordsRemaining <= config.minWordsInLine;
|
|
194
|
+
const remainingTextExceedsMaxLineWidth = entryText.length - lineStartOffset > maxLineWidth;
|
|
195
|
+
const followingSubstringIsPhraseSeparator = startsWithAnyOf(entryText.substring(wordEndOffset), phraseSeparators);
|
|
196
|
+
const shouldAddNewLine = isLastWord ||
|
|
197
|
+
lineLengthWithNextWordExceedsMaxLineWidth ||
|
|
198
|
+
(remainingTextExceedsMaxLineWidth &&
|
|
199
|
+
lineLengthExceedsHalfMaxLineWidth &&
|
|
200
|
+
(wordsRemainingAreEqualOrLessToMinimumWordsInLine || (config.separatePhrases && followingSubstringIsPhraseSeparator)));
|
|
201
|
+
// If it was decided to add a new line
|
|
202
|
+
if (shouldAddNewLine) {
|
|
203
|
+
// Extend line end offset to end of sentence entry if last word encountered
|
|
204
|
+
let lineEndOffset;
|
|
205
|
+
if (isLastWord) {
|
|
206
|
+
lineEndOffset = entryText.length;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
lineEndOffset = wordExtendedEndOffset;
|
|
210
|
+
}
|
|
211
|
+
// Get line text
|
|
212
|
+
const lineText = entryText.substring(lineStartOffset, lineEndOffset);
|
|
213
|
+
// Find start and end times of line
|
|
214
|
+
const nextWordStartTime = isLastWord ? entry.endTime : wordTimeline[wordIndex + 1].startTime;
|
|
215
|
+
const lineStartTime = wordTimeline[lineStartWordOffset].startTime;
|
|
216
|
+
const lineEndTime = nextWordStartTime;
|
|
217
|
+
// Add new line to cue
|
|
218
|
+
currentCue.lines.push(lineText);
|
|
219
|
+
// Update cue start and end times
|
|
220
|
+
if (currentCue.startTime == -1) {
|
|
221
|
+
currentCue.startTime = lineStartTime;
|
|
222
|
+
}
|
|
223
|
+
currentCue.endTime = lineEndTime;
|
|
224
|
+
// Finalize cue if needed
|
|
225
|
+
if (isLastWord || currentCue.lines.length == config.maxLineCount) {
|
|
226
|
+
cues.push(currentCue);
|
|
227
|
+
currentCue = {
|
|
228
|
+
lines: [],
|
|
229
|
+
startTime: -1,
|
|
230
|
+
endTime: -1
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
// Update offsets
|
|
234
|
+
lineStartOffset = lineEndOffset;
|
|
235
|
+
lineStartWordOffset = wordIndex + 1;
|
|
253
236
|
}
|
|
254
237
|
}
|
|
255
238
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
239
|
+
return cues;
|
|
240
|
+
}
|
|
241
|
+
// Generates cues from timeline. Isolate words or phones in individual cues.
|
|
242
|
+
function getCuesFromTimeline_IsolateWordPhone(timeline, config) {
|
|
243
|
+
if (timeline.length == 0) {
|
|
244
|
+
return [];
|
|
245
|
+
}
|
|
246
|
+
const kind = config.kind;
|
|
247
|
+
const cues = [];
|
|
248
|
+
for (const entry of timeline) {
|
|
249
|
+
const entryIsWord = entry.type == 'word';
|
|
250
|
+
const entryIsPhone = entry.type == 'phone';
|
|
251
|
+
const shouldIncludeEntry = (entryIsWord && (kind == 'word' || kind == 'word-phone')) ||
|
|
252
|
+
(entryIsPhone && (kind == 'phone' || kind == 'word-phone'));
|
|
253
|
+
if (shouldIncludeEntry) {
|
|
254
|
+
cues.push({
|
|
255
|
+
lines: [entry.text],
|
|
256
|
+
startTime: entry.startTime,
|
|
257
|
+
endTime: entry.endTime,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
if (entry.timeline) {
|
|
261
|
+
cues.push(...getCuesFromTimeline_IsolateWordPhone(entry.timeline, config));
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return cues;
|
|
265
|
+
}
|
|
266
|
+
function tryParseTimeRangePatternWithHours(line) {
|
|
267
|
+
const timeRangePatternWithHours = /^(\d+)\:(\d+)\:(\d+)[\.,](\d+)[ ]*-->[ ]*(\d+)\:(\d+)\:(\d+)[\.,](\d+)/;
|
|
268
|
+
const match = timeRangePatternWithHours.exec(line);
|
|
269
|
+
if (!match) {
|
|
270
|
+
return { startTime: -1, endTime: -1, succeeded: false };
|
|
271
|
+
}
|
|
272
|
+
const startHours = parseInt(match[1]);
|
|
273
|
+
const startMinutes = parseInt(match[2]);
|
|
274
|
+
const startSeconds = parseInt(match[3]);
|
|
275
|
+
const startMilliseconds = parseInt(match[4]);
|
|
276
|
+
const endHours = parseInt(match[5]);
|
|
277
|
+
const endMinutes = parseInt(match[6]);
|
|
278
|
+
const endSeconds = parseInt(match[7]);
|
|
279
|
+
const endMilliseconds = parseInt(match[8]);
|
|
280
|
+
const startTime = (startMilliseconds / 1000) + (startSeconds) + (startMinutes * 60) + (startHours * 60 * 60);
|
|
281
|
+
const endTime = (endMilliseconds / 1000) + (endSeconds) + (endMinutes * 60) + (endHours * 60 * 60);
|
|
282
|
+
return { startTime, endTime, succeeded: true };
|
|
283
|
+
}
|
|
284
|
+
function tryParseTimeRangePatternWithoutHours(line) {
|
|
285
|
+
const timeRangePatternWithHours = /^(\d+)\:(\d+)[\.,](\d+)[ ]*-->[ ]*(\d+)\:(\d+)[\.,](\d+)/;
|
|
286
|
+
const match = timeRangePatternWithHours.exec(line);
|
|
287
|
+
if (!match) {
|
|
288
|
+
return { startTime: -1, endTime: -1, succeeded: false };
|
|
289
|
+
}
|
|
290
|
+
const startMinutes = parseInt(match[1]);
|
|
291
|
+
const startSeconds = parseInt(match[2]);
|
|
292
|
+
const startMilliseconds = parseInt(match[3]);
|
|
293
|
+
const endMinutes = parseInt(match[4]);
|
|
294
|
+
const endSeconds = parseInt(match[5]);
|
|
295
|
+
const endMilliseconds = parseInt(match[6]);
|
|
296
|
+
const startTime = (startMilliseconds / 1000) + (startSeconds) + (startMinutes * 60);
|
|
297
|
+
const endTime = (endMilliseconds / 1000) + (endSeconds) + (endMinutes * 60);
|
|
298
|
+
return { startTime, endTime, succeeded: true };
|
|
299
|
+
}
|
|
300
|
+
function cueObjectToText(cue, cueIndex, config) {
|
|
301
|
+
if (!cue || !cue.lines || cue.lines.length == 0) {
|
|
302
|
+
throw new Error(`Cue is empty`);
|
|
303
|
+
}
|
|
304
|
+
const lineBreakString = config.lineBreakString;
|
|
305
|
+
let outText = '';
|
|
306
|
+
if (config.includeCueIndexes) {
|
|
307
|
+
outText += `${cueIndex}${lineBreakString}`;
|
|
308
|
+
}
|
|
309
|
+
let formattedStartTime;
|
|
310
|
+
let formattedEndTime;
|
|
311
|
+
if (config.includeHours == true) {
|
|
312
|
+
formattedStartTime = formatHMS(secondsToHMS(cue.startTime), config.decimalSeparator);
|
|
313
|
+
formattedEndTime = formatHMS(secondsToHMS(cue.endTime), config.decimalSeparator);
|
|
261
314
|
}
|
|
262
|
-
|
|
263
|
-
|
|
315
|
+
else {
|
|
316
|
+
formattedStartTime = formatMS(secondsToMS(cue.startTime), config.decimalSeparator);
|
|
317
|
+
formattedEndTime = formatMS(secondsToMS(cue.endTime), config.decimalSeparator);
|
|
264
318
|
}
|
|
265
|
-
|
|
319
|
+
outText += `${formattedStartTime} --> ${formattedEndTime}`;
|
|
320
|
+
outText += `${lineBreakString}`;
|
|
321
|
+
outText += cue.lines.map(line => line.trim()).join(lineBreakString);
|
|
322
|
+
outText += `${lineBreakString}`;
|
|
323
|
+
outText += `${lineBreakString}`;
|
|
324
|
+
return outText;
|
|
266
325
|
}
|
|
267
|
-
export const
|
|
268
|
-
format:
|
|
326
|
+
export const defaultSubtitlesBaseConfig = {
|
|
327
|
+
format: 'srt',
|
|
328
|
+
kind: 'sentence',
|
|
269
329
|
maxLineCount: 2,
|
|
270
330
|
maxLineWidth: 42,
|
|
271
331
|
minWordsInLine: 4,
|
|
272
|
-
|
|
332
|
+
separatePhrases: true,
|
|
333
|
+
maxAddedDuration: 3.0,
|
|
273
334
|
};
|
|
274
|
-
export const
|
|
275
|
-
decimalSeparator:
|
|
335
|
+
export const srtConfigExtension = {
|
|
336
|
+
decimalSeparator: ',',
|
|
276
337
|
includeCueIndexes: true,
|
|
277
338
|
includeHours: true,
|
|
278
|
-
lineBreakString:
|
|
339
|
+
lineBreakString: '\n',
|
|
279
340
|
};
|
|
280
|
-
export const
|
|
281
|
-
decimalSeparator:
|
|
341
|
+
export const webVttConfigExtension = {
|
|
342
|
+
decimalSeparator: '.',
|
|
282
343
|
includeCueIndexes: false,
|
|
283
344
|
includeHours: true,
|
|
284
|
-
lineBreakString:
|
|
345
|
+
lineBreakString: '\n',
|
|
285
346
|
};
|
|
286
347
|
//# sourceMappingURL=Subtitles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Subtitles.js","sourceRoot":"","sources":["../../src/subtitles/Subtitles.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Subtitles.js","sourceRoot":"","sources":["../../src/subtitles/Subtitles.ts"],"names":[],"mappings":"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"}
|
package/docs/Options.md
CHANGED
|
@@ -131,10 +131,12 @@ Applicable to CLI command: `transcribe`, API method: `recognize`
|
|
|
131
131
|
* `languageDetection`: prefix to provide custom options for language detection. Options detailed in section for speech language detection
|
|
132
132
|
|
|
133
133
|
**Subtitles**
|
|
134
|
+
* `subtitles.kind`: kind of subtitles to generate. Can be `segment` (ensures each segment starts at a new cue), `sentence` (ensures each sentence starts at a new cue), `word` (one word per cue), `phone` (one phone per cue), `word-phone` (include both `word` and `phone` cues, with overlapping times ranges). Defaults to `sentence`
|
|
134
135
|
* `subtitles.maxLineCount`: maximum number of lines per cue. Defaults to `2`
|
|
135
136
|
* `subtitles.maxLineWidth`: maximum characters in a line. Defaults to `42`
|
|
136
|
-
* `subtitles.minWordsInLine`: minimum number of words
|
|
137
|
-
* `subtitles.
|
|
137
|
+
* `subtitles.minWordsInLine`: minimum number of remaining words to break to a new line. Defaults to `4`
|
|
138
|
+
* `subtitles.separatePhrases`: try to separate phrases or sentences in new lines or cues, if possible. Defaults to `true`
|
|
139
|
+
* `subtitles.maxAddedDuration`: maximum extra time (in seconds) that may be added after a cue's end time. This gives the reader additional time to read the cue, and also ensures that very short-duration cues aren't shown in a flash. Defaults to `3.0`
|
|
138
140
|
|
|
139
141
|
**Whisper**:
|
|
140
142
|
* `whisper.model`: selects which Whisper model to use. Can be `tiny`, `tiny.en`, `base`, `base.en`, `small`, `small.en`, `medium`, `medium.en`, `large` (same as `large-v2`), `large-v1`, `large-v2`. Defaults to `tiny` or `tiny.en`
|