语音转文本 - 将说话者标签映射到 JSON 响应中相应的文字记录

2024-03-15

每隔一段时间就会出现一段 JSON 数据,这会带来挑战,可能需要数小时才能从中提取所需的信息。我有以下由 Speech To Text API 引擎生成的 JSON 响应。

它显示了文字记录、每个单词的发音以及每个说话者的时间戳和说话者标签speaker 0 and speaker 2谈话中。

   {
    "results": [
        {
            "alternatives": [
                {
                    "timestamps": [
                        [
                            "the",
                            6.18,
                            6.63
                        ],
                        [
                            "weather",
                            6.63,
                            6.95
                        ],
                        [
                            "is",
                            6.95,
                            7.53
                        ],
                        [
                            "sunny",
                            7.73,
                            8.11
                        ],
                        [
                            "it's",
                            8.21,
                            8.5
                        ],
                        [
                            "time",
                            8.5,
                            8.66
                        ],
                        [
                            "to",
                            8.66,
                            8.81
                        ],
                        [
                            "sip",
                            8.81,
                            8.99
                        ],
                        [
                            "in",
                            8.99,
                            9.02
                        ],
                        [
                            "some",
                            9.02,
                            9.25
                        ],
                        [
                            "cold",
                            9.25,
                            9.32
                        ],
                        [
                            "beer",
                            9.32,
                            9.68
                        ]
                    ],
                    "confidence": 0.812,
                    "transcript": "the weather is sunny it's time to sip in some cold beer "
                }
            ],
            "final": "True"
        },
        {
            "alternatives": [
                {
                    "timestamps": [
                        [
                            "sure",
                            10.52,
                            10.88
                        ],
                        [
                            "that",
                            10.92,
                            11.19
                        ],
                        [
                            "sounds",
                            11.68,
                            11.82
                        ],
                        [
                            "like",
                            11.82,
                            12.11
                        ],
                        [
                            "a",
                            12.32,
                            12.96
                        ],
                        [
                            "plan",
                            12.99,
                            13.8
                        ]
                    ],
                    "confidence": 0.829,
                    "transcript": "sure that sounds like a plan"
                }
            ],
            "final": "True"
        }
    ],
    "result_index":0,
    "speaker_labels": [
        {
            "from": 6.18,
            "to": 6.63,
            "speaker": 0,
            "confidence": 0.475,
            "final": "False"
        },
        {
            "from": 6.63,
            "to": 6.95,
            "speaker": 0,
            "confidence": 0.475,
            "final": "False"
        },
        {
            "from": 6.95,
            "to": 7.53,
            "speaker": 0,
            "confidence": 0.475,
            "final": "False"
        },
        {
            "from": 7.73,
            "to": 8.11,
            "speaker": 0,
            "confidence": 0.499,
            "final": "False"
        },
        {
            "from": 8.21,
            "to": 8.5,
            "speaker": 0,
            "confidence": 0.472,
            "final": "False"
        },
        {
            "from": 8.5,
            "to": 8.66,
            "speaker": 0,
            "confidence": 0.472,
            "final": "False"
        },
        {
            "from": 8.66,
            "to": 8.81,
            "speaker": 0,
            "confidence": 0.472,
            "final": "False"
        },
        {
            "from": 8.81,
            "to": 8.99,
            "speaker": 0,
            "confidence": 0.472,
            "final": "False"
        },
        {
            "from": 8.99,
            "to": 9.02,
            "speaker": 0,
            "confidence": 0.472,
            "final": "False"
        },
        {
            "from": 9.02,
            "to": 9.25,
            "speaker": 0,
            "confidence": 0.472,
            "final": "False"
        },
        {
            "from": 9.25,
            "to": 9.32,
            "speaker": 0,
            "confidence": 0.472,
            "final": "False"
        },
        {
            "from": 9.32,
            "to": 9.68,
            "speaker": 0,
            "confidence": 0.472,
            "final": "False"
        },
        {
            "from": 10.52,
            "to": 10.88,
            "speaker": 2,
            "confidence": 0.441,
            "final": "False"
        },
        {
            "from": 10.92,
            "to": 11.19,
            "speaker": 2,
            "confidence": 0.364,
            "final": "False"
        },
        {
            "from": 11.68,
            "to": 11.82,
            "speaker": 2,
            "confidence": 0.372,
            "final": "False"
        },
        {
            "from": 11.82,
            "to": 12.11,
            "speaker": 2,
            "confidence": 0.372,
            "final": "False"
        },
        {
            "from": 12.32,
            "to": 12.96,
            "speaker": 2,
            "confidence": 0.383,
            "final": "False"
        },
        {
            "from": 12.99,
            "to": 13.8,
            "speaker": 2,
            "confidence": 0.428,
            "final": "False"
        }
    ]
}

请原谅缩进问题(如果有),但 JSON 是有效的,并且我一直在尝试将每个文字记录与其相应的说话者标签进行映射。

我想要像下面这样的东西。上面的 JSON 大约有 20,000 行,根据时间戳和单词发音提取说话者标签并将其与transcript.

[
    {
        "transcript": "the weather is sunny it's time to sip in some cold beer ",
        "speaker" : 0
    },
    {
        "transcript": "sure that sounds like a plan",
        "speaker" : 2
    }

]  

到目前为止我尝试过的: JSON 数据存储在名为example.json。我已经能够将每个单词及其相应的时间戳和说话者标签放入元组列表中(参见下面的输出):

import json
# with open('C:\\Users\\%USERPROFILE%\\Desktop\\example.json', 'r') as f:
    # data = json.load(f)

l1 = []
l2 = []
l3 = []

for i in data['results']:
    for j in i['alternatives'][0]['timestamps']:
        l1.append(j)

for m in data['speaker_labels']:
     l2.append(m)

for q in l1:
    for n in l2:
        if q[1]==n['from']:
            l3.append((q[0],n['speaker'], q[1], q[2]))
print(l3)

这给出了输出:

 [('the', 0, 6.18, 6.63),
 ('weather', 0, 6.63, 6.95),
 ('is', 0, 6.95, 7.53),
 ('sunny', 0, 7.73, 8.11),
 ("it's", 0, 8.21, 8.5),
 ('time', 0, 8.5, 8.66),
 ('to', 0, 8.66, 8.81),
 ('sip', 0, 8.81, 8.99),
 ('in', 0, 8.99, 9.02),
 ('some', 0, 9.02, 9.25),
 ('cold', 0, 9.25, 9.32),
 ('beer', 0, 9.32, 9.68),
 ('sure', 2, 10.52, 10.88),
 ('that', 2, 10.92, 11.19),
 ('sounds', 2, 11.68, 11.82),
 ('like', 2, 11.82, 12.11),
 ('a', 2, 12.32, 12.96),
 ('plan', 2, 12.99, 13.8)]

但现在我不确定如何根据时间戳比较将单词关联在一起,并将每组单词“存储”起来,以与其说话者标签再次形成文字记录。

我还设法在列表中获取文字记录,但现在如何从上面的列表中提取每个文字记录的说话者标签。扬声器标签speaker 0 and speaker 2不幸的是,我希望它们能代表每个单词transcript反而。

for i in data['results']:
    l4.append(i['alternatives'][0]['transcript'])

这给出了输出:

["the weather is sunny it's time to sip in some cold beer ",'sure that sounds like a plan']

我已尽力解释该问题,但我愿意接受任何反馈,并会在必要时进行更改。另外,我很确定有更好的方法来解决这个问题,而不是列出多个列表,非常感谢任何帮助。

对于更大的数据集,请参阅pastebin https://pastebin.com/KrnPXuFx。我希望这个数据集能够对性能基准测试有所帮助。如果可用或需要的话,我可以提供更大的数据集。

当我处理大型 JSON 数据时,性能是一个重要因素,同样在重叠转录中准确实现说话者隔离是另一个要求。


使用 pandas,这就是我刚才解决的方法。

假设数据存储在名为的字典中data

import pandas as pd

labels = pd.DataFrame.from_records(data['speaker_labels'])

transcript_tstamps = pd.DataFrame.from_records(
    [t for r in data['results'] 
       for a in r['alternatives'] 
       for t in a['timestamps']], 
    columns=['word', 'from', 'to']
)
# this list comprehension more-efficiently de-nests the dictionary into
# records that can be used to create a DataFrame

df = labels.merge(transcript_tstamps)
# produces a dataframe of speakers to words based on timestamps from & to
# since I knew I wanted to merge on the from & to columns, 
# I named the columns thus when I created the transcript_tstamps data frame
# like this:
    confidence  final   from  speaker     to     word
0        0.475  False   6.18        0   6.63      the
1        0.475  False   6.63        0   6.95  weather
2        0.475  False   6.95        0   7.53       is
3        0.499  False   7.73        0   8.11    sunny
4        0.472  False   8.21        0   8.50     it's
5        0.472  False   8.50        0   8.66     time
6        0.472  False   8.66        0   8.81       to
7        0.472  False   8.81        0   8.99      sip
8        0.472  False   8.99        0   9.02       in
9        0.472  False   9.02        0   9.25     some
10       0.472  False   9.25        0   9.32     cold
11       0.472  False   9.32        0   9.68     beer
12       0.441  False  10.52        2  10.88     sure
13       0.364  False  10.92        2  11.19     that
14       0.372  False  11.68        2  11.82   sounds
15       0.372  False  11.82        2  12.11     like
16       0.383  False  12.32        2  12.96        a
17       0.428  False  12.99        2  13.80     plan

说话人和单词数据连接后,需要将同一说话人的连续单词分组在一起才能得出当前说话人。例如,如果扬声器阵列看起来像 [2,2,2,2,0,0,0,2,2,2,0,0,0,0],我们需要将前四个分组2在一起,然后是接下来的三个0,然后三个2然后剩下的0.

对数据进行排序['from', 'to']然后为此设置一个虚拟变量current_speaker像这样:

df = df.sort_values(['from', 'to'])
df['current_speaker'] = (df.speaker.shift() != df.speaker).cumsum()

从这里开始,按current_speaker,将单词聚合成一个句子并转换为 json。有一些额外的重命名来修复输出 json 键

transcripts = df.groupby('current_speaker').agg({
   'word': lambda x: ' '.join(x),
   'speaker': min
}).rename(columns={'word': 'transcript'})
transcripts[['speaker', 'transcript']].to_json(orient='records')
# produces the following output (indentation added by me for legibility):
'[{"speaker":0,
  "transcript":"the weather is sunny it\'s time to sip in some cold beer"},    
 {"speaker":2,
  "transcript":"sure that sounds like a plan"}]'

要在转录开始/结束时添加其他数据,您可以将 from/to 的最小/最大添加到 groupby

transcripts = df.groupby('current_speaker').agg({
   'word': lambda x: ' '.join(x),
   'speaker': min,
   'from': min,
   'to': max
}).rename(columns={'word': 'transcript'})

此外,(尽管这不适用于此示例数据集)您也许应该为每个时间片选择具有最高置信度的替代方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

语音转文本 - 将说话者标签映射到 JSON 响应中相应的文字记录 的相关文章

随机推荐

  • 检测实时应用程序中死锁的方法

    在实时多线程应用程序中检测死锁的方法有哪些 如果我们发现存在死锁 是否有任何方法可以解决它 而无需关闭 重新启动应用程序 有两种流行的方法来检测死锁 一种是让线程设置检查点 例如 如果您有一个具有工作循环的线程 您可以在开始工作时设置一个计
  • Scala 脚本无法在 Ubuntu 上运行

    我有一个以前可以工作的 Scala 脚本 当我尝试在新 PC 上运行它时 编译失败 所以我做了简单的脚本来测试 bin sh exec scala J Xmx2g 0 println test 尝试运行它我得到 test scala err
  • 从谷歌地图中的纬度和经度获取位置地址

    我想在点击谷歌地图并获取纬度和经度后从他们那里获取位置并将其 地址 放入字段中input searchTextField 我该怎么办 我尝试过 但不适合我 DEMO http jsfiddle net DXkZJ http jsfiddle
  • 批量更新 Excel 文件连接字符串

    我们最近更改了 SQL 数据库服务器 我想知道是否有脚本或更简单的方法来更新所有 Excel 文件连接字符串 如果他们使用连接文件会容易得多 但不幸的是它们都是手动设置的 我们有大约 600 份报告 任何帮助深表感谢 Thanks Nick
  • 将多边形转换为网格

    我有很多多边形 理想情况下 所有多边形不得相互重叠 但它们可以彼此相邻 但实际上 我必须考虑到slight多边形重叠 由一定的公差定义 因为所有这些多边形都是从用户手绘输入获得的 这并不像我希望的那样机器精确 我的问题是 是否有任何软件库组
  • MicroMeter:删除/禁用某个标签

    我正在使用默认的 MicroMeter 活页夹 其中之一用于创建仪表jvm memory used 问题是它带有 2 个可用标签 area 和 id 这实际上生成了 6 个我不感兴趣的仪表 我能够做到这一点 Bean public Mete
  • 如何检查 Botframework 上的对话框堆栈

    我正在实现一个反馈对话框 并且想使用IScorable然后关掉 反馈 这个词并推动我的FeedbackDialog到堆栈上 我不希望在收集用户反馈时出现这种行为 有没有办法确定我的FeedbackDialog已经在堆栈上了吗 那么我不会不小
  • Python 中的数据结构

    names Peter John size X M L list price 1 2 3 4 5 6 There are 2 people will buy 3 size of shirt 我想将我的数据结构创建为 name u Peter
  • CakePHP 通过 Auth 记住我

    我已经成功使用了 Auth 但不幸的是 它似乎只适用于 Session 我希望如果用户选中 记住我 复选框 我将使用 Cookie 并且他将登录 2 周 我在官方书籍中找不到任何内容 在谷歌中我只找到了很少而且不是很好的博客文章 有没有办法
  • 领域驱动设计和 IoC/依赖注入

    我现在正在尝试应用我学到的有关 DDD 的知识 但我对域模型中的依赖关系流有点困惑 我的问题是 实体是否应该了解域中的工厂 存储库 服务 存储库应该了解域中的服务吗 另一件困扰我的事情是当我想向集合添加实体时如何处理集合 假设我正在开发一个
  • 如何使用 Owin Katana 记录器

    我在 Microsoft Owin 项目中的此类文件中看到正在调用记录器 https github com aspnet AspNetKatana blob dev src Microsoft Owin Security OpenIdCon
  • 分割字符串并修剪每个元素

    是否有任何库 API 或正则表达式模式可以在某些分隔符上拆分字符串并自动修剪每个元素的前导和尾随空格 而无需循环元素 例如 在分割时 A B C D E on 所需的输出是 A B C D E 我得到的最接近的是str split s s
  • 如何在创建帐户时向用户分配角色

    我正在使用 ASP NET 内置成员资格和角色提供程序 在我的应用程序中 管理员为用户创建帐户 目前我正在通过访问 ASP NET 配置网站来分配角色 请告诉我如何在创建用户帐户 API 中添加选择角色的额外步骤 Thanks 您只是问如何
  • 429 请求太多 - Angular 7 - 多个文件上传

    当我尝试同时上传数百个以上的文件时 我遇到了这个问题 API 接口仅适用于一个文件 因此我必须调用发送每个文件的服务 现在我有这个 onFilePaymentSelect event void if event target files l
  • 当我使用模板时,我的文字方向写错了

    我想使用 Rails 在现有 PDF 上添加文本 所以我这样做了 filename Rails root app assets images sample pdf Prawn Document generate Rails root app
  • 选择器无效:xpath 表达式“//*[@id='topstuff']/div/div/p[1]/text()[2]”的结果是:使用 XPath 和 Selenium 的 [object Text]

    我在理解如何执行此操作时遇到很多问题 我需要做的很简单 就是每当我的自动谷歌搜索无法找到任何搜索结果时进行标记 我的代码示例 driver webdriver Chrome executable path driver get https
  • VS2010无法添加服务引用

    我有一个最初是用 VS2008 专业 编写的项目 我已经从 VS2008 解决方案中的项目创建了一个 vs2010 解决方案 使用 VS2010 professional 但无法从解决方案的域层 类库项目 添加服务引用 我检查过域层项目的目
  • 从 azure 搜索返回仅与确切搜索词匹配的记录

    所以我是 Azure 搜索的新手 我才刚刚开始了解它 我有一个搜索索引 用于查询一个非常简单的 sql 视图以查找匹配的记录 我在获得与我搜索的单词完全匹配时遇到了很大的困难 每当我搜索时 我都会得到仅包含确切单词的记录 但是我也会得到包含
  • 如何让R使用更多的CPU和内存? [复制]

    这个问题在这里已经有答案了 无论 R 计算多么密集 它使用的 CPU 都不会超过 25 我尝试过设置优先级rsession exe to High乃至Realtime但用法保持不变 有什么方法可以增加 R 的 CPU 使用率以充分利用我的系
  • 语音转文本 - 将说话者标签映射到 JSON 响应中相应的文字记录

    每隔一段时间就会出现一段 JSON 数据 这会带来挑战 可能需要数小时才能从中提取所需的信息 我有以下由 Speech To Text API 引擎生成的 JSON 响应 它显示了文字记录 每个单词的发音以及每个说话者的时间戳和说话者标签s