python - 如何加快 AWS Transcribe 的处理时间?
问题描述
我有 6 秒的录音(ar-01.wav
)wav
格式。我想使用亚马逊服务将音频文件转录为文本。为此,我按名称创建了一个存储桶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
,提取所需信息的时间可以忽略不计。如何加快转录过程或有其他更好的方法吗?
解决方案
对我来说,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())
推荐阅读
- javascript - 如何在 SFTP 服务器中获取文件的绝对路径
- elasticsearch - 使用多个规则启动 ElastAlert
- paypal - 通过没有 Javascript/Form 的 URL 接受 PayPal 付款?
- mongodb - 切片 MongoDB 数组以获取所有从指定索引开始
- nginx - 使用 proxy_pass 和 root 与 nginx 分离 URL 访问环境
- reactjs - Uncaught (in promise) TypeError: Cannot read property 'data' of undefined at onFailure
- c++ - 从opencv矩阵框架将数据从矩阵转换为数组
- linux - pci_rescan_bus() 不会在 Linux 中重新扫描 PCI 总线
- apache-spark - Spark结构化流媒体应用程序中的死执行者
- angular - 错误 NG8001:“nz-layout”不是已知元素