Kõne tekstiks, kasutades PHP-s Amazon Transcribe’i
Hiljuti töötasin projekti kallal, kus mind tutvustati teenusega Amazon Transcribe. Tahtsime oma rakendusse lisada kõne tekstiks teisendamise funktsiooni. Ja leidsime, et Amazon Transcribe sobib sellele kõige paremini. Amazon Transcribe kasutab kõne kiireks ja täpseks teisendamiseks sügavat õppeprotsessi, mida nimetatakse automaatseks kõnetuvastuseks (ASR).
Selles artiklis näitan teile, kuidas kõne tekstiks teisendada, kasutades PHP-s Amazon Transcribe’i. Kasutame PHP programmeerimiseks loodud ametlikku AWS SDK paketti.
Alustamine
Alustamiseks peaks teil olema AWS-i konto. Logige sisse oma AWS-i kontole ja haarake oma turvamandaadid. Nõume neid volitusi juhendaja hilisemas osas.
Pärast seda installige AWS SDK PHP teek, kasutades käsku Composer:
composer require aws/aws-sdk-php
Kõne teisendamiseks tekstiks peate oma meediumifailid valmis olema. Lubatud meediumivormingud on mp3 | mp4 | wav | flac
. Lisaks sellele on kõne tekstiks teisendamiseks saadaval mitu keelt. Nende dokumentatsioonist leiate kõik toetatud keeled ja põhiasjad parameetrite kohta. Kasutaja saab teisendada toetatud keelte kõne tekstiks.
Rakendusse Amazon Transcribe integreerides peame voo üles ehitama järgmiselt:
- Laadige meediumifail üles S3 ämbrisse.
- Instant Amazon Transcribe Client.
- Alustage Amazon Transcribe’i transkriptsioonitööd, edastades meedia URL-i S3 ja kordumatu töö ID.
- Teenuse Amazon Transcribe tõlkimisprotsessi lõpuleviimiseks võib kuluda mõni minut. Nii et oodake seda.
- Laadige tekstifail alla pärast AWSi transkriptsioonitöö lõpetamist.
Vaatame, kuidas seda voogu tegeliku PHP-koodiga käsitseda.
Kõne tekstiks, kasutades PHP-s Amazon Transcribe’i
Esmalt looge HTML-vorm, kus kasutajad saavad meediumifaili sirvida ja vajutada nuppu Esita. Esitamisel võtame meediumifaili edasiseks töötlemiseks ja saadame lõpuks tõlketeksti brauserisse failivormingus ‘.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-s peate meediumifail töötlemiseks saatma AWS-i teenusesse, nii et lisage AWS-keskkond järgmiselt.
<?php
require 'vendor/autoload.php';
use AwsS3S3Client;
use AwsTranscribeServiceTranscribeServiceClient;
// submission code
Pärast seda laadige meediumifail üles S3 ämbrisse. Ja haarake üleslaaditud meedia S3 URL.
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();
}
}
Asendage kohatäited tegelike väärtustega. Järgmisena peame üleslaaditud meedia URL-i edastama teenusele Amazon Transcribe. See nõuab ka ainulaadset töö ID, mille ma selle uniqid()
meetodi abil loon .
// 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
Ülalolevas koodis kiirendame Amazoni transkriptsioonikliendi ja alustame transkriptsioonitööd. Tõlkeprotsessi lõpuleviimiseks võib kuluda mõni minut. Olen seda käsitlenud while loop and sleep() meetodil. Ma kontrollin, kas protsess on iga 5 sekundi järel lõpule viidud, ja katkestan protsessi lõpetamise ajal silmuse.
Seda transkriptsiooniprotsessi näete AWS-i juhtpaneelil Amazoni transkriptsiooni-> transkriptsioonitööde all, nagu on näidatud alloleval ekraanipildil.
Lõpuks laadige fail alla alloleva koodi abil.
$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();
See kood saadab loodud tekstifaili brauserisse, et kasutaja saaks selle alla laadida.
Lõplik näidiskood
Eespool kirjutatud kood on tükkidena. Kui soovite tervet koodi koos, siis on see järgmine.
<?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>
Loodan, et saate aru, kuidas kõne tekstiks teisendada, kasutades PHP-s Amazon Transcribe’i. Palun jagage oma mõtteid ja ettepanekuid allpool olevas kommentaaride jaotises.