亚马逊AWS官方博客

使用自定义词汇表与 Amazon Augmented AI,提升 Amazon Transcribe 的语音到文本转录效能

各类企业与组织正越来越多地在自身业务当中引入视频与音频内容,包括广告、客户服务、媒体后期制作、员工培训与教育等等。而随着此类活动所产生的多媒体内容数量的激增,企业开始对视频与音频转录能力提出更高要求,希望借此快速组织文件、实现文本查询并改善听力障碍者(截至目前,全球存在听力障碍的人群已达4.66亿)或语言学习者(全球英语学习者多达15亿)的使用体验。

传统语音到文本转录方法往往只能以手动方式进行,相关人工成本极高且执行速度缓慢。由机器学习(ML)技术支持的Amazon Transcribe是一项语音到文本服务,能够为商业用例及开发人员提供一种高质量、低成本、速度快的解决方案。在面对法律、金融、建筑、高等教育乃至工程学等领域的特定术语时,用户还可以配合自定义词汇表以提高转录质量。要使用这项功能,我们需要创建特定领域的术语清单,并在运行转录作业的过程中引用这份词汇表文件。

在本文中,我们将共同了解如何使用Amazon Augmented AI(Amazon A2I)将Amazon Transcribe生成的低置信度预测结果发送给工作人员以供审核,借此快速生成特定领域的术语清单。我们在本轮演练中测量了转录作业的单词错误率(WER)与正确转录的术语数量,借此演示如何使用自定义词汇表改善Amazon Transcribe对于特定领域术语的转录效果。

要完成本次演练,请使用 Amazon A2I Sample Jupyter Notebook GitHub repo上的A2I-Video-Transcription-with-Amazon-Transcribe.ipynb 笔记本。
技术术语转录错误示例。在这段字幕中,“an EC2 instance”被错误转录为“Annecy two instance”。

使用Amazon A2I构建Amazon Transcribe自定义词汇表并对视频进行重新转录之后,可以看到技术术语“an EC2 instance”得到正确识别。

 

本轮演练着重于转录视频内容。您可以执行以下操作以修改我们提供的代码,从而实现对音频文件(例如MP3文件)的转录:

  • 将音频文件上传至您的Amazon Simple Storage Service(Amazon S3)存储桶,并使用这些文件替换原本的视频文件。
  • 修改本演练当中工作人员任务模板中的按钮文本与说明内容,引导工作人员收听并转录音频片段。

解决方案概述

下图所示,为本解决方案的基本架构。

下面来看本轮演练的基本工作流程,具体步骤包括:

  1. 执行初步转录。我们转录的是关于Amazon SageMaker视频,其中多次提及机器学习与AWS技术术语。在直接使用Amazon Transcribe进行转录时,您可能发现其中某些技术术语会出现转录错误。我们会生成置信度得分分布,借此查看Amazon Transcribe无法正确转录的术语数量。
  2. 使用Amazon A2I创建人工审核工作流。在识别出置信度得分较低的单词后,大家可以将其发送给审核人员,通过Amazon A2I进行审核与转录。您可以将自己设定为内部Amazon A2I工作团队的工作人员,并将人工检查任务发送给自己,借此预览工作人员UI以及用于检查视频片段的工具。
  3. 使用A2I结果创建自定义词汇表。您可以解析这些从Amazon A2I处收集到的人工转录结果,提取特定领域术语,并使用这些术语创建自定义词汇表。
  4. 使用自定义词汇表改进转录效果。在生成自定义词汇表之后,您可以再次调用Amazon Transcribe以获取更好的转录结果。通过单词错误率(WER)这一行业标准,大家可以准确评估添加词汇表前后的转录效果差异。

先决条件

在开始本轮演练之前,大家需要做好以下准备:

  • 一个AWS账户
  • 一个S3存储桶。在笔记本中的BUCKET处为该存储桶命名。存储桶必须与Amazon SageMaker 笔记本实例位于同一区域。
  • 具备必要权限的AWS身份与访问管理(AWS Identity and Access Management,简称IAM)执行角色。Notebook会自动使用您用于创建笔记本实例的角色(请参阅此列表中的下一条目)。向此IAM角色中添加以下权限:
    • 添加托管策略 AmazonAugmentedAIFullAccess 与 AmazonTranscribeFullAccess
    • 在创建角色时,我们需要指定Amazon S3权限。大家可以允许该角色访问Amazon S3中的所有资源,也可以指定其访问特定存储桶。总之,请确保您的IAM角色有权访问本轮演练中所涉及的S3存储桶,且该存储桶必须与您的笔记本实例位于同一区域。
  • 一个活动的Amazon SageMaker 笔记本实例。关于更多详细信息,请参阅创建笔记本实例。打开您的笔记本实例,并上传笔记本A2I-Video-Transcription-with-Amazon-Transcribe.ipynb
  • 内部工作团队。所谓工作团队,是一组负责审核转录文档的人员。您可以指定内部员工组建工作团队,也可以选择由 Amazon Mechanical Turk指派的雇员或者供应商人员提供审核服务。无论选择哪种方式,您都可以通过Amazon A2I将任务发送给工作人员。在本文中,我们使用内部员工创建工作团队,并将您自己添加到团队中以预览Amazon A2I工作流程。关于更多操作说明,请参阅创建内部工作团队。请注意记录此工作团队的ARN,我们需要在演练中的Jupyter notebook当中使用。

要了解本用例,我们还建议您做好以下准备:

由此开始

在完成以上准备工作之后,即可在Amazon SageMaker Jupyter notebook实例上部署这套解决方案了。请使用笔记本中的完整代码进行操作。

首先,我们需要根据Setup代码单元设置AWS资源与依赖项,并将其中提供的示例MP4视频文件上传至您的S3存储桶。在本用例中,我们将对AWS官方视频列表中的Amazon SageMaker介绍视频(亦可通过YouTube查看)进行分析。笔记本将逐步转录并查看Amazon A2I对Amazon SageMaker Jupyter Notebook实例的处理过程。在步骤3与步骤4中,我们将对包含四段视频的大型数据集进行结果分析。下表所示,为本笔记本当中所使用的视频及使用方式。

视频编号 视频标题 文件名 功能
1 Fully-Managed Notebook Instances with Amazon SageMaker – a Deep Dive Fully-Managed Notebook Instances with Amazon SageMaker – a Deep Dive.mp4 在步骤1与步骤2中执行初始转录并查看示例Amazon A2I作业。在步骤3中建立一份自定义词汇表。
2 Built-in Machine Learning Algorithms with Amazon SageMaker – a Deep Dive Built-in Machine Learning Algorithms with Amazon SageMaker – a Deep Dive.mp4 在步骤4中,使用自定义词汇表测试转录结果。
3 Bring Your Own Custom ML Models with Amazon SageMaker Bring Your Own Custom ML Models with Amazon SageMaker.mp4 在步骤3中建立一份自定义词汇表。
4 Train Your ML Models Accurately with Amazon SageMaker Train Your ML Models Accurately with Amazon SageMaker.mp4 在步骤4中使用自定义词汇表测试转录结果。

在步骤4中,我们将视频1与视频3称为示例视频,并使用这两段视频构建自定义词汇表。视频2与视频4则为非样本视频,代表我们的工作流从未见过的视频,用于测试转录方法在新视频中正确识别技术术语的实际能力。

当然,您也可以通过笔记本下载其他视频,或者使用您自己的视频内容。

步骤1:执行初始转录

我们的第一步,是查看在缺少自定义词汇表或其他修改时,Amazon Transcribe的基本性能,并以此为基础建立基准准确率指标。

使用 transcribe 函数即可启动转录作业。我们稍后可以使用vocab_name参数以指定自定义词汇表,但当前默认为None。具体参见以下代码:

transcribe(job_names[0], folder_path+all_videos[0], BUCKET)

请稍等一会儿,直到转录作业显示为COMPLETED。一段10至15分钟长度的视频,转录流程通常最多需要5分钟。

在转录作业完成之后,结果将被存储在指定BUCKET中名为YOUR_JOB_NAME.json的输出JSON文件内。使用get_transcript_text_and_timestamps函数即可解析此项输出,并返回多个有用的数据结构。在调用之后,all_sentences_and_times将为每段转录视频生成一个对象列表,其中包含带有开始时间、结束时间与置信度得分的句子。要将这些句子保存为文本文件以备后续使用,请输入以下代码:

file0 = open("originaltranscript.txt","w")
    for tup in sentences_and_times_1:
        file0.write(tup['sentence'] + "\n")
file0.close()

要查看置信度得分分布,请输入以下代码:

from matplotlib import pyplot as plt
plt.style.use('ggplot')

flat_scores_list = all_scores[0]

plt.xlim([min(flat_scores_list)-0.1, max(flat_scores_list)+0.1])
plt.hist(flat_scores_list, bins=20, alpha=0.5)
plt.title('Plot of confidence scores')
plt.xlabel('Confidence score')
plt.ylabel('Frequency')

plt.show()

 

以下图所示,为置信度得分的分布情况。

接下来,我们过滤掉高置信度得分,专注研究置信度得分较低的部分。

您可以尝试不同的阈值,查看有多少个单词低于该阈值。在本用例当中,我们将阈值设定为0.4,低于此阈值的单词共有16个。任何低于此阈值的单词序列,都将被发送给工作团队以进行人工审核。

您可以尝试不同的阈值并观察其在Amazon A2I工作流中所对应的任务数量,据此在捕捉到的转录错误与希望投入的审核时间/资源之间找到平衡点。换句话说,使用较高的阈值虽然能够捕捉到更多疑似转录错误,但也会快速增加误报数量——换言之,低置信度转录结果并不一定包含重要的技术术语转录错误。好在大家可以在工作流中快速尝试不同阈值设定,并将结果交由工作人员进行人工审核。具体参见以下代码:

THRESHOLD = 0.4

# Filter scores that are less than THRESHOLD
all_bad_scores = [i for i in flat_scores_list if i < THRESHOLD]
print(f"There are {len(all_bad_scores)} words that have confidence score less than {THRESHOLD}")

plt.xlim([min(all_bad_scores)-0.1, max(all_bad_scores)+0.1])
plt.hist(all_bad_scores, bins=20, alpha=0.5)
plt.title(f'Plot of confidence scores less than {THRESHOLD}')
plt.xlabel('Confidence score')
plt.ylabel('Frequency')

plt.show()

 

您将获得以下输出结果:

There are 16 words that have confidence score less than 0.4

下图所示,为置信度得分低于0.4的分布情况。

在尝试使用不同阈值时,大家会发现很多置信度较低的单词。一般来说,针对高新技术领域的术语往往很难一次性转录正确,因此最重要的就是确切捕捉到这些术语,并将其合并至自定义词汇表当中。

步骤2:使用Amazon A2I建立人工审核工作流

我们的下一步工作是创建一套人工审核工作流(或者叫流定义),负责将低置信度得分发送给人工审核员,并对他们校正后的转录结果进行检索。随附的Jupyter notebook中包含以下步骤说明:

  1. 创建一支由工作人员组成的工作团队,对预测结果进行审核。在本用例中,您可以通过内部工作团队引导Amazon A2I将人工审核任务发送给自己,借此预览工作人员UI。
  2. 创建一套工作任务模板,用于将任务交付给各个工作人员。此模板将使用您提供的输入数据对工作人员做出指导,同时通过交互式工具引导他们一步步完成审核任务。
  3. 创建一套人工审核工作流,也可称为流定义。大家可以使用流定义配置您的人力资源以及人工审核的具体任务分配方式。
  4. 建立人工循环以启动人工审核工作流,根据需求发送数据以供工作人员审核。在本用例中,我们使用自定义任务类型并通过Amazon A2I Runtime API启动人工循环任务。只要对StartHumanLoop进行调用,即可将任务发送给人工审核员。

在笔记本中,您可以使用AWS Python SDK (Boto3) 的 create_flow_definition函数创建一套人工审核工作流,也可以在 Amazon SageMaker控制台上创建人工审核工作流

设置工作人员任务UI

Amazon A2I使用Liquid(一种开源模板语言)以动态方式将数据插入至HTML文件内。

在本用例中,我们希望每项任务都能向人工审核员展示视频中出现低置信度单词的对应部分,并播放与之对应的语音。这套HTML模板包含三个主要部分:

  • 带有重播按钮的播放器,仅允许审核员播放特定视频段落。
  • 供审核员输入及提交所听到内容的表单。
  • 使用JavaScript编写逻辑,为重播按钮提供重播功能。

以下代码为本示例中使用的模板:

<head>
    <style>
        h1 {
            color: black;
            font-family: verdana;
            font-size: 150%;
        }
    </style>
</head>
<script src="https://assets.crowd.aws/crowd-html-elements.js"></script>

<crowd-form>
    <video id="this_vid">
        <source src="{{ task.input.filePath | grant_read_access }}"
            type="audio/mp4">
        Your browser does not support the audio element.
    </video>
    <br />
    <br />
    <crowd-button onclick="onClick(); return false;"><h1> Click to play video section!</h1></crowd-button> 

    <h3>Instructions</h3>
    <p>Transcribe the audio clip </p>
    <p>Ignore "umms", "hmms", "uhs" and other non-textual phrases. </p>
    <p>The original transcript is <strong>"{{ task.input.original_words }}"</strong>. If the text matches the audio, you can copy and paste the same transcription.</p>
    <p>Ignore "umms", "hmms", "uhs" and other non-textual phrases.
    If a word is cut off in the beginning or end of the video clip, you do NOT need to transcribe that word.
    You also do NOT need to transcribe punctuation at the end of clauses or sentences.
    However, apostrophes and punctuation used in technical terms should still be included, such as "Denny's" or "file_name.txt"</p>
    <p><strong>Important:</strong> If you encounter a technical term that has multiple words,
    please <strong>hyphenate</strong> those words together. For example, "k nearest neighbors" should be transcribed as "k-nearest-neighbors."</p>
    <p>Click the space below to start typing.</p>
    <full-instructions header="Transcription Instructions">
        <h2>Instructions</h2>
        <p>Click the play button and listen carefully to the audio clip. Type what you hear in the box
            below. Replay the clip by clicking the button again, as many times as needed.</p>
    </full-instructions>

</crowd-form>

<script>
    var video = document.getElementById('this_vid');
    video.onloadedmetadata = function() {
        video.currentTime = {{ task.input.start_time }};
    };
    function onClick() {
        video.pause();
        video.currentTime = {{ task.input.start_time }};
        video.play();
        video.ontimeupdate = function () {
            if (video.currentTime >= {{ task.input.end_time }}) {
                video.pause()
            }
        }
    }
</script>

 

{{ task.input.filePath | grant_read_access }}字段允许您使用S3存储桶内的视频位置路径授予访问权限,并将视频内容显示给审核人员。为了防止审核员观看视频中的不相关部分,我们从视频标签中省略了controls参数,并引入一个重播按钮以控制能够重播的具体范围。

在视频播放器下,<crowd-text-area> HTML标签创建一份提交表单,以供审订员进行键入与提交操作。

在HTML片段的末尾, <script> 标签括起的部分包含用于实现重播按钮功能的JavaScript逻辑。 {{ task.input.start_time }}与 {{ task.input.end_time }} 字段则允许您为当前任务注入待转录视频内对应部分的开始与结束时间。

您可以使用AWS Python SDK (Boto3) 的 create_human_task_ui函数创建一套工作人员任务模板,也可以在 Amazon SageMaker控制台上创建人工任务模板

创建人工循环

在流定义设置完成之后,我们即可使用Amazon Transcribe并启动人工循环。在遍历转录词汇列表及置信度得分的过程中,一旦置信度得分低于某一阈值( CONFIDENCE_SCORE_THRESHOLD),则据此创建对应的人工循环了。人工循环属于一项人工审核任务,允许工作人员审核Amazon Transcribe难以正确转录的视频片段。

在这方面,最重要的在于如何处理低置信度单词,特别是归属于转录错误短语的技术术语。为了解决这类情况,您可以使用专门的函数以给定索引为中心获取单词序列,以及该序列的开始与结束时间戳。具体参见以下代码:

def get_word_neighbors(words, index):
    """
    gets the words transcribe found at most 3 away from the input index
    Returns:
        list: words at most 3 away from the input index
        int: starting time of the first word in the list
        int: ending time of the last word in the list
    """
    i = max(0, index - 3)
    j = min(len(words) - 1, index + 3)
    return words[i: j + 1], words[i]["start_time"], words[j]["end_time"]

对于我们遇到的每一个低置信度得分单词,都需要将与之关联的相邻单词序列发送给人工审核员,具体参见以下代码:

human_loops_started = []
CONFIDENCE_SCORE_THRESHOLD = THRESHOLD
i = 0
for obj in confidences_1:
    word = obj["content"]
    neighbors, start_time, end_time = get_word_neighbors(confidences_1, i)
    
    # Our condition for when we want to engage a human for review
    if (obj["confidence"] < CONFIDENCE_SCORE_THRESHOLD):
        
        # get the original sequence of words
        sequence = ""
        for block in neighbors:
            sequence += block['content'] + " "
        
        humanLoopName = str(uuid.uuid4())
        # "initialValue": word,
        inputContent = {
            "filePath": job_uri_s3,
            "start_time": start_time,
            "end_time": end_time,
            "original_words": sequence
        }
        start_loop_response = a2i.start_human_loop(
            HumanLoopName=humanLoopName,
            FlowDefinitionArn=flowDefinitionArn,
            HumanLoopInput={
                "InputContent": json.dumps(inputContent)
            }
        )
        human_loops_started.append(humanLoopName)
        # print(f'Confidence score of {obj["confidence"]} is less than the threshold of {CONFIDENCE_SCORE_THRESHOLD}')
        # print(f'Starting human loop with name: {humanLoopName}')
        # print(f'Sending words from times {start_time} to {end_time} to review')
        print(f'The original transcription is ""{sequence}"" \n')

    i=i+1

 

 

在第一段视频中,大家应该会看到如下代码输出:

========= Fully-Managed Notebook Instances with Amazon SageMaker - a Deep Dive.mp4 =========
The original transcription is "show up Under are easy to console "

The original transcription is "And more cores see is compute optimized "

The original transcription is "every version of Annecy two instance is "

The original transcription is "distributing data sets wanted by putt mode "

The original transcription is "onto your EBS volumes And again that's "

The original transcription is "of those example No books are open "

The original transcription is "the two main ones markdown is gonna "

The original transcription is "I started using Boto three but I "

The original transcription is "absolutely upgrade on bits fun because you "

The original transcription is "That's the python Asi que We're getting "

The original transcription is "the Internet s Oh this is from "

The original transcription is "this is from Sarraf He's the author "

The original transcription is "right up here then the title of "

The original transcription is "but definitely use Lambda to turn your "

The original transcription is "then edit your ec2 instance or the "

Number of tasks sent to review: 15

 

 

在任务完成之后,我们将看到错误的转录结果以及相应的视频片段,具体参见以下截屏。

其中的人工循环状态已经显示为Completed。事实上,不必等待全部人工审核任务逐一完成,我们就已经可以开始下一步。一般来讲,只需要完成3到5项审核,就足以了解应如何从结果中提取技术术语,详见以下代码:

completed_human_loops = []
for human_loop_name in human_loops_started:
    resp = a2i.describe_human_loop(HumanLoopName=human_loop_name)
    print(f'HumanLoop Name: {human_loop_name}')
    print(f'HumanLoop Status: {resp["HumanLoopStatus"]}')
    print(f'HumanLoop Output Destination: {resp["HumanLoopOutput"]}')
    print('\n')
    
    if resp["HumanLoopStatus"] == "Completed":
        completed_human_loops.append(resp)

 

 

在完成所有任务之后,Amazon A2I会将结果存储在您的S3存储桶内,并发送至Amazon CloudWatch Event(您可以在AWS管理控制台上检查这些事件)。您可以通过S3存储桶OUTPUT_PATH 查看结果,并使用以下代码进行结果输出:

import re
import pprint

pp = pprint.PrettyPrinter(indent=4)

for resp in completed_human_loops:
    splitted_string = re.split('s3://' +  BUCKET + '/', resp['HumanLoopOutput']['OutputS3Uri'])
    output_bucket_key = splitted_string[1]

    response = s3.get_object(Bucket=BUCKET, Key=output_bucket_key)
    content = response["Body"].read()
    json_output = json.loads(content)
    pp.pprint(json_output)
    print('\n')

 

步骤3:使用自定义词汇表改进转录效果

您可以使用由人工审核员提供的转录更正内容以解析结果,借此识别出需要添加到自定义词汇表内的特定领域术语。要从全部人工审核员处获取完整的更正单词列表,请输入以下代码:

corrected_words = []

for resp in completed_human_loops:
    splitted_string = re.split('s3://' +  BUCKET + '/', resp['HumanLoopOutput']['OutputS3Uri'])
    output_bucket_key = splitted_string[1]

    response = s3.get_object(Bucket=BUCKET, Key=output_bucket_key)
    content = response["Body"].read()
    json_output = json.loads(content)
    
    # add the human-reviewed answers split by spaces
    corrected_words += json_output['humanAnswers'][0]['answerContent']['transcription'].split(" ")

 

我们希望解析这些单词,找到相对不常见的词汇。一种比较简单的方法是使用大型英语语料库,并验证该语料库中是否存在经过人工审核的单词。在本用例中,我们使用的是来自自然语言工具包(NLTK)的英语语料库——这是一套开源的社区驱动库,主要用于自然语言处理研究。具体请参见以下代码:

# Create dictionary of English words
# Note that this corpus of words is not 100% exhaustive
import nltk
nltk.download(‘words’)
from nltk.corpus import words
my_dict=set(words.words())

word_set = set([])
for word in remove_contractions(corrected_words):
if word:
if word.lower() not in my_dict:
if word.endswith(‘s’) and word[:-1] in my_dict:
print(“”)
elif word.endswith(“‘s”) and word[:-2] in my_dict:
print(“”)
else:
word_set.add(word)

for word in word_set:
print(word)

您所获得的实际词汇可能有所区别,具体取决于您使用的视频与设定的阈值。以下代码为播放列表中第一与第三段视频在Amazon A2I中的输出结果示例(请参阅前文中的「由此开始」部分):

including
machine-learning
grabbing
amazon
boto3
started
t3
called
sarab
ecr
using
ebs
internet
jupyter
distributing
opt/ml
optimized
desktop
tokenizing
s3
sdk
encrypted
relying
sagemaker
datasets
upload
iam
gonna
managing
wanna
vpc
managed
mars.r
ec2
blazingtext

 

 

有了这些技术术语,您现在可以更轻松地手动创建自定义词汇表,帮助Amazon Transcribe更准确地识别出技术术语。您可以使用自定义词汇表告知Amazon Transcribe各项技术术语的发音方式与显示方式。关于自定义词汇表的更多详细信息,请参阅使用表创建一份自定义词汇表

当您处理同一主题下的其他视频时,可以不断更新这份词汇表。在逐步学习之后,系统在转录新视频时需要添加的全新技术术语也将逐渐减少。

通过第一与第三段视频,我们在将THRESHOLD置信值设定为0.5的前提下对Amazon A2I结果进行解析并整理出一份词汇表。大家可以在笔记本的其余部分中使用这份词汇表。

finalized_words=[['Phrase','IPA','SoundsLike','DisplayAs'], # This top line denotes the column headers of the text file.
                 ['machine-learning','','','machine learning'],
                 ['amazon','','am-uh-zon','Amazon'],
                 ['boto-three','','boe-toe-three','Boto3'],
                 ['T.-three','','tee-three','T3'],
                 ['Sarab','','suh-rob','Sarab'],
                 ['E.C.R.','','ee-see-are','ECR'],
                 ['E.B.S.','','ee-bee-ess','EBS'],
                 ['jupyter','','joo-pih-ter','Jupyter'],
                 ['opt-M.L.','','opt-em-ell','/opt/ml'],
                 ['desktop','','desk-top','desktop'],
                 ['S.-Three','','ess-three','S3'],
                 ['S.D.K.','','ess-dee-kay','SDK'],
                 ['sagemaker','','sage-may-ker','SageMaker'],
                 ['mars-dot-r','','mars-dot-are','mars.R'],
                 ['I.A.M.','','eye-ay-em','IAM'],
                 ['V.P.C.','','','VPC'],
                 ['E.C.-Two','','ee-see-too','EC2'],
                 ['blazing-text','','','BlazingText'],
                ]

在将自定义词汇表保存为文本文件并将其上传至S3存储桶之后,大家即可为其命名以创建自定义词汇表,以便Amazon Transcribe进行直接调用:

# The name of your custom vocabulary must be unique!
vocab_improved='sagemaker-custom-vocab'

transcribe = boto3.client("transcribe")
response = transcribe.create_vocabulary(
    VocabularyName=vocab_improved,
    LanguageCode='en-US',
    VocabularyFileUri='s3://' + BUCKET + '/' + custom_vocab_file_name
)
pp.pprint(response)

 

请等待 VocabularyState显示为READY,整个过程通常需要几分钟。具体参见以下代码:

# Wait for the status of the vocab you created to finish
while True:
    response = transcribe.get_vocabulary(
        VocabularyName=vocab_improved
    )
    status = response['VocabularyState']
    if status in ['READY', 'FAILED']:
        print(status)
        break
    print("Not ready yet...")
    time.sleep(5)

 

 

步骤4:使用自定义词汇表改进转录效果

在完成自定义词汇表的创建之后,您可以调用transcribe函数以启动另一项转录作业,并在其中使用自定义词汇表。具体参见以下代码:

job_name_custom_vid_0='AWS-custom-0-using-' + vocab_improved + str(time_now)
job_names_custom = [job_name_custom_vid_0]
transcribe(job_name_custom_vid_0, folder_path+all_videos[0], BUCKET, vocab_name=vocab_improved)

 

再次等待,直到您的转录作业状态显示为COMPLETED

使用以下代码,将新的转录结果保存为新的.txt文件:

i = 1
for list_ in all_sentences_and_times_custom:   
    file = open(f"improved_transcript_{i}.txt","w")
    for tup in list_:
        file.write(tup['sentence'] + "\n") 
    file.close()
    i = i + 1

 

结果与分析

到这里,我们已经对一段视频完成了转录改进。在接下来的部分中,我们将使用四段视频对工作流结果进行分析。关于更多详细信息,请参阅本文开头的「由此开始」部分。

为了在示例工作流中扩大分析指标的样本量,我们为播放列表中的每段视频预先生成了一份正确转录文本,一份使用自定义词汇表前的转录文本,以及一份使用自定义词汇表后的转录文本。

第一与第三段视频属于样本视频,用于构建我们之前看到的自定义词汇表。第二与第四段视频则作为非样本视频,用于在自定义词汇表构建完成后再次测试Amazon Transcribe的转录效果。运行相应代码块即可下载相应转录文本。

比较单词错误率

在语音识别领域,最常用的准确率衡量指标为单词错误率(WER),其定义为WER =(S+D+I)/N。公式中的S、D与I分别为从直接输出的转录结果到正确结果所需要的替换、删除与插入操作数量,N则为单词总数。通过这条简单的公式,我们可以在广义上解释转录错误与实际单词总量之间的比例。

我们使用一套名为JiWER的轻量级开源Python库,以计算各份转录文本之间的WER差异。具体参见以下代码:

!pip install jiwer
from jiwer import wer
import jiwer

 

关于更多详细信息,请参阅JiWER:用于自动语音识别评估的相似性衡量指标

我们计算了样本视频(即用于构建自定义词汇表的视频)中的相应指标。使用笔记本中的代码,即可得出以下输出结果:

===== In-sample videos =====
Processing video #1
The baseline WER (before using custom vocabularies) is 5.18%.
The WER (after using custom vocabularies) is 2.62%.
The percentage change in WER score is -49.4%.

Processing video #3
The baseline WER (before using custom vocabularies) is 11.94%.
The WER (after using custom vocabularies) is 7.84%.
The percentage change in WER score is -34.4%.

 

要计算非样本视频(即Amazon Transcribe之前未曾观看过的视频)的指标,请输入以下代码:

===== Out-sample videos =====
Processing video #2
The baseline WER (before using custom vocabularies) is 7.55%.
The WER (after using custom vocabularies) is 6.56%.
The percentage change in WER score is -13.1%.

Processing video #4
The baseline WER (before using custom vocabularies) is 10.91%.
The WER (after using custom vocabularies) is 8.98%.
The percentage change in WER score is -17.6%.

 

结果审查

下表总结了WER得分的变化情况。

如果只关注绝对WER得分,例如初始WER为5.18%的结果,我们可以认为Amazon Transcribe的质量已经足够可靠——相当于每转录20个单词,才会出现1个错误!但是,很多特定领域术语往往是句子表达中的核心。换言之,与常见的“to”、“and”、“I”等相对不影响理解的部分不同,术语转录错误往往导致用户无法获得可读的转录结果。对于搜索引擎优化(SEO)及按主题组织视频等应用场景,我们肯定需要保证这些技术术语能够得到正确转录。在本节中,我们将具体探讨自定义词汇表在多个重要技术术语上给转录正确率带来的影响。

特定技术术语的相应指标

在本文中,基准(ground truth)代表的是人工转录后得出的正确结果,初始转录(original transcript)代表的是采用自定义词汇表之前的转录结果,新转录(new transcript)是指使用自定义词汇表之后的转录结果。

样本视频

下表所示,为视频1的转录正确率。

下表所示,为视频3的转录正确率。

非样本视频

下表所示,为视频2的转录正确率。

下表所示,为视频4的转录正确率。

可以看到,使用自定义词汇表能够将技术术语的正确转录比例提升80%甚至更高。在大多数情况下,使用自定义词汇表甚至能够让这些特定领域中的术语获得100%的转录正确率。毫无疑问,构建自定义词汇表绝对物有所值!

资源清理

为了避免产生不必要的成本,请在演练结束之后删除相应资源,包括您的S3存储桶、人工审核工作流、转录作业以及Amazon Sagemaker 笔记本实例。关于具体操作说明,请参阅以下内容:

总结

在本文中,我们介绍了如何使用Amazon A2I人工审核工作流与Amazon Transcribe自定义词汇表改善自动视频的转录效果。通过本轮演练,您可以快速识别出特定领域的术语,并使用这些术语构建自定义词汇表,以便后续更准确地对其他视频中的相同术语实现转录。对于SEO、针对性文本查询以及按技术术语对批量视频或音频文件进行分组等应用场景,这种对关键技术术语的正确转录都是一项至关重要的能力与前提性保证。

您可以在GitHub repo上获取完整的概念验证Jupyter notebook。关于视频演示、示例Jupyter notebooks以及文档处理用例(包括文档处理、内容审核、情感分析、对象检测、文本翻译等)的更多详细信息,请参阅Amazon Augmented AI资源

本篇作者

Jasper Huang

AWS公司技术作家实习生,宾夕法尼亚大学在校生,拥有计算机科学学士与硕士学位。他的关注方向包括云计算、机器学习以及如何运用这些技术解决各类复杂而有趣的实际问题。在工作之余,Jasper喜欢打网球、远足和了解新兴技术趋势。

Talia Chopra

是一位专攻机器学习和人工智能的 AWS 技术撰稿人。她与 AWS 的多个团队合作,为使用 Amazon SageMaker、MxNet 和AutoGluon 的客户创建技术文档和教程。闲暇时,她喜欢在大自然中冥想和散步。