JavaScript如何将带时间戳的转录文本处理为标准化字幕格式
转录文本转字幕格式化实现思路
不要尝试用单个正则一次性匹配开始时间、文本、结束时间三个字段,场景兼容性会很差。最优实现思路分两步走:
- 第一步:先提取全文所有时间戳的位置和值,拿到按出现顺序排序的时间戳列表,每个元素包含时间戳内容、在原字符串中的起始位置、结束位置
- 第二步:遍历时间戳列表,两两配对为「开始时间-结束时间」,两个时间戳之间的所有字符串就是对应条目的Text内容,清洗空白后为空的条目直接丢弃即可
完整实现代码
function parseTranscript(str) { // 时间戳正则,可根据实际格式自行调整适配不同时间戳写法 const timeReg = /\[?([01]\d|2[0-3]|\d):([0-5]\d):([0-5]\d)(?:\.(\d{2,3}))?\]?/g // 提取所有时间戳的完整信息 const timeStamps = Array.from(str.matchAll(timeReg)).map(match => ({ value: match[0], start: match.index, end: match.index + match[0].length })) const result = [] // 两两配对处理时间戳和对应文本 for (let i = 0; i < timeStamps.length - 1; i++) { const curr = timeStamps[i] const next = timeStamps[i+1] // 截取两个时间戳之间的文本并清洗空白 const text = str.slice(curr.end, next.start).trim() // 过滤空文本的无效条目 if (text) { result.push({ Start: curr.value, End: next.value, Text: text }) } } // 如需处理最后一个时间戳(无后续时间戳作为结束时间的场景),可在这里补充自定义逻辑 return result } // 测试用例 const testStr = `[09:35:10.00] 1. Lorem ipsum... [09:35:13.11] [09:35:15.14] 2. sed do eiusmod... [09:35:39.20] 3. anim id est laborum... [09:35:43.17]` console.log(parseTranscript(testStr))
运行输出示例
[ { Start: '[09:35:10.00]', End: '[09:35:13.11]', Text: '1. Lorem ipsum...' }, { Start: '[09:35:15.14]', End: '[09:35:39.20]', Text: '2. sed do eiusmod...' }, { Start: '[09:35:39.20]', End: '[09:35:43.17]', Text: '3. anim id est laborum...' } ]
自定义调整说明
- 可根据实际遇到的时间戳格式修改
timeReg正则,只要能正确匹配所有时间戳即可,适配性远高于一次性匹配多字段的正则 - 文本清洗规则可自行扩展,比如去掉行首序号、替换多余换行、过滤特殊字符等
- 最后一个时间戳没有后续时间戳作为结束时间的场景,可自行补充逻辑,比如设置固定延长时长、直接取当前时间戳加固定偏移作为结束时间等
内容的提问来源于stack exchange,提问作者TrevorA
相关产品推荐
相关产品推荐

