Мова до тексту за допомогою 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 і запускаємо завдання транскрипції. Процес перекладу може зайняти кілька хвилин. Я обробляв це за допомогою методу while loop і sleep(). Я перевіряю, чи процес завершується через кожні 5 секунд, і перериваю цикл після завершення процесу.
Ви можете побачити цей процес транскрипції на інформаційній панелі AWS під Amazon Transcribe-> Транскрипція завдань, як показано на скріншоті нижче.
Нарешті, завантажте файл, використовуючи код нижче.
$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