如何用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
相关产品推荐
相关产品推荐

