首页 > 解决方案 > 如何加快 AWS Transcribe 的处理时间?

问题描述

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

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,提取所需信息的时间可以忽略不计。如何加快转录过程或有其他更好的方法吗?

标签: pythonamazon-web-servicesamazon-s3boto3

解决方案


对我来说,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())

推荐阅读