ホーム>source

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 を取得したら 、必要な情報を抽出する時間はごくわずかです。文字起こしのプロセスを高速化する方法、またはそれを行う他のより良い方法はありますか?

あなたの答え
  • 解決した方法 # 1

    私にとって、AWS Transcribeは17分のファイルを転写するのに20分かかりました。考えられるアイデアの1つは、オーディオファイルをチャンクに分割し、g3.4xlargeインスタンスのようにEC2で16コアのマルチプロセッシングを使用することです。

    -20の無音しきい値でオーディオファイルを16の部分に分割し、.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関数(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())
    
    

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ python - インデックスがPython350を割り当てた後にパンダが列を追加しない