Преобразование речи в текст с использованием Amazon Transcribe на PHP
Недавно я работал над проектом, где меня познакомили со службой Amazon Transcribe. Мы хотели добавить в наше приложение функцию преобразования речи в текст. И мы обнаружили, что Amazon Transcribe лучше всего подходит для этого. Amazon Transcribe использует процесс глубокого обучения, называемый автоматическим распознаванием речи (ASR), для быстрого и точного преобразования речи в текст.
В этой статье я покажу вам, как преобразовать речь в текст с помощью Amazon Transcribe на PHP. Мы будем использовать официальный пакет AWS SDK, созданный для программирования PHP.
Начиная
Для начала у вас должна быть учетная запись AWS. Войдите в свою учетную запись AWS и получите свои учетные данные. Эти учетные данные потребуются нам в более поздней части руководства.
После этого установите библиотеку PHP AWS SDK с помощью команды Composer:
composer require aws/aws-sdk-php
Чтобы преобразовать речь в текст, вам нужны готовые медиафайлы. Допустимые медиа форматы mp3 | mp4 | wav | flac
. В дополнение к этому существует несколько языков, на которых ваша речь может быть преобразована в текст. Вы можете увидеть все поддерживаемые языки и основные сведения о параметрах в их документации. Пользователь может преобразовать речь поддерживаемых языков в текст.
При интеграции Amazon Transcribe в приложение мы должны построить поток следующим образом:
- Загрузите медиафайл в S3 Bucket.
- Создайте экземпляр клиента Amazon Transcribe.
- Запустите задание по транскрипции Amazon Transcribe, передав URL-адрес мультимедиа S3 и уникальный идентификатор задания.
- Для завершения процесса перевода сервису Amazon Transcribe может потребоваться несколько минут. Так что жди этого.
- Загрузите текстовый файл после того, как AWS завершит задание по транскрипции.
Давайте посмотрим, как справиться с этим потоком с помощью реального кода PHP.
Преобразование речи в текст с использованием Amazon Transcribe на PHP
Сначала создайте HTML-форму, в которой пользователи могут просматривать медиафайл и нажимать кнопку отправки. После отправки мы берем медиафайл для дальнейшей обработки и, наконец, отправляем текст перевода обратно в браузер в формате файла .txt.
<form method="post" enctype="multipart/form-data">
<p><input type="file" name="audio" accept="audio/*,video/*" /></p>
<input type="submit" name="submit" value="Submit" />
</form>
На стороне PHP вы должны отправить медиафайл в сервис AWS для обработки, поэтому включите среду AWS следующим образом.
<?php
require 'vendor/autoload.php';
use AwsS3S3Client;
use AwsTranscribeServiceTranscribeServiceClient;
// submission code
После этого загрузите медиафайл в корзину S3. И возьмите URL-адрес загруженного мультимедиа S3.
if (isset($_POST['submit'])) {
$arr_mime_types = ['audio/wav', 'audio/mpeg', 'video/mp4', 'audio/x-flac'];
if (!in_array($_FILES['audio']['type'], $arr_mime_types)) {
die('File type is not allowed');
}
$region = 'PASS_REGION';
$access_key = 'ACCESS_KEY';
$secret_access_key = 'SECRET_ACCESS_KEY';
// Instantiate an Amazon S3 client.
$s3 = new S3Client([
'version' => 'latest',
'region' => $region,
'credentials' => [
'key' => $access_key,
'secret' => $secret_access_key
]
]);
$bucketName = 'PASS_BUCKET_NAME';
$key = basename($_FILES['audio']['name']);
// upload file on S3 Bucket
try {
$result = $s3->putObject([
'Bucket' => $bucketName,
'Key' => $key,
'Body' => fopen($_FILES['audio']['tmp_name'], 'r'),
'ACL' => 'public-read',
]);
$audio_url = $result->get('ObjectURL');
// Amazon Transcribe service start here
} catch (Exception $e) {
echo $e->getMessage();
}
}
Обязательно замените заполнители фактическими значениями. Затем нам нужно передать URL-адрес загруженного мультимедиа в службу Amazon Transcribe. Также требуется уникальный идентификатор задания, который я создам с помощью этого uniqid()
метода.
// Create Amazon Transcribe Client
$awsTranscribeClient = new TranscribeServiceClient([
'region' => $region,
'version' => 'latest',
'credentials' => [
'key' => $access_key,
'secret' => $secret_access_key
]
]);
// Start a Transcription Job
$job_id = uniqid();
$transcriptionResult = $awsTranscribeClient->startTranscriptionJob([
'LanguageCode' => 'en-US',
'Media' => [
'MediaFileUri' => $audio_url,
],
'TranscriptionJobName' => $job_id,
]);
$status = array();
while(true) {
$status = $awsTranscribeClient->getTranscriptionJob([
'TranscriptionJobName' => $job_id
]);
if ($status->get('TranscriptionJob')['TranscriptionJobStatus'] == 'COMPLETED') {
break;
}
sleep(5);
}
// download the txt file
В приведенном выше коде мы создаем экземпляр клиента Amazon Transcribe и запускаем задание Transcription. Завершение процесса перевода может занять несколько минут. Я обработал это с помощью цикла while и метода sleep(). Я проверяю, завершен ли процесс через каждые 5 секунд, и разрываю цикл после завершения процесса.
Вы можете увидеть этот процесс транскрипции на панели инструментов AWS в разделе Amazon Transcribe-> Transcription jobs, как показано на снимке экрана ниже.
Наконец, загрузите файл, используя приведенный ниже код.
$url = $status->get('TranscriptionJob')['Transcript']['TranscriptFileUri'];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
$data = curl_exec($curl);
if (curl_errno($curl)) {
$error_msg = curl_error($curl);
echo $error_msg;
}
curl_close($curl);
$arr_data = json_decode($data);
// download a file
$file = $job_id.".txt";
$txt = fopen($file, "w") or die("Unable to open file!");
fwrite($txt, $arr_data->results->transcripts[0]->transcript);
fclose($txt);
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename='.basename($file));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: '. filesize($file));
header("Content-Type: text/plain");
readfile($file);
exit();
Этот код отправляет сгенерированный текстовый файл в браузер, чтобы пользователь мог его загрузить.
Окончательный образец кода
Код, написанный выше, разбит на блоки. Если вы хотите, чтобы код был целиком, то он выглядит следующим образом.
<?php
set_time_limit(0);
require 'vendor/autoload.php';
use AwsS3S3Client;
use AwsTranscribeServiceTranscribeServiceClient;
if (isset($_POST['submit'])) {
$arr_mime_types = ['audio/wav', 'audio/mpeg', 'video/mp4', 'audio/x-flac'];
if (!in_array($_FILES['audio']['type'], $arr_mime_types)) {
die('File type is not allowed');
}
$region = 'PASS_REGION';
$access_key = 'ACCESS_KEY';
$secret_access_key = 'SECRET_ACCESS_KEY';
// Instantiate an Amazon S3 client.
$s3 = new S3Client([
'version' => 'latest',
'region' => $region,
'credentials' => [
'key' => $access_key,
'secret' => $secret_access_key
]
]);
$bucketName = 'PASS_BUCKET_NAME';
$key = basename($_FILES['audio']['name']);
// upload file on S3 Bucket
try {
$result = $s3->putObject([
'Bucket' => $bucketName,
'Key' => $key,
'Body' => fopen($_FILES['audio']['tmp_name'], 'r'),
'ACL' => 'public-read',
]);
$audio_url = $result->get('ObjectURL');
// Create Amazon Transcribe Client
$awsTranscribeClient = new TranscribeServiceClient([
'region' => $region,
'version' => 'latest',
'credentials' => [
'key' => $access_key,
'secret' => $secret_access_key
]
]);
// Start a Transcription Job
$job_id = uniqid();
$transcriptionResult = $awsTranscribeClient->startTranscriptionJob([
'LanguageCode' => 'en-US',
'Media' => [
'MediaFileUri' => $audio_url,
],
'TranscriptionJobName' => $job_id,
]);
$status = array();
while(true) {
$status = $awsTranscribeClient->getTranscriptionJob([
'TranscriptionJobName' => $job_id
]);
if ($status->get('TranscriptionJob')['TranscriptionJobStatus'] == 'COMPLETED') {
break;
}
sleep(5);
}
$url = $status->get('TranscriptionJob')['Transcript']['TranscriptFileUri'];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
$data = curl_exec($curl);
if (curl_errno($curl)) {
$error_msg = curl_error($curl);
echo $error_msg;
}
curl_close($curl);
$arr_data = json_decode($data);
// download a file
$file = $job_id.".txt";
$txt = fopen($file, "w") or die("Unable to open file!");
fwrite($txt, $arr_data->results->transcripts[0]->transcript);
fclose($txt);
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename='.basename($file));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: '. filesize($file));
header("Content-Type: text/plain");
readfile($file);
exit();
} catch (Exception $e) {
echo $e->getMessage();
}
}
?>
<form method="post" enctype="multipart/form-data">
<p><input type="file" name="audio" accept="audio/*,video/*" /></p>
<input type="submit" name="submit" value="Submit" />
</form>
Надеюсь, вы понимаете, как преобразовать речь в текст с помощью Amazon Transcribe на PHP. Пожалуйста, поделитесь своими мыслями и предложениями в разделе комментариев ниже.
Статьи по Теме
- Преобразование текста в речь с помощью Amazon Polly в PHP
- Загрузка файлов в Amazon S3 с помощью AWS PHP SDK
- Как загрузить файл на S3 с помощью файловой системы Laravel