【问题标题】:How to speed up processing time of AWS Transcribe?如何加快 AWS Transcribe 的处理时间?
【发布时间】:2019-10-21 19:34:53
【问题描述】:

我有 wav 格式的 6 秒录音 (ar-01.wav)。我想使用亚马逊服务将音频文件转录为文本。为此,我创建了一个名为 test-voip 的存储桶并将音频文件上传到存储桶。当我尝试将语音转换为文本时,6 秒的音频需要 13.12 秒。这是我的代码 sn-p

session = boto3.Session(aws_access_key_id=aws_access_key_id, 
aws_secret_access_key=aws_secret_access_key)
transcribe = session.client('transcribe', region_name='us-east-1')
job_name = "audio_text_trail9"
job_uri = "https://test-voip.s3.amazonaws.com/ar-01.wav"
transcribe.start_transcription_job(
    TranscriptionJobName=job_name,
    Media={'MediaFileUri': job_uri},
    MediaFormat='wav',
    LanguageCode='en-US',
    MediaSampleRateHertz=16000
    )

while True:
    status = transcribe.get_transcription_job(TranscriptionJobName=job_name)
    if status['TranscriptionJob']['TranscriptionJobStatus'] in ['COMPLETED', 'FAILED']:
        break
print("converted to text")
myurl = status['TranscriptionJob']['Transcript']['TranscriptFileUri']
print(myurl)
Text_Data = (requests.get(myurl).json())['results']['transcripts'][0]['transcript']

print(Text_data)

这里我的代码运行良好,即使在嘈杂的音频中,准确性也很棒,但是时间消耗太高了。我在哪里做错了,是什么拖了这么多时间来转录?一旦我得到转录的json,提取所需信息的时间可以忽略不计。如何加快转录过程或有其他更好的方法吗?

【问题讨论】:

  • 为什么时间对你来说是个问题?如果处理一个 n 秒的剪辑需要超过 n 秒的时间,会不会有问题?
  • AWS 是否保证文件的处理速度?他们可能会在某个地方为您启动一个新实例,这需要几秒钟,或者您的文件必须在队列中等待才能被处理。这就是 API 基于作业而不是同步立即返回 API 的原因。
  • 约翰,是的,我需要它更快地用于我的应用程序。
  • 你可以尝试上传一个更大的文件,看看处理时间是否线性上升。如果是这样,它只是做了很多处理,它需要那个时间。如果时间没有显着增加(例如,一个 60 秒的音频文件需要 20 秒),这意味着开始工作只是有一定的开销。无论哪种方式,我都希望它能够尽可能快地工作,并且没有秘密 --doubletime 开关。
  • 在 AWS 服务器上运行我的 python 代码会有什么不同吗?

标签: python amazon-web-services amazon-s3 boto3


【解决方案1】:

对我来说,AWS Transcribe 需要 20 分钟来转录一个 17 分钟的文件。一种可能的想法是将音频文件分割成块,然后在 EC2 上使用 16 核的多处理,例如 g3.4xlarge 实例。

将音频文件分成 16 部分,静音阈值为 -20,然后转换为 .wav:

$ sudo apt-get install mp3splt
$ sudo apt-get install ffmpeg
$ mp3splt -s -p th=-20,nt=16 splitted.mp3
$ ffmpeg -i splitted.mp3 splitted.wav 

然后,使用 16 核同时转录的多处理,为 TranscriptionJobName 和 job_uri 中的每一个映射您的转录函数 (transcribe.start_transcription_job):

import multiprocessing

output=[]
data = range(0,16)

def f(x):
    job_name = "Name"+str(x)
    job_uri = "https://s3.amazonaws.com/bucket/splitted"+str(x)+".wav"
    transcribe.start_transcription_job(
    TranscriptionJobName=job_name,
    Media={'MediaFileUri': job_uri},
    MediaFormat='wav',
    LanguageCode='pt-BR',
    OutputBucketName= "bucket",
    MediaSampleRateHertz=8000,
    Settings={"MaxSpeakerLabels": 2,
      "ShowSpeakerLabels": True})
    while True:
        status = transcribe.get_transcription_job(TranscriptionJobName=job_name)
        if status['TranscriptionJob']['TranscriptionJobStatus'] in ['COMPLETED','FAILED']:
            break

def mp_handler():
    p = multiprocessing.Pool(16)
    r=p.map(f, data)
    return r

if __name__ == '__main__':
    output.append(mp_handler())

【讨论】:

  • 我尝试的项目由于时间问题而停止。我会尝试一下,希望如果解决方案有效,我可以重新启动我的项目!我会尽快发布结果。
【解决方案2】:

我已经研究了转录速度保证,但没有运气

this forum post(需要 aws 帐户)中,一位发帖人使用以下结果进行基准测试:

  • 一个 10 分钟的剪辑花了大约 5 分钟
  • 40 分钟的剪辑大约需要 17 分钟
  • 2 小时的文件耗时 36 分钟

似乎是亚马逊的官方消息来源指出:“目前,对于超过 30 秒的音频,转录速度得到了更好的优化。当音频文件长度时,您将开始看到更好的处理时间与音频持续时间的比率大约 2 分钟或更长时间。话虽如此,我们正在努力提高整体转录速度"

希望对研究人员有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 2013-09-10
    • 1970-01-01
    • 2021-12-14
    相关资源
    最近更新 更多