如何使用 jq 从 Google 视频智能 API 语音转录 JSON 输出中提取具有多个说话人的脚本?



我正在测试谷歌视频智能语音转文本,用于转录有多个扬声器的播客剧集。

我提取了一个示例并将其发布到一个要点:output.json。

cat file.json | jq '.response.annotationResults[].speechTranscriptions[].alternatives[] | {startTime: .words[0].startTime, segment: .transcript }'

上面的命令将打印出每个段的startTime,以及段本身。 jq-output.json

{
"time": "6.400s",
"segment": "Hi, my name is Melinda Smith from Noble works. ...snip"
}
{
"time": "30s",
"segment": " Any Graham as a tool for personal and organizational ...snip"
}

我的目标是在我的 jq 输出中包含每个段的speakerTag

这就是我被困住的地方...首先,.alternatives[]中的每个数组都包含一个包含该段的字符串.transcript.confidence.words[]一个数组,其中包含该段的每个单词及其朗读时间。

JSON 的这一部分是我获取输出第一部分的方式。然后,在它遍历脚本的每个片段后,在底部,它有一个最后一个.alternatives[]数组,包含(再次(整个脚本中的每个单词,一次一个,以及它的 startTime、endTime 和 speakerTag。

下面是我的意思的简化示例:

speechTranscriptions:
alternatives:
transcript: "Example transcript segment"
words:
word: "Example"; startTime: 0s;
word: "transcript"; startTime: 1s;
word: "segment"; startTime: 2s;
alternatives:
transcript: "Another transcript segment"
words:
word: "Another"; startTime: 3s;
word: "transcript"; startTime: 4s;
word: "segment"; startTime: 5s;
alternatives:
words:
word: "Example"; startTime: 0s; speakerTag: 1;
word: "transcript"; startTime: 1s; speakerTag: 1;
word: "segment"; startTime: 2s; speakerTag: 1;
word: "Another"; startTime: 3s; speakerTag: 2;
word: "transcript"; startTime: 4s; speakerTag: 2;
word: "segment"; startTime: 5s; speakerTag: 2;

我的想法是以某种方式通过jq-output.json,并将每个startTime与原始视频智能API输出中的相应speakerTag相匹配。

.response.annotationResults[].speechTranscriptions[].alternatives[] | ( if .words[].speakerTag then {time: .words[].startTime, speaker: .words[].speakerTag} else empty end)

我尝试了几种变体,想法是只打印出开始时间和 speakerTag,然后在下一步中匹配值。我的问题是不理解如何只打印 startTime,如果它有一个相应的扬声器标签。

如评论中所述,最好在一个命令中生成此结果,但我只是试图将问题分解为我可以尝试理解的部分。

我的问题是不理解如何只打印 startTime,如果它有一个相应的 speakerTag。

这可以使用过滤器完成:

.response.annotationResults[].speechTranscriptions[].alternatives[].words[]
| select(.speakerTag)
| {time: .startTime, speaker: .speakerTag}

因此,也许以下是主要问题的解决方案(或至少接近解决方案(:

.response.annotationResults[].speechTranscriptions[].alternatives[]
| (INDEX(.words[] | select(.speakerTag); .startTime) | map_values(.speakerTag)) as $dict
| {startTime: .words[0].startTime, segment: .transcript}
| . + {speaker: $dict[.startTime]}

最新更新