Транскрипция подкаста с помощью Amazon Transcribe

Транскрипция подкастов - одна из самых кропотливых и трудоемких частей. Я был в восторге от того, что получил электронное письмо, в котором говорилось, что я был одобрен для предварительного просмотра трансакций Amazon. Я искал решение для транскрипции эпизодов моего подкаста Hack for the Sea, и я был поклонником инструментов машинного обучения AWS, так как они впервые появились несколько лет назад.

Этот пост служит наполовину как мой блокнот для экспериментов с новым API, а половина - полезным справочным / учебным пособием для людей, которые хотят использовать эти инструменты для выполнения аналогичной работы.

Содержание

Начало работы с SDK Bleeding-Edge

Во-первых, убедитесь, что у вас есть учетные данные в порядке. Это означает, что у вас есть папка, ~/.aws и внутри нее находится файл, credentials, который выглядит примерно так:

Замените кронштейнные маркеры своим ключом доступа и секретным ключом.

$ cat ~/.aws/credentials
[default]
aws_access_key_id = [ACCESS KEY]
aws_secret_access_key = [SECRET KEY]
region = us-east-1

В электронном письме появилась ссылка на обновленные SDK, у которых была поддержка API для службы Transcribe.

$ mkdir aws-sdk-go
$ unzip -d aws-sdk-go aws-sdk-go.zip
$ ls -alh aws-sdk-go

total 87M
drwxr-xr-x 3 ubuntu ubuntu 4.0K Jan 17 20:22 ./
drwxr-xr-x 9 ubuntu ubuntu 4.0K Jan 17 20:20 ../
-rw-r--r-- 1 ubuntu ubuntu  87K Dec 22 08:43 AWSTranscribeJavaClient-1.11.x.jar
-rw-r--r-- 1 ubuntu ubuntu  404 Dec 22 08:41 README.txt
drwxrwxr-x 2 ubuntu ubuntu 4.0K Dec 22 08:43 __MACOSX/
-rw-r--r-- 1 ubuntu ubuntu  58M Dec 22 08:29 aws-sdk-go.zip
-rw-r--r-- 1 ubuntu ubuntu 4.0M Dec 22 08:26 aws-sdk-js.tgz
-rw-r--r-- 1 ubuntu ubuntu  16M Dec 22 08:25 aws-sdk-php.zip
-rw-r--r-- 1 ubuntu ubuntu 9.9M Dec 22 08:27 aws-sdk-ruby.zip
-rw-r--r-- 1 ubuntu ubuntu 6.2K Dec 22 08:32 service-2.json

Несмотря на то, что файл вызывается aws-sdk-go.zip, на нем фактически есть SDK для PHP, Ruby, JavaScript, Java, а также Go. Я бы предпочел Python, но так как в наши дни мы все рогаем для JavaScript, давайте просто используем это.

$ tar xf aws-sdk-go/aws-sdk-js.tgz
$ cd aws-sdk
$ npm install

Идите вперед, очистите aws-sdk-go.zip и папки aws-sdk-go, если хотите, и давайте продолжим.

$ cd ..
$ node
> const AWS = require('./aws-sdk')
> aws.config.update({region:'us-east-1'})
> const ATS = new aws.TranscribeService()
> Object.keys(ATS)
[ 'config', 'isGlobalEndpoint', 'endpoint', '_clientId' ]

Хорошо.

Использование API-интерфейсов AWS Transcribe

Теперь, что это может сделать? Из того, что я смог собрать из содержимого файла SDK, похоже, что мы можем:

  1. Начало работы с транскрипцией
  2. Список транскрипционных заданий
  3. Получите задания на одну транскрипцию.

Итак, давайте сделаем это! Мы можем начать новую работу по транскрипции, использовать функцию списка, чтобы ее контролировать, а затем, наконец, получить законченную транскрипцию.

Запуск нового задания по транскрипции

Взяв еще один быстрый момент, чтобы подключить мой подкаст, давайте перейдем к странице Soundcloud для Hack for the Sea Podcast и загрузим первый эпизод. Я пошел вперед и положил mp3 файл в месте общественного s3, здесь.

Используя этот URL S3, мы можем продолжить и запустить следующую команду, чтобы начать работу по транскрипции:

ATS.startTranscriptionJob({
  "TranscriptionJobName": "H4TSEpisode001",
  "LanguageCode": "en-US",
  "MediaFormat": "mp3",
  "Media": {
    "MediaFileUri": "https://s3.amazonaws.com/mrh-podcasts/hackforthesea/public/Hack+for+the+Sea+Episode+001_mixdown.mp3"
  }
}, (err,result) => {
  if(err) throw err;
  console.log(result);
});

/*
{
  TranscriptionJob: {
    TranscriptionJobName: 'H4TSEpisode001',
    TranscriptionJobStatus: 'IN_PROGRESS',
    LanguageCode: 'en-US',
    MediaFormat: 'mp3',
    Media:
      { MediaFileUri: 'https://s3.amazonaws.com/mrh-podcasts/hackforthesea/public/Hack+for+the+Sea+Episode+001_mixdown.mp3' },
     CreationTime: 2018-01-17T22:04:38.073Z } }
*/

Список транскрипционных заданий

Теперь мы хотим проверить нашу работу, чтобы посмотреть, как это происходит. Ниже перечислены текущие задания. Теоретически вы можете написать сценарий, который использует setInterval или какую-то такую ​​вещь, чтобы автоматически проверять статус, но я просто покажу, как его проверить.

ATS.listTranscriptionJobs({
  "Status": "IN_PROGRESS"
}, (err,result) => {
  if(err) throw err;
  console.log(result)
})

/*
{
  Status: 'IN_PROGRESS',
  TranscriptionJobSummaries: [
    {
      TranscriptionJobName: 'H4TSEpisode001',
      CreationTime: 2018-01-17T22:04:38.073Z,
      LanguageCode: 'en-US',
      TranscriptionJobStatus: 'IN_PROGRESS'
    }
  ]
}
*/

После запуска этого скрипта и получения пустого массива вы узнаете, что работа завершена. Кроме того, вы можете изменить IN_PROGRESS на COMPLETED в приведенной выше команде, и он покажет ваше завершенное задание.

В любом случае, как только вы закончите, вы можете перейти к последнему шагу и увидеть свою транскрипцию.

Получение результата задания транскрипции

Теперь вы берете TranscriptionJobName и передаете это getTranscriptionJob, и в этом результате вы можете увидеть результат своей транскрипции в ключе Media.Transcript.TranscriptFileUri.

ats.getTranscriptionJob({
  "TranscriptionJobName": "H4TSEpisode001"
}, (err, result) => {
  if(err) throw err;
  console.log(result)
});

/*
{
  TranscriptionJob: {
    TranscriptionJobName: 'H4TSEpisode001',
    TranscriptionJobStatus: 'COMPLETED',
    LanguageCode: 'en-US',
    MediaSampleRateHertz: 44100,
    MediaFormat: 'mp3',
    Media: {
      MediaFileUri: 'https://s3.amazonaws.com/mrh-podcasts/hackforthesea/public/Hack+for+the+Sea+Episode+001_mixdown.mp3'
    },
    Transcript: {
      TranscriptFileUri: 'https://s3.amazonaws.com/aws-transcribe-us-east-1-prod/686528633557/H4TSEpisode001/asrOutput.json?X-Amz-Security-Token=FQoDYXdzEK%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDOb4UdAIeQ162U3ghSK3A8xERzGjbGK%2Bc2GjA1IfroDWt3zG%2FJnh6MlekMyhBIGwqSwy02FIvjD4B0KRfIvW7xVPR0hJzSPAU1xaRwneJHD8SsSy%2BEswlr5bv1CgVT7ejxXosy0TXJhytfDNDNjBjz47EyOJj5rjuZtKb%2FeVHX9ClC1BXqO%2Bf9Cw%2BuUv74ZhEWObcCudfRutYCx4H9b2yMszXS%2F2FZUQxU4MgadHJIxz0zv9RtZkOXN7tfEsbWT0P1FS04QRkTjPdMJ1n%2FbVBCBIMn61tt1qceXi2s7MjAwJLVeTbD%2Fx%2B2rTxEM%2B9lq6odhr9rZpZFmpMac48FT%2FVEaFBm7mk3EslUeE%2BLZp1WIV3KDDcPcQt8rGHLHJA6%2BxtmMczGXLq5ftVHOgksh76pKO8MFodixIl2znrGno8vvGlw5xcOqIEw7DjJm3FRLR1RZMQ3DCBT5VgWYQCcQJ85eArVfldimHySNb9d6T8ALKQ89AQZ27vtA4mbyKgKOE1s0ZvVj6gS8Uo75g2PsXFRORUJ8Vu8XiK6ruU3uSVSdK%2FkIDomrWYHgfQ6LcZTpX8Gqr6TGNhwrx6gl2JhZuBbQOw58NN5konob%2F0gU%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20180117T225402Z&X-Amz-SignedHeaders=host&X-Amz-Expires=899&X-Amz-Credential=ASIAISX7NSCWWIWIBAYA%2F20180117%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=2016800618c94e9be0e078227a75cdbfa243605a05f455e8c355123aea6f69fa'
    },
    CreationTime: 2018-01-17T22:04:38.073Z,
    CompletionTime: 2018-01-17T22:42:42.232Z
  }
}
*/

Изучение содержимого файла транскрипции

Посетите URL-адрес из приведенного выше результата в браузере, чтобы загрузить его. Тогда давайте посмотрим на это:

{
  "jobName":"H4TSEpisode001",
  "accountId":"686528633557",
  "results":{
    "transcripts":[
      {"transcript":"Wait no so ten fifteen twenty seventeen we will be hosting the second annual had..."}
    ],
    "items":[
      {"start_time":"8.130","end_time":"12.730","alternatives":[{"confidence":"0.8163","content":"Wait"}],"type":"pronunciation"},
      {"start_time":"21.010","end_time":"21.070","alternatives":[{"confidence":"0.1488","content":"no"}],"type":"pronunciation"},
      {"start_time":"41.170","end_time":"41.470","alternatives":[{"confidence":"0.8094","content":"so"}],"type":"pronunciation"},
    ]
  },
  "status":"COMPLETED"
}

Круто. Некоторые беглые метаданные, а также текстовая расшифровка. раздел «items», где он становится действительно интересным. Вы получаете хороший массив большинства элементов

Для любопытных, вот полная текстовая транскрипция, как это понимает Amazon Transcribe.

Мои первые впечатления

Первое, что я хочу от этого, - это обнаружение динамиков, т. е. знание того, сколько разных динамиков есть, и возможность отличать их голоса. В подкастах обычно есть несколько хостов или хост и гость для собеседования, поэтому это было бы полезно.

Кроме того, было бы здорово, если бы можно было как-то отправить исправления на слова, чтобы помочь с обучением. Я уверен, что Amazon имеет неплохую работу, но, возможно, на уровне аккаунта? Или для собственных существительных? Я по-прежнему считаю, что людям было бы полезно предоставить эту обратную связь.


Кайл Мэтьюз

Написано Марком Робертом Хендерсоном, который живет в Кейп-Энн, работает в Бостоне и играет с распределенными приложениями и технологической философией в Интернете. Знание социальных сетей Марка медленно и сознательно отмирает, поэтому лучший способ связаться с ним - по электронной почте.