如何无需复杂时间逻辑提取AWS Amazon Transcribe Medical输出JSON中的各说话人文本
如何从AWS Transcribe Medical输出中快速按说话人提取文本?
嘿,我懂你不想折腾那些时间戳匹配的复杂逻辑——毕竟谁愿意对着一堆时间值反复比对呢?这里有个省心的Python实现方案,能帮你直接按说话人整理出对应的文本,不用费脑子写复杂逻辑:
实现思路
我们可以利用输出里的speaker_labels分段信息,结合已经按时间顺序排列好的全局items列表,自动把每个说话人分段对应的文本内容提取出来,时间匹配的逻辑已经封装在代码里,你不用手动处理:
def get_speaker_text(transcribe_output): # 先整理全局items,把单词和对应的时间范围关联,同时处理标点 processed_items = [] for item in transcribe_output["items"]: if item["type"] == "pronunciation": # 提取单词的时间范围和内容 start = float(item["start_time"]) end = float(item["end_time"]) content = item["alternatives"][0]["content"] processed_items.append((start, end, content)) elif item["type"] == "punctuation": # 把标点附加到前一个单词末尾,让文本更连贯 punctuation = item["alternatives"][0]["content"] if processed_items: last_start, last_end, last_content = processed_items[-1] processed_items[-1] = (last_start, last_end, last_content + punctuation) # 初始化每个说话人的文本容器 speaker_text = { f"spk_{i}": "" for i in range(transcribe_output["speaker_labels"]["speakers"]) } # 遍历每个说话人分段,收集对应文本 for segment in transcribe_output["speaker_labels"]["segments"]: speaker = segment["speaker_label"] seg_start = float(segment["start_time"]) seg_end = float(segment["end_time"]) # 收集该分段时间范围内的所有单词 segment_words = [] for item_start, item_end, content in processed_items: # 判断单词是否落在分段时间范围内(简单的重叠判断) if item_start <= seg_end and item_end >= seg_start: segment_words.append(content) # 把收集到的内容追加到对应说话人的文本里 if segment_words: speaker_text[speaker] += " ".join(segment_words) + " " # 整理成你想要的输出格式 result_lines = [] for speaker, text in speaker_text.items(): result_lines.append(f"{speaker} : {text.strip()}") return "\n".join(result_lines)
使用方式
你只需要把AWS Transcribe Medical返回的完整JSON数据传入这个函数,就能直接得到目标格式的结果:
# 假设transcribe_json是你获取到的输出数据 final_output = get_speaker_text(transcribe_json) print(final_output)
这个方法把繁琐的时间匹配逻辑都封装好了,你不用手动去比对每个单词和分段的时间,调用函数就能轻松得到按说话人分类的文本啦。
内容的提问来源于stack exchange,提问作者Gabi Rousine
相关产品推荐
相关产品推荐

