@aim-packages/subtitle 0.0.19 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -67,319 +67,458 @@ export declare interface AimSegments {
67
67
 
68
68
  declare function assToAimSegments(text: string): Promise<AimSegments[]>;
69
69
 
70
- declare function chunkArrayStrings(strings: string[], characterLimit: number): string[];
71
-
72
- declare function chunkSegmentStringsWithIndex(segments: AimSegments[], characterLimit: number): {
73
- segmentsResult: AimSegments[][];
74
- stringResult: string[];
75
- indexStringResult: string[];
76
- indexResult: number[];
77
- };
78
-
79
- declare function consolidateSegments(items: Segment[], option: {
80
- maxDistance: number;
81
- padding: number;
82
- }): Segment[] | undefined;
83
-
84
70
  /**
85
- * 匹配中文、日文、韩文字符的正则表达式
71
+ * 将字符串数组按字符限制分块
86
72
  *
87
- * @export
88
- * @param {string} str
89
- * @return {*} {boolean}
90
- */
91
- declare function containsCJKCharacters(str: string): boolean;
92
-
93
- /**
94
- * Convert a HH:MM:SS,MMM or HH:MM:SS.MMM time format into seconds.
73
+ * 作用:
74
+ * 1. 将字符串数组按照字符限制进行分块,避免单次处理内容过多
75
+ * 2. 使用换行符连接同一分块内的字符串
76
+ * 3. 在分块时会预留一定的字符空间(10个字符)用于换行符和格式调整
95
77
  *
96
78
  * @export
97
- * @param {string} time - The time to be converted.
98
- * @return {*} {number} - The time converted to seconds.
99
- */
100
- declare function convertToSeconds(time?: string): number;
101
-
102
- /**
103
- * Creates a new Parser parser.
104
- *
105
- * @param onParse - Callback to invoke when a new event is parsed, or a new reconnection interval
106
- * has been sent from the server
107
- *
108
- * @returns A new Parser parser, with `parse`, `end` and `reset` methods.
109
- * @public
79
+ * @param {string[]} strings - 输入的字符串数组
80
+ * @param {number} characterLimit - 每个分块的最大字符数限制
81
+ * @return {string[]} 分块后的字符串数组,每个元素是换行符分隔的文本块
110
82
  */
111
- declare function create(options?: ParserOptions<AimSegments[], AimSegments[], string> & {
112
- vad?: Segment[];
113
- vadPadding?: [number, number];
114
- }): Parser<string>;
115
-
116
- declare function create_2(options?: ParserOptions<RequiredByKey<Partial<AimSegments>, "index">[], Partial<AimSegments>[], string>): Parser<string>;
117
-
118
- declare function create_3(options?: ParserOptions<AimSegments[], AimSegments[], AimSegments[]> & {
119
- sentenceLength?: number;
120
- repeatString?: string[];
121
- }): Parser<AimSegments[]>;
122
-
123
- declare function detectAllLanguage(text: string): LanguageDetectionResultsEntry[];
124
-
125
- declare function detectLanguage(text: string): LanguageDetectionResultsEntry;
126
-
127
- export declare namespace filter {
128
- export {
129
- StreamFilter
130
- }
131
- }
83
+ declare function chunkArrayStrings(strings: string[], characterLimit: number): string[];
132
84
 
133
85
  /**
134
- * 将秒数转换为 xx:xx:xx.xxx 格式
86
+ * 将字幕片段按字符限制分块,并生成多种格式的结果
135
87
  *
136
- * @export
137
- * @param {number} seconds
138
- * @return {*} {string}
139
- */
140
- declare function formatTime(seconds: number): string;
141
-
142
- export declare type LanguageCode = "auto" | "none" | "zh" | "zh_cn" | "zh_tw" | "yue" | "en" | "ja" | "ko" | "fr" | "es" | "ru" | "de" | "it" | "tr" | "pt" | "vi" | "id" | "th" | "ms" | "ar" | "hi" | "ro" | "ug" | "uz" | "kk" | "az" | "ky" | "fa" | "tg";
143
-
144
- /**
145
- * 将语言代码转换为名称
88
+ * 作用:
89
+ * 1. 将字幕片段数组按照字符限制分块,避免单次处理内容过多
90
+ * 2. 为每个片段添加索引信息,便于后续处理和追踪
91
+ * 3. 生成多种格式的分块结果,满足不同场景的需求
146
92
  *
147
93
  * @export
148
- * @param {LanguageCode} languageCode
149
- * @return {*}
150
- */
151
- declare function languageCodeToName(languageCode: LanguageCode): string;
152
-
153
- declare interface LanguageDetectionResultsEntry {
154
- language: LanguageCode;
155
- languageName: string;
156
- probability: number;
157
- }
158
-
159
- declare interface OpenAIResult {
160
- task: string;
161
- language: string;
162
- text: string;
163
- words: {
164
- word: string;
165
- start: number;
166
- end: number;
167
- }[];
168
- segments: {
169
- text: string;
170
- start: number;
171
- end: number;
172
- }[];
173
- }
174
-
175
- declare function openaiToAimSegments(json: OpenAIResult): Promise<AimSegments[]>;
176
-
177
- export declare interface OptimizationOptions {
178
- emt: boolean;
179
- ep: boolean;
180
- zf: boolean;
181
- punc: boolean;
182
- em: boolean;
183
- space: boolean;
184
- repeat: boolean;
185
- }
186
-
187
- /**
188
- * 为数字前方自动补0到特定的位数,默认两位
189
- */
190
- declare function padNumber(num: number, length?: number): string;
191
-
192
- /**
193
- * Callback passed as the `onParse` callback to a parser
194
- *
195
- * @public
196
- */
197
- declare type ParseCallback<T> = (event: ParsedEvent<T>) => void;
198
-
199
- declare interface ParsedEvent<T> {
200
- type: "event";
201
- event: "start" | "message" | "end";
202
- data?: T;
203
- }
204
-
205
- /**
206
- * Parser parser instance.
207
- *
208
- * Needs to be reset between reconnections/when switching data source, using the `reset()` method.
209
- *
210
- * @public
211
- */
212
- declare interface Parser<T = string> {
213
- /**
214
- * Feeds the parser another chunk. The method _does not_ return a parsed message.
215
- * Instead, if the chunk was a complete message (or completed a previously incomplete message),
216
- * it will invoke the `onParse` callback used to create the parsers.
217
- *
218
- * @param chunk - The chunk to parse. Can be a partial, eg in the case of streaming messages.
219
- * @public
220
- */
221
- feed(chunk: T): void;
222
- /**
223
- * Resets the parser state. This is required when you have a new stream of messages -
224
- * for instance in the case of a client being disconnected and reconnecting.
225
- *
226
- * @public
227
- */
228
- reset(): void;
229
- end(): void;
230
- }
231
-
232
- export declare namespace parser {
233
- export {
234
- srtToAimSegments,
235
- vttToAimSegments,
236
- assToAimSegments,
237
- tingwuToAimSegments,
238
- openaiToAimSegments,
239
- create as createWhisperStreamParser,
240
- create_2 as createTranslateStreamParser,
241
- create_3 as createSegmentStreamParser
242
- }
243
- }
244
-
245
- /**
246
- * `ParserOptions` 是一个泛型类型,用于配置解析器的回调函数。
247
- *
248
- * @template S - 解析开始时的状态类型
249
- * @template P - 解析过程中使用的状态类型
250
- * @template E - 解析结束时的状态类型
251
- *
252
- * @property {ParseCallback<S>} [onStart] - 解析开始时的回调函数
253
- * @property {ParseCallback<P>} [onParse] - 解析过程中调用的回调函数
254
- * @property {ParseCallback<P>} [onProgress] - 解析进度更新时的回调函数
255
- * @property {ParseCallback<E>} [onEnd] - 解析结束时的回调函数
256
- */
257
- declare type ParserOptions<S, P, E> = {
258
- onStart?: ParseCallback<S>;
259
- onParse?: ParseCallback<P>;
260
- onProgress?: ParseCallback<P>;
261
- onEnd?: ParseCallback<E>;
262
- };
263
-
264
- export declare type PartialByKey<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
265
-
266
- declare class RepeatCheck {
267
- threshold: number;
268
- hit: number;
269
- prevSegment?: AimSegments;
270
- hitSegment?: AimSegments;
271
- hitSegmentList: AimSegments[];
272
- options: RepeatCheckOption;
273
- constructor(options?: RepeatCheckOption);
274
- push(segment: AimSegments): void;
275
- end(): void;
276
- reset(): void;
277
- }
278
-
279
- declare interface RepeatCheckOption {
280
- onHit?: (segment: AimSegments[]) => void;
281
- }
282
-
283
- export declare type RequiredByKey<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
284
-
285
- export declare type Segment = {
286
- start: number;
287
- end: number;
288
- };
289
-
290
- declare function splitToSentences(text: string, languageCode?: LanguageCode): string[];
291
-
292
- declare function srtToAimSegments(text: string): Promise<AimSegments[]>;
293
-
294
- declare class StreamFilter {
295
- chains: Record<string, any>;
296
- delimit: string;
297
- onFilter?: (text: string) => any;
298
- checked: boolean;
299
- checkedText: string;
300
- checkedLevel?: Record<string, any>;
301
- filteredText: string;
302
- constructor(onFilter?: (text: string) => any);
303
- add(keyword: string, replaceText?: string): void;
304
- parse(data: [string, string][]): void;
305
- reParse(data: string[][]): void;
306
- feed(c: string): void;
307
- feedAll(text: string): string;
308
- end(): string;
309
- }
310
-
311
- declare function subtitleOptimization(segments: AimSegments[], options?: OptimizationOptions): {
312
- result: {
313
- emt: number[];
314
- ep: number[];
315
- zf: number[];
316
- punc: number[];
317
- em: number[];
318
- space: number[];
319
- repeat: number[];
320
- };
321
- repeat: AimSegments[];
322
- segments: AimSegments[];
323
- };
324
-
325
- declare const subtitleOptimizationRegExp: {
326
- punc: RegExp;
327
- em: RegExp;
328
- space: RegExp;
329
- ep: RegExp;
330
- };
331
-
332
- declare interface TingwuResult {
333
- TaskId: string;
334
- Transcription: {
335
- AudioInfo: {
336
- "Size": number;
337
- "Duration": number;
338
- "SampleRate": number;
339
- "Language": string;
340
- };
341
- Paragraphs: {
342
- ParagraphId: string;
343
- SpeakerId: string;
344
- Words: {
345
- "Id": number;
346
- "SentenceId": number;
347
- "Start": number;
348
- "End": number;
349
- "Text": string;
350
- }[];
351
- }[];
352
- };
353
- }
354
-
355
- declare function tingwuToAimSegments(json: TingwuResult): Promise<AimSegments[]>;
356
-
357
- export declare namespace tools {
358
- export {
359
- subtitleOptimization,
360
- RepeatCheckOption,
361
- RepeatCheck,
362
- subtitleOptimizationRegExp,
363
- detectAllLanguage,
364
- detectLanguage,
365
- LanguageDetectionResultsEntry,
366
- splitToSentences
367
- }
368
- }
369
-
370
- export declare namespace utils {
371
- export {
372
- padNumber,
373
- formatTime,
374
- convertToSeconds,
375
- containsCJKCharacters,
376
- languageCodeToName,
377
- chunkArrayStrings,
378
- chunkSegmentStringsWithIndex,
379
- consolidateSegments
380
- }
381
- }
382
-
383
- declare function vttToAimSegments(text: string): Promise<AimSegments[]>;
384
-
385
- export { }
94
+ * @param {AimSegments[]} segments - 输入的字幕片段数组
95
+ * @param {number} characterLimit - 每个分块的最大字符数限制
96
+ * @return {{
97
+ * segmentsResult: AimSegments[][] - 分块后的字幕片段数组,每个元素是一个片段数组
98
+ * stringResult: string[] - 纯文本分块结果,每个元素是换行符分隔的文本
99
+ * indexStringResult: string[] - 带索引的文本分块结果,格式为 [索引]文本
100
+ * indexResult: number[] - 每个分块的起始索引数组,用于追踪分块边界
101
+ * }} 分块处理的结果对象
102
+ */
103
+ declare function chunkSegmentStringsWithIndex(segments: AimSegments[], characterLimit: number): {
104
+ segmentsResult: AimSegments[][];
105
+ stringResult: string[];
106
+ indexStringResult: string[];
107
+ indexResult: number[];
108
+ };
109
+
110
+ /**
111
+ * 合并字幕片段,优化字幕的时间轴
112
+ *
113
+ * 作用:
114
+ * 1. 将时间间隔小于 maxDistance 的相邻字幕片段合并为一个片段
115
+ * 2. 可选择性地为每个片段添加 padding 时间,扩展片段的开始和结束时间
116
+ * 3. 如果添加了 padding,会自动处理重叠的片段,将它们合并
117
+ *
118
+ * @export
119
+ * @param {Segment[]} items - 输入的字幕片段数组,每个片段包含 start 和 end 时间
120
+ * @param {{
121
+ * maxDistance: number - 最大时间间隔,小于此值的相邻片段会被合并
122
+ * padding: number - 可选的时间填充,为每个片段扩展开始和结束时间
123
+ * }} option - 合并选项
124
+ * @return {Segment[]} 合并后的字幕片段数组,如果输入为空则返回空数组
125
+ */
126
+ declare function consolidateSegments(items: Segment[], option: {
127
+ maxDistance: number;
128
+ padding: number;
129
+ }): Segment[] | undefined;
130
+
131
+ /**
132
+ * 匹配中文、日文、韩文字符的正则表达式
133
+ *
134
+ * @export
135
+ * @param {string} str
136
+ * @return {*} {boolean}
137
+ */
138
+ declare function containsCJKCharacters(str: string): boolean;
139
+
140
+ /**
141
+ * Convert a HH:MM:SS,MMM or HH:MM:SS.MMM time format into seconds.
142
+ *
143
+ * @export
144
+ * @param {string} time - The time to be converted.
145
+ * @return {*} {number} - The time converted to seconds.
146
+ */
147
+ declare function convertToSeconds(time?: string): number;
148
+
149
+ /**
150
+ * Creates a new Parser parser.
151
+ *
152
+ * @param onParse - Callback to invoke when a new event is parsed, or a new reconnection interval
153
+ * has been sent from the server
154
+ *
155
+ * @returns A new Parser parser, with `parse`, `end` and `reset` methods.
156
+ * @public
157
+ */
158
+ declare function create(options?: ParserOptions<AimSegments[], AimSegments[], string> & {
159
+ vad?: Segment[];
160
+ vadPadding?: [number, number];
161
+ }): Parser<string>;
162
+
163
+ declare function create_2(options?: ParserOptions<RequiredByKey<Partial<AimSegments>, "index">[], Partial<AimSegments>[], string>): Parser<string>;
164
+
165
+ declare function create_3(options?: ParserOptions<AimSegments[], AimSegments[], AimSegments[]> & {
166
+ sentenceLength?: number;
167
+ repeatString?: string[];
168
+ }): Parser<AimSegments[]>;
169
+
170
+ /**
171
+ * 检测文本中的所有可能语言
172
+ * 使用 tinyld 库进行多语言检测,返回按概率排序的语言列表
173
+ *
174
+ * @param {string} text - 需要检测语言的文本内容
175
+ * @return {LanguageDetectionResultsEntry[]} 返回检测到的所有语言及其概率,按概率从高到低排序
176
+ *
177
+ * @example
178
+ * ```typescript
179
+ * const results = detectAllLanguage("Hello world 你好世界");
180
+ * // 返回: [
181
+ * // { language: 'en', languageName: 'English', probability: 0.8 },
182
+ * // { language: 'zh', languageName: '中文', probability: 0.2 }
183
+ * // ]
184
+ * ```
185
+ */
186
+ declare function detectAllLanguage(text: string): LanguageDetectionResultsEntry[];
187
+
188
+ /**
189
+ * 检测文本的主要语言
190
+ * 使用 tinyld 库进行单语言检测,返回最可能的语言
191
+ *
192
+ * @param {string} text - 需要检测语言的文本内容
193
+ * @return {LanguageDetectionResultsEntry} 返回检测到的主要语言信息
194
+ *
195
+ * @example
196
+ * ```typescript
197
+ * const result = detectLanguage("Hello world");
198
+ * // 返回: { language: 'en', languageName: 'English', probability: 1 }
199
+ * ```
200
+ */
201
+ declare function detectLanguage(text: string): LanguageDetectionResultsEntry;
202
+
203
+ export declare namespace filter {
204
+ export {
205
+ StreamFilter
206
+ }
207
+ }
208
+
209
+ /**
210
+ * 将秒数转换为 xx:xx:xx.xxx 格式
211
+ *
212
+ * @export
213
+ * @param {number} seconds
214
+ * @return {*} {string}
215
+ */
216
+ declare function formatTime(seconds: number): string;
217
+
218
+ export declare type LanguageCode = "auto" | "none" | "zh" | "zh_cn" | "zh_tw" | "yue" | "en" | "ja" | "ko" | "fr" | "es" | "ru" | "de" | "it" | "tr" | "pt" | "vi" | "id" | "th" | "ms" | "ar" | "hi" | "ro" | "ug" | "uz" | "kk" | "az" | "ky" | "fa" | "tg";
219
+
220
+ /**
221
+ * 将语言代码转换为名称
222
+ *
223
+ * @export
224
+ * @param {LanguageCode} languageCode
225
+ * @return {*}
226
+ */
227
+ declare function languageCodeToName(languageCode: LanguageCode): string;
228
+
229
+ /**
230
+ * 语言检测结果条目接口
231
+ * 包含检测到的语言信息
232
+ */
233
+ declare interface LanguageDetectionResultsEntry {
234
+ /** 语言代码 (如 'zh', 'en', 'ja' 等) */
235
+ language: LanguageCode;
236
+ /** 语言名称 ( '中文', 'English', '日本語' 等) */
237
+ languageName: string;
238
+ /** 检测准确度概率 (0-1 之间的数值) */
239
+ probability: number;
240
+ }
241
+
242
+ declare interface OpenAIResult {
243
+ task: string;
244
+ language: string;
245
+ text: string;
246
+ words: {
247
+ word: string;
248
+ start: number;
249
+ end: number;
250
+ }[];
251
+ segments: {
252
+ text: string;
253
+ start: number;
254
+ end: number;
255
+ }[];
256
+ }
257
+
258
+ declare function openaiToAimSegments(json: OpenAIResult): Promise<AimSegments[]>;
259
+
260
+ export declare interface OptimizationOptions {
261
+ emt: boolean;
262
+ ep: boolean;
263
+ zf: boolean;
264
+ punc: boolean;
265
+ em: boolean;
266
+ space: boolean;
267
+ repeat: boolean;
268
+ }
269
+
270
+ /**
271
+ * 为数字前方自动补0到特定的位数,默认两位
272
+ */
273
+ declare function padNumber(num: number, length?: number): string;
274
+
275
+ /**
276
+ * Callback passed as the `onParse` callback to a parser
277
+ *
278
+ * @public
279
+ */
280
+ declare type ParseCallback<T> = (event: ParsedEvent<T>) => void;
281
+
282
+ declare interface ParsedEvent<T> {
283
+ type: "event";
284
+ event: "start" | "message" | "end";
285
+ data?: T;
286
+ }
287
+
288
+ /**
289
+ * Parser parser instance.
290
+ *
291
+ * Needs to be reset between reconnections/when switching data source, using the `reset()` method.
292
+ *
293
+ * @public
294
+ */
295
+ declare interface Parser<T = string> {
296
+ /**
297
+ * Feeds the parser another chunk. The method _does not_ return a parsed message.
298
+ * Instead, if the chunk was a complete message (or completed a previously incomplete message),
299
+ * it will invoke the `onParse` callback used to create the parsers.
300
+ *
301
+ * @param chunk - The chunk to parse. Can be a partial, eg in the case of streaming messages.
302
+ * @public
303
+ */
304
+ feed(chunk: T): void;
305
+ /**
306
+ * Resets the parser state. This is required when you have a new stream of messages -
307
+ * for instance in the case of a client being disconnected and reconnecting.
308
+ *
309
+ * @public
310
+ */
311
+ reset(): void;
312
+ end(): void;
313
+ }
314
+
315
+ export declare namespace parser {
316
+ export {
317
+ srtToAimSegments,
318
+ vttToAimSegments,
319
+ assToAimSegments,
320
+ tingwuToAimSegments,
321
+ openaiToAimSegments,
322
+ create as createWhisperStreamParser,
323
+ create_2 as createTranslateStreamParser,
324
+ create_3 as createSegmentStreamParser
325
+ }
326
+ }
327
+
328
+ /**
329
+ * `ParserOptions` 是一个泛型类型,用于配置解析器的回调函数。
330
+ *
331
+ * @template S - 解析开始时的状态类型
332
+ * @template P - 解析过程中使用的状态类型
333
+ * @template E - 解析结束时的状态类型
334
+ *
335
+ * @property {ParseCallback<S>} [onStart] - 解析开始时的回调函数
336
+ * @property {ParseCallback<P>} [onParse] - 解析过程中调用的回调函数
337
+ * @property {ParseCallback<P>} [onProgress] - 解析进度更新时的回调函数
338
+ * @property {ParseCallback<E>} [onEnd] - 解析结束时的回调函数
339
+ */
340
+ declare type ParserOptions<S, P, E> = {
341
+ onStart?: ParseCallback<S>;
342
+ onParse?: ParseCallback<P>;
343
+ onProgress?: ParseCallback<P>;
344
+ onEnd?: ParseCallback<E>;
345
+ };
346
+
347
+ export declare type PartialByKey<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
348
+
349
+ /**
350
+ * 重复内容检测器
351
+ *
352
+ * 用于检测字幕中连续重复的内容片段,当重复次数达到阈值时会触发回调
353
+ */
354
+ declare class RepeatCheck {
355
+ /** 重复检测阈值,默认为2次 */
356
+ threshold: number;
357
+ /** 当前重复次数 */
358
+ hit: number;
359
+ /** 前一个字幕片段 */
360
+ prevSegment?: AimSegments;
361
+ /** 当前重复的字幕片段 */
362
+ hitSegment?: AimSegments;
363
+ /** 重复片段列表 */
364
+ hitSegmentList: AimSegments[];
365
+ /** 配置选项 */
366
+ options: RepeatCheckOption;
367
+ /**
368
+ * 构造函数
369
+ * @param options 重复检测选项
370
+ */
371
+ constructor(options?: RepeatCheckOption);
372
+ /**
373
+ * 添加字幕片段进行重复检测
374
+ * @param segment 要检测的字幕片段
375
+ */
376
+ push(segment: AimSegments): void;
377
+ /**
378
+ * 结束检测,处理最后的重复片段
379
+ */
380
+ end(): void;
381
+ /**
382
+ * 重置检测器状态
383
+ */
384
+ reset(): void;
385
+ }
386
+
387
+ /**
388
+ * 重复检测选项接口
389
+ */
390
+ declare interface RepeatCheckOption {
391
+ /** 当检测到重复内容时的回调函数 */
392
+ onHit?: (segment: AimSegments[]) => void;
393
+ }
394
+
395
+ export declare type RequiredByKey<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
396
+
397
+ export declare type Segment = {
398
+ start: number;
399
+ end: number;
400
+ };
401
+
402
+ declare function splitToSentences(text: string, languageCode?: LanguageCode): string[];
403
+
404
+ declare function srtToAimSegments(text: string): Promise<AimSegments[]>;
405
+
406
+ declare class StreamFilter {
407
+ chains: Record<string, any>;
408
+ delimit: string;
409
+ onFilter?: (text: string) => any;
410
+ checked: boolean;
411
+ checkedText: string;
412
+ checkedLevel?: Record<string, any>;
413
+ filteredText: string;
414
+ constructor(onFilter?: (text: string) => any);
415
+ add(keyword: string, replaceText?: string): void;
416
+ parse(data: [string, string][]): void;
417
+ reParse(data: string[][]): void;
418
+ feed(c: string): void;
419
+ feedAll(text: string): string;
420
+ end(): string;
421
+ }
422
+
423
+ /**
424
+ * 字幕优化函数
425
+ *
426
+ * 对字幕片段进行全面的质量检查和优化,包括:
427
+ * - 重复内容检测和移除
428
+ * - 空白字幕处理
429
+ * - 0帧字幕处理(开始时间大于等于结束时间)
430
+ * - 标点符号检查
431
+ * - 句子结束标记检查
432
+ * - 多余空格处理
433
+ * - 结尾标点处理
434
+ *
435
+ * @export
436
+ * @param {AimSegments[]} segments - 需要优化的字幕片段数组
437
+ * @param {OptimizationOptions} [options] - 优化选项配置
438
+ * @return {Object} 返回优化结果,包含:
439
+ * - result: 各种问题的索引统计
440
+ * - repeat: 重复的片段列表
441
+ * - segments: 优化后的字幕片段数组
442
+ */
443
+ declare function subtitleOptimization(segments: AimSegments[], options?: OptimizationOptions): {
444
+ result: {
445
+ emt: number[];
446
+ ep: number[];
447
+ zf: number[];
448
+ punc: number[];
449
+ em: number[];
450
+ space: number[];
451
+ repeat: number[];
452
+ };
453
+ repeat: AimSegments[];
454
+ segments: AimSegments[];
455
+ };
456
+
457
+ /**
458
+ * 字幕优化使用的正则表达式
459
+ */
460
+ declare const subtitleOptimizationRegExp: {
461
+ /** 检测是否存在句子分割符号(逗号、句号、问号、感叹号等) */
462
+ punc: RegExp;
463
+ /** 检测是否存在行尾分割符号(句号、问号、感叹号等) */
464
+ em: RegExp;
465
+ /** 检测是否存在连续空白字符(行首行尾空白、多个连续空格) */
466
+ space: RegExp;
467
+ /** 检测是否存在行尾标点和可能存在的空格字符 */
468
+ ep: RegExp;
469
+ };
470
+
471
+ declare interface TingwuResult {
472
+ TaskId: string;
473
+ Transcription: {
474
+ AudioInfo: {
475
+ "Size": number;
476
+ "Duration": number;
477
+ "SampleRate": number;
478
+ "Language": string;
479
+ };
480
+ Paragraphs: {
481
+ ParagraphId: string;
482
+ SpeakerId: string;
483
+ Words: {
484
+ "Id": number;
485
+ "SentenceId": number;
486
+ "Start": number;
487
+ "End": number;
488
+ "Text": string;
489
+ }[];
490
+ }[];
491
+ };
492
+ }
493
+
494
+ declare function tingwuToAimSegments(json: TingwuResult): Promise<AimSegments[]>;
495
+
496
+ export declare namespace tools {
497
+ export {
498
+ subtitleOptimization,
499
+ RepeatCheckOption,
500
+ RepeatCheck,
501
+ subtitleOptimizationRegExp,
502
+ detectAllLanguage,
503
+ detectLanguage,
504
+ LanguageDetectionResultsEntry,
505
+ splitToSentences
506
+ }
507
+ }
508
+
509
+ export declare namespace utils {
510
+ export {
511
+ padNumber,
512
+ formatTime,
513
+ convertToSeconds,
514
+ containsCJKCharacters,
515
+ languageCodeToName,
516
+ chunkArrayStrings,
517
+ chunkSegmentStringsWithIndex,
518
+ consolidateSegments
519
+ }
520
+ }
521
+
522
+ declare function vttToAimSegments(text: string): Promise<AimSegments[]>;
523
+
524
+ export { }