我正在测试谷歌视频智能语音到文字在多个演讲者中转录播客节目的功能。
我已经提取了一个例子,并将其发布给了一个要点: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**for段都包含。**
我被困在这里..。首先,.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,如果它有相应的speakerTag。
正如注释中提到的,最好在一个命令中生成这个结果,但我只是试图将问题分解成我可以尝试理解的部分。
发布于 2020-05-11 06:36:23
我的问题是不了解如何只打印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]}https://stackoverflow.com/questions/61712885
复制相似问题