echogarden 0.11.11 → 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.
Files changed (130) hide show
  1. package/data/schemas/options.json +16 -0
  2. package/dist/alignment/DTWMfccSequenceAlignment.js +2 -2
  3. package/dist/alignment/DTWMfccSequenceAlignment.js.map +1 -1
  4. package/dist/alignment/SpeechAlignment.d.ts +1 -1
  5. package/dist/alignment/SpeechAlignment.js +15 -3
  6. package/dist/alignment/SpeechAlignment.js.map +1 -1
  7. package/dist/api/Alignment.js +3 -3
  8. package/dist/api/Alignment.js.map +1 -1
  9. package/dist/api/LanguageDetection.js +1 -1
  10. package/dist/api/LanguageDetection.js.map +1 -1
  11. package/dist/api/Recognition.js +3 -3
  12. package/dist/api/Recognition.js.map +1 -1
  13. package/dist/api/Synthesis.js +7 -6
  14. package/dist/api/Synthesis.js.map +1 -1
  15. package/dist/api/Translation.js +3 -3
  16. package/dist/api/Translation.js.map +1 -1
  17. package/dist/audio/AudioUtilities.d.ts +5 -2
  18. package/dist/audio/AudioUtilities.js +50 -22
  19. package/dist/audio/AudioUtilities.js.map +1 -1
  20. package/dist/cli/CLI.js +2 -2
  21. package/dist/cli/CLI.js.map +1 -1
  22. package/dist/dsp/SpeexResampler.js +1 -1
  23. package/dist/recognition/WhisperSTT.js +2 -2
  24. package/dist/recognition/WhisperSTT.js.map +1 -1
  25. package/dist/subtitles/Subtitles.d.ts +10 -7
  26. package/dist/subtitles/Subtitles.js +268 -207
  27. package/dist/subtitles/Subtitles.js.map +1 -1
  28. package/docs/Options.md +4 -2
  29. package/package.json +12 -11
  30. package/src/alignment/DTWMfccSequenceAlignment.ts +43 -0
  31. package/src/alignment/DTWSequenceAlignment.ts +121 -0
  32. package/src/alignment/DTWSequenceAlignmentWindowed.ts +210 -0
  33. package/src/alignment/LevenshteinSequenceAlignment.ts +126 -0
  34. package/src/alignment/SpeechAlignment.ts +488 -0
  35. package/src/api/API.ts +12 -0
  36. package/src/api/APIOptions.ts +15 -0
  37. package/src/api/Alignment.ts +329 -0
  38. package/src/api/Common.ts +16 -0
  39. package/src/api/Denoising.ts +120 -0
  40. package/src/api/LanguageDetection.ts +286 -0
  41. package/src/api/Recognition.ts +344 -0
  42. package/src/api/Synthesis.ts +1735 -0
  43. package/src/api/Translation.ts +143 -0
  44. package/src/api/Vad.ts +172 -0
  45. package/src/audio/AudioBufferConversion.ts +248 -0
  46. package/src/audio/AudioPlayer.ts +358 -0
  47. package/src/audio/AudioRecorder.ts +91 -0
  48. package/src/audio/AudioUtilities.ts +392 -0
  49. package/src/audio/SoxPath.ts +24 -0
  50. package/src/cli/CLI.ts +1360 -0
  51. package/src/cli/CLIConfigFile.ts +91 -0
  52. package/src/cli/CLILauncher.ts +26 -0
  53. package/src/cli/CLIOptionsSchema.ts +54 -0
  54. package/src/cli/CLIParser.ts +41 -0
  55. package/src/cli/CLIStarter.ts +40 -0
  56. package/src/codecs/FFMpegTranscoder.ts +214 -0
  57. package/src/codecs/TIMITCodec.ts +17 -0
  58. package/src/codecs/WaveCodec.ts +260 -0
  59. package/src/denoising/RNNoise.ts +95 -0
  60. package/src/dsp/BiquadFilter.ts +488 -0
  61. package/src/dsp/FFT.ts +187 -0
  62. package/src/dsp/MFCC.ts +227 -0
  63. package/src/dsp/MelSpectogram.ts +145 -0
  64. package/src/dsp/Rubberband.ts +249 -0
  65. package/src/dsp/Sonic.ts +59 -0
  66. package/src/dsp/SpeexResampler.ts +79 -0
  67. package/src/math/VectorMath.ts +812 -0
  68. package/src/nlp/ChineseSegmentation.ts +68 -0
  69. package/src/nlp/CompromiseNLP.ts +113 -0
  70. package/src/nlp/EspeakPhonemizer.ts +168 -0
  71. package/src/nlp/IPA.ts +139 -0
  72. package/src/nlp/JapaneseSegmentation.ts +53 -0
  73. package/src/nlp/Lexicon.ts +119 -0
  74. package/src/nlp/PhoneConversion.ts +508 -0
  75. package/src/nlp/Segmentation.ts +237 -0
  76. package/src/nlp/TextNormalizer.ts +160 -0
  77. package/src/recognition/AmazonTranscribeSTT.ts +112 -0
  78. package/src/recognition/AzureCognitiveServicesSTT.ts +76 -0
  79. package/src/recognition/GoogleCloudSTT.ts +92 -0
  80. package/src/recognition/SileroSTT.ts +173 -0
  81. package/src/recognition/VoskSTT.ts +112 -0
  82. package/src/recognition/WhisperSTT.ts +1518 -0
  83. package/src/server/Client.ts +297 -0
  84. package/src/server/Server.ts +178 -0
  85. package/src/server/ServerStarter.ts +12 -0
  86. package/src/server/Worker.ts +400 -0
  87. package/src/server/WorkerStarter.ts +38 -0
  88. package/src/speech-language-detection/SileroLanguageDetection.ts +105 -0
  89. package/src/subtitles/Subtitles.ts +478 -0
  90. package/src/synthesis/AwsPollyTTS.ts +78 -0
  91. package/src/synthesis/AzureCognitiveServicesTTS.ts +146 -0
  92. package/src/synthesis/CoquiServerTTS.ts +29 -0
  93. package/src/synthesis/ElevenLabsTTS.ts +104 -0
  94. package/src/synthesis/EspeakTTS.ts +552 -0
  95. package/src/synthesis/FliteTTS.ts +387 -0
  96. package/src/synthesis/GoogleCloudTTS.ts +112 -0
  97. package/src/synthesis/GoogleTranslateTTS.ts +210 -0
  98. package/src/synthesis/MicrosoftEdgeTTS.ts +298 -0
  99. package/src/synthesis/SamTTS.ts +30 -0
  100. package/src/synthesis/SapiTTS.ts +222 -0
  101. package/src/synthesis/StreamlabsPollyTTS.ts +114 -0
  102. package/src/synthesis/SvoxPicoTTS.ts +318 -0
  103. package/src/synthesis/VitsTTS.ts +734 -0
  104. package/src/tests/Test.ts +24 -0
  105. package/src/text-language-detection/FastTextLanguageDetection.ts +53 -0
  106. package/src/text-language-detection/TinyLDLanguageDetection.ts +16 -0
  107. package/src/typings/Fillers.d.ts +41 -0
  108. package/src/utilities/BinaryArrayConversion.ts +159 -0
  109. package/src/utilities/Compression.ts +91 -0
  110. package/src/utilities/FileDownloader.ts +201 -0
  111. package/src/utilities/FileSystem.ts +265 -0
  112. package/src/utilities/Hashing.ts +230 -0
  113. package/src/utilities/Locale.ts +119 -0
  114. package/src/utilities/Logger.ts +72 -0
  115. package/src/utilities/NdArrayUtilities.ts +31 -0
  116. package/src/utilities/ObjectUtilities.ts +169 -0
  117. package/src/utilities/OpenPromise.ts +13 -0
  118. package/src/utilities/PackageManager.ts +97 -0
  119. package/src/utilities/Queue.ts +17 -0
  120. package/src/utilities/RandomGenerator.ts +237 -0
  121. package/src/utilities/SignalChannel.ts +22 -0
  122. package/src/utilities/TarballMaker.ts +68 -0
  123. package/src/utilities/Timeline.ts +231 -0
  124. package/src/utilities/Timer.ts +93 -0
  125. package/src/utilities/Utilities.ts +574 -0
  126. package/src/utilities/WasmMemoryManager.ts +516 -0
  127. package/src/utilities/WebReader.ts +55 -0
  128. package/src/utilities/WikipediaReader.ts +41 -0
  129. package/src/voice-activity-detection/SileroVAD.ts +86 -0
  130. 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 "../utilities/Utilities.js";
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, "utf8"));
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
- function tryParseTimeRangePatternWithHours() {
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: "segment",
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 += " " + line;
43
+ lastEntry.text += ' ' + line;
77
44
  }
78
45
  }
79
46
  }
80
47
  if (!removeMarkup) {
81
48
  return timeline;
82
49
  }
83
- const timelineWithPlainText = timeline.map((entry) => {
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, " ").trim();
55
+ plainText = plainText.replaceAll(/\s+/g, ' ').trim();
88
56
  return { ...entry, text: plainText };
89
57
  });
90
- return timelineWithPlainText;
58
+ return timelineWithoutMarkup;
91
59
  }
92
- export function timelineToSubtitles(timeline, subtitlesConfig, recurse = false) {
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 == "webvtt") {
96
- config = { ...webVttConfig, ...defaultSubtitlesConfig, ...config };
64
+ if (config.format && config.format == 'webvtt') {
65
+ config = { ...defaultSubtitlesBaseConfig, ...webVttConfigExtension, ...config };
97
66
  }
98
67
  else {
99
- config = { ...srtConfig, ...defaultSubtitlesConfig, ...config };
68
+ config = { ...defaultSubtitlesBaseConfig, ...srtConfigExtension, ...config };
100
69
  }
70
+ // Initialize subtitle file content
101
71
  const lineBreakString = config.lineBreakString;
102
- let cueIndex = 1;
103
- let result = "";
104
- if (config.format == "webvtt") {
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
- result += `Language: ${config.language}${lineBreakString}`;
76
+ outText += `Language: ${config.language}${lineBreakString}`;
108
77
  }
109
- result += lineBreakString;
78
+ outText += lineBreakString;
110
79
  }
111
- function writeCue(cue) {
112
- if (cue.lines.length == 0) {
113
- return;
114
- }
115
- if (config.includeCueIndexes) {
116
- result += `${cueIndex}${lineBreakString}`;
117
- }
118
- let formattedStartTime;
119
- let formattedEndTime;
120
- if (config.includeHours == true) {
121
- formattedStartTime = formatHMS(secondsToHMS(cue.startTime), config.decimalSeparator);
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
- result += `${formattedStartTime} --> ${formattedEndTime}`;
129
- result += `${lineBreakString}`;
130
- result += cue.lines.map(line => line.trim()).join(lineBreakString);
131
- result += `${lineBreakString}`;
132
- result += `${lineBreakString}`;
133
- cueIndex += 1;
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
- function addCuesFromTimeline(timeline, recurse = false) {
137
- if (timeline.length == 0) {
138
- return;
139
- }
140
- if (timeline[0].type == "word") {
141
- const wordTimeline = timeline.filter(entry => isWordOrSymbolWord(entry.text));
142
- const text = wordTimeline.map(entry => entry.text).join(" ");
143
- const segmentEntry = {
144
- type: "segment",
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
- const entryText = entry.text;
159
- const maxLineWidth = config.maxLineWidth;
160
- if (entryText.length <= maxLineWidth) {
161
- cues.push({
162
- lines: [entryText],
163
- startTime: entry.startTime,
164
- endTime: entry.endTime
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
- else if (entry.timeline && entry.timeline?.[0].type == "word") {
168
- const wordTimeline = entry.timeline.filter(entry => isWord(entry.text));
169
- let lastWordEndOffset = 0;
170
- for (const wordEntry of wordTimeline) {
171
- const wordStartOffset = entryText.indexOf(wordEntry.text, lastWordEndOffset);
172
- if (wordStartOffset == -1) {
173
- throw new Error(`Couldn't find word '${wordEntry.text}' in its parent entry text`);
174
- }
175
- let wordEndOffset = wordStartOffset + wordEntry.text.length;
176
- lastWordEndOffset = wordEndOffset;
177
- wordEntry.startOffsetUtf16 = wordStartOffset;
178
- wordEntry.endOffsetUtf16 = wordEndOffset;
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
- let currentCue = {
181
- lines: [],
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
- else {
247
- throw new Error("Found an entry without a word timeline descendant");
248
- //const lines = splitToFragments(entryText, config.maxLineWidth!, config.language!, true, true).map(line => line.text)
249
- //writeCue(lines, entry.startTime, entry.endTime, config)
250
- }
251
- if (recurse && entry.timeline != null) {
252
- addCuesFromTimeline(entry.timeline, true);
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
- addCuesFromTimeline(timeline, recurse);
257
- for (let i = 1; i < cues.length; i++) {
258
- const currentCue = cues[i];
259
- const previousCue = cues[i - 1];
260
- previousCue.endTime = Math.min(previousCue.endTime + config.maxAddedDuration, currentCue.startTime);
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
- for (const cue of cues) {
263
- writeCue(cue);
315
+ else {
316
+ formattedStartTime = formatMS(secondsToMS(cue.startTime), config.decimalSeparator);
317
+ formattedEndTime = formatMS(secondsToMS(cue.endTime), config.decimalSeparator);
264
318
  }
265
- return result;
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 defaultSubtitlesConfig = {
268
- format: "srt",
326
+ export const defaultSubtitlesBaseConfig = {
327
+ format: 'srt',
328
+ kind: 'sentence',
269
329
  maxLineCount: 2,
270
330
  maxLineWidth: 42,
271
331
  minWordsInLine: 4,
272
- maxAddedDuration: 3,
332
+ separatePhrases: true,
333
+ maxAddedDuration: 3.0,
273
334
  };
274
- export const srtConfig = {
275
- decimalSeparator: ",",
335
+ export const srtConfigExtension = {
336
+ decimalSeparator: ',',
276
337
  includeCueIndexes: true,
277
338
  includeHours: true,
278
- lineBreakString: "\n",
339
+ lineBreakString: '\n',
279
340
  };
280
- export const webVttConfig = {
281
- decimalSeparator: ".",
341
+ export const webVttConfigExtension = {
342
+ decimalSeparator: '.',
282
343
  includeCueIndexes: false,
283
344
  includeHours: true,
284
- lineBreakString: "\n",
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 in a line, such that a line break to be added. Defaults to `4`
137
- * `subtitles.maxAddedDuration`: maximum extra time (in seconds) that may be added after a cue's speech end time. This also ensures that very short-duration segments aren't shown in a flash. Defaults to `3`
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`