如何用PHP截取JSON对象切片并提取指定时间范围的转录内容?
解决Amazon Transcribe JSON指定时间范围的文本提取问题
我来帮你搞定这个头疼的提取问题!之前用ksort、slice这些方法没成功,大概率是没摸透Amazon Transcribe的JSON结构——它的转录内容不是简单的线性数组,而是拆成了词汇和标点的独立条目,还有特殊的时间戳规则,得针对性处理。
核心思路
Amazon Transcribe的转录结果存在results.items数组里,每个条目要么是带时间戳的词汇,要么是不带时间戳的标点。我们需要:
- 遍历所有条目,筛选出时间落在
100-160秒区间内的词汇(包括和区间有重叠的片段) - 把关联的标点和对应词汇拼接,最后整合成连贯文本
具体PHP代码实现
// 假设$transcribeJson是你拿到的Amazon Transcribe原始JSON字符串 $transcribeData = json_decode($transcribeJson, true); $filteredContent = []; $targetStartTime = 100; $targetEndTime = 160; foreach ($transcribeData['results']['items'] as $item) { // 处理带时间戳的词汇条目 if (isset($item['start_time'], $item['end_time'])) { $itemStart = (float)$item['start_time']; $itemEnd = (float)$item['end_time']; // 判断当前词汇的时间段是否和目标区间有重叠(避免遗漏边缘内容) if ($itemStart <= $targetEndTime && $itemEnd >= $targetStartTime) { $filteredContent[] = $item['alternatives'][0]['content']; } } else { // 处理标点:如果前一个词汇在目标范围内,就把标点拼到该词汇后面 $lastItemIndex = count($filteredContent) - 1; if ($lastItemIndex >= 0) { $filteredContent[$lastItemIndex] .= $item['alternatives'][0]['content']; } } } // 把筛选后的内容拼接成最终文本 $extractedText = implode(' ', $filteredContent); echo $extractedText;
为什么之前的方法行不通?
ksort:Amazon Transcribe的条目本身就是按时间顺序排列的,排序完全没必要slice:切片是按数组索引截取,但目标时间对应的条目索引是不确定的,没法直接用索引切片- 忽略了标点的特殊处理:标点没有时间戳,必须和前面的词汇绑定,直接提取会导致文本格式混乱
内容的提问来源于stack exchange,提问作者Esteban Gorupicz
相关产品推荐
相关产品推荐

