首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用jq从Google视频智能API语音转录JSON输出中提取多个说话人的文字记录?

如何使用jq从Google视频智能API语音转录JSON输出中提取多个说话人的文字记录?
EN

Stack Overflow用户
提问于 2020-05-10 13:32:03
回答 1查看 250关注 0票数 0

我正在测试谷歌视频智能语音到文字在多个演讲者中转录播客节目的功能。

我已经提取了一个例子,并将其发布给了一个要点:output.json

代码语言:javascript
运行
复制
cat file.json | jq '.response.annotationResults[].speechTranscriptions[].alternatives[] | {startTime: .words[0].startTime, segment: .transcript }'

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

代码语言:javascript
运行
复制
{
  "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。

下面是一个简单的例子,说明我的意思:

代码语言:javascript
运行
复制
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进行匹配。

代码语言:javascript
运行
复制
.response.annotationResults[].speechTranscriptions[].alternatives[] | ( if .words[].speakerTag then {time: .words[].startTime, speaker: .words[].speakerTag} else empty end)

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

正如注释中提到的,最好在一个命令中生成这个结果,但我只是试图将问题分解成我可以尝试理解的部分。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-11 06:36:23

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

这可以使用过滤器来完成:

代码语言:javascript
运行
复制
.response.annotationResults[].speechTranscriptions[].alternatives[].words[]
 | select(.speakerTag)
 | {time: .startTime, speaker: .speakerTag}

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

代码语言:javascript
运行
复制
.response.annotationResults[].speechTranscriptions[].alternatives[]
| (INDEX(.words[] | select(.speakerTag); .startTime) | map_values(.speakerTag)) as $dict
| {startTime: .words[0].startTime, segment: .transcript}
| . + {speaker: $dict[.startTime]}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61712885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档