У меня есть 6-секундная аудиозапись (ar-01.wav
) в формате wav
. Я хочу, чтобы транскрибировать аудиофайл в текст, используя службы amazon. Для этого я создал ведро по имени 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 минутный файл. Одна из возможных идей - разделить аудиофайл на куски, а затем использовать многопроцессорную обработку с 16 ядрами в EC2, как экземпляр 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 ядрами для одновременной записи, сопоставляя вашу функцию транскрипции (transcribe.start_transcription_job) для каждого из TranscriptionJobName и job_uri:
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())