【问题标题】:How do I extract transcript with multiple speakers from Google Video Intelligence API Speech Transcription JSON output using jq?如何使用 jq 从 Google Video Intelligence API Speech Transcription JSON 输出中提取多个发言者的成绩单?
【发布时间】:2020-05-10 13:32:03
【问题描述】:

我正在测试 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"
}

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

这是我卡住的地方...开始,.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)

我尝试了一些变体,目的是只打印开始时间和扬声器标签,然后在下一步中匹配这些值。我的问题是不了解如何仅在 startTime 具有相应的 speakerTag 时打印它。

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

【问题讨论】:

  • 只需包含输入/输出示例和失败的尝试,并简要说明问题。这太长太宽了
  • 不幸的是,考虑到 JSON 要点的大小和复杂性,不清楚您所说的“最终 .alternatives[] 数组中的底部”是什么意思。由于您似乎对原始 JSON 的结构有很好的理解,因此您应该很容易提供一段非常简洁的 JSON 来抓住问题的本质。另请注意,根据您的描述,几乎可以肯定,最好只使用一次 jq 调用来执行整个任务。
  • 好点@peak我在问题中添加了一个简化的想法,以及相应的trimmed-output.json gist,以进行澄清。

标签: google-cloud-platform zsh jq video-intelligence-api google-speech-to-text-api


【解决方案1】:

我的问题是不了解如何仅在 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]}

【讨论】:

  • 我将其标记为正确,因为我意识到我什至没有正确地提出我的问题。基本上我应该忽略未被扬声器划分的部分,而只处理下半部分。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 2015-12-28
相关资源
最近更新 更多