You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用spaCy分割WhisperX词级字典文本并保留时间戳关联?

使用spaCy对WhisperX词级结果分句并保留时间戳关联

要实现用spaCy分句同时保留WhisperX的词级时间戳关联,核心是通过字符位置建立文本与原词项的映射,具体步骤如下:

1. 预处理词级数据,构建完整文本与字符位置映射

先把WhisperX返回的所有词拼接成完整文本,同时记录每个词在拼接文本中的字符起止位置——这是后续关联的关键。

import spacy

# 替换为你的WhisperX词级数据
word_level_data = [
    {"text": "So", "start": 27.80031007751938, "end": 27.940671834625324},
    {"text": "we've", "start": 27.98077519379845, "end": 28.201343669250647},
    {"text": "got", "start": 28.301602067183463, "end": 28.502118863049095},
    {"text": "enough", "start": 28.58232558139535, "end": 28.842997416020673},
    {"text": "books.", "start": 28.983359173126615, "end": 29.223979328165374},
    # ... 剩余词项
]

full_text = ""
word_char_mapping = []  # 存储每个词的字符位置与原数据的关联

for word_item in word_level_data:
    char_start = len(full_text)
    # 词之间加空格(根据WhisperX输出调整,确保拼接文本连贯)
    full_text += word_item["text"] + " "
    char_end = len(full_text) - 1  # 去掉最后添加的空格
    word_char_mapping.append({
        "original_word": word_item,
        "char_start": char_start,
        "char_end": char_end
    })

full_text = full_text.strip()  # 清理末尾多余空格

2. 用spaCy处理文本,获取分句及token字符位置

加载spaCy模型处理完整文本,提取每个句子的字符范围和内部token的位置信息:

# 加载对应语言模型,英文用en_core_web_sm,中文用zh_core_web_sm
nlp = spacy.load("en_core_web_sm")
doc = nlp(full_text)

spaicy_sent_info = []
for sent in doc.sents:
    sent_token_pos = []
    for token in sent:
        sent_token_pos.append({
            "text": token.text,
            "char_start": token.idx,
            "char_end": token.idx + len(token.text)
        })
    spaicy_sent_info.append({
        "sentence": sent.text,
        "char_start": sent.start_char,
        "char_end": sent.end_char,
        "tokens": sent_token_pos
    })

3. 关联分句与原WhisperX词级数据

遍历每个spaCy分句,通过字符位置匹配对应的WhisperX词项,最终得到带完整时间戳的分句结果:

final_result = []
for sent_info in spaicy_sent_info:
    matched_words = []
    # 匹配当前句子范围内的所有词项
    for word_map in word_char_mapping:
        # 判断词的字符范围是否完全落在句子的字符区间内
        if word_map["char_start"] >= sent_info["char_start"] and word_map["char_end"] <= sent_info["char_end"]:
            matched_words.append(word_map["original_word"])
    
    if matched_words:
        final_result.append({
            "sentence_text": sent_info["sentence"],
            "start_time": matched_words[0]["start"],  # 句子起始时间取第一个词的start
            "end_time": matched_words[-1]["end"],    # 句子结束时间取最后一个词的end
            "word_level_details": matched_words      # 保留原词级时间戳数据
        })

# 打印结果示例
for item in final_result:
    print(f"句子: {item['sentence_text']}")
    print(f"起止时间: {item['start_time']} - {item['end_time']}")
    print("词级详情:", item['word_level_details'], "\n")

关键注意事项

  • 空格一致性:拼接文本时的空格要和WhisperX输出的词间逻辑一致,避免字符位置偏移导致匹配失败。
  • 模型适配:根据处理的语言选择对应spaCy模型,确保分句准确性。
  • 边界兼容:如果出现词与spaCy token的字符位置不完全对齐的情况,可以调整匹配逻辑(如判断词的字符范围与句子范围是否有重叠)。

内容的提问来源于stack exchange,提问作者Dom I Yes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:45:38