如何使用 jq 从 Google Video Intelligence API Speech Transcription JSON 输出中提取多个说话人的文字记录?
How do I extract transcript with multiple speakers from Google Video Intelligence API Speech Transcription JSON output using jq?
我正在测试 Google Video Intelligence speech-to-text 以转录多位演讲者的播客剧集。
我提取了一个示例并将其发布到要点: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"
}
我的目标是让每个段的 speakerTag
包含在我的 jq 输出中。
这就是我卡住的地方...首先,.alternatives[]
中的每个数组都包含 .transcript
一个包含该段的字符串,.confidence
和 .words[]
一个数组,其中包含该段的每个单词以及说出的时间。
JSON 的那部分是我如何获得输出的第一部分。然后,在它遍历了抄本的每一段之后,在底部,它有一个最后的 .alternatives[]
数组,(再次)包含整个抄本中的每个单词,一次一个,连同它的开始时间、结束时间、和 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
与其在原始 Video Intelligence API 输出中找到的对应 speakerTag
相匹配。
.response.annotationResults[].speechTranscriptions[].alternatives[] | ( if .words[].speakerTag then {time: .words[].startTime, speaker: .words[].speakerTag} else empty end)
我尝试了一些变体,想法是只打印开始时间和 speakerTag,然后在下一步中匹配这些值。我的问题是不理解如何只打印具有相应 speakerTag 的 startTime。
如评论中所述,最好在一个命令中生成此结果,但我只是试图将问题分解为我可以尝试理解的部分。
My problem was not understanding how to only print the startTime if it has a corresponding 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]}
我正在测试 Google Video Intelligence speech-to-text 以转录多位演讲者的播客剧集。
我提取了一个示例并将其发布到要点: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"
}
我的目标是让每个段的 speakerTag
包含在我的 jq 输出中。
这就是我卡住的地方...首先,.alternatives[]
中的每个数组都包含 .transcript
一个包含该段的字符串,.confidence
和 .words[]
一个数组,其中包含该段的每个单词以及说出的时间。
JSON 的那部分是我如何获得输出的第一部分。然后,在它遍历了抄本的每一段之后,在底部,它有一个最后的 .alternatives[]
数组,(再次)包含整个抄本中的每个单词,一次一个,连同它的开始时间、结束时间、和 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
与其在原始 Video Intelligence API 输出中找到的对应 speakerTag
相匹配。
.response.annotationResults[].speechTranscriptions[].alternatives[] | ( if .words[].speakerTag then {time: .words[].startTime, speaker: .words[].speakerTag} else empty end)
我尝试了一些变体,想法是只打印开始时间和 speakerTag,然后在下一步中匹配这些值。我的问题是不理解如何只打印具有相应 speakerTag 的 startTime。
如评论中所述,最好在一个命令中生成此结果,但我只是试图将问题分解为我可以尝试理解的部分。
My problem was not understanding how to only print the startTime if it has a corresponding 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]}