Tal till text med Amazon Transcribe i PHP
Nyligen arbetade jag med ett projekt där jag introducerades med Amazon Transcribe- tjänsten. Vi ville lägga till funktionen för att konvertera tal till text i vår applikation. Och vi fann att Amazon Transcribe passar bäst för det. Amazon Transcribe använder en djup inlärningsprocess som kallas automatisk taligenkänning (ASR) för att omvandla tal till text snabbt och exakt.
I den här artikeln visar jag dig hur du konverterar tal till text med Amazon Transcribe i PHP. Vi använder det officiella AWS SDK-paketet som är byggt för PHP-programmering.
Komma igång
För att komma igång bör du ha ett AWS-konto. Logga in på ditt AWS-konto och få dina säkerhetsuppgifter. Vi kommer att kräva dessa referenser i den senare delen av handledningen.
Efter detta installerar du AWS SDK PHP- biblioteket med kommandot Composer:
composer require aws/aws-sdk-php
För att konvertera talet till text behöver du dina mediefiler redo. Tillåtna mediaformat är mp3 | mp4 | wav | flac
. Utöver detta finns det flera språk tillgängliga för att konvertera ditt tal till text. Du kan se alla språk som stöds och grundläggande saker om parametrar i deras dokumentation. Användaren kan konvertera talet på språk som stöds till texten.
Samtidigt som vi integrerar Amazon Transcribe i applikationen måste vi bygga flödet enligt följande:
- Ladda upp mediefilen på S3 Bucket.
- Instantiera en Amazon Transcribe Client.
- Starta ett transkriptionsjobb för Amazon Transcribe genom att skicka medie-URL till S3 och unikt jobb-id.
- Amazon Transcribe-tjänsten kan ta några minuter att avsluta översättningen. Så vänta på det.
- Ladda ner textfilen när AWS har slutfört transkriptionsjobbet.
Låt oss se hur vi hanterar detta flöde med den faktiska PHP-koden.
Tal till text med Amazon Transcribe i PHP
Skapa först ett HTML-formulär där användare kan bläddra i mediefilen och klicka på knappen Skicka. Efter inlämning tar vi mediefilen för vidare bearbetning och skickar slutligen en översättningstext tillbaka till webbläsaren i filformatet ‘.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>
I PHP-änden måste du skicka mediefilen till AWS-tjänsten för bearbetning, så inkludera AWS-miljön enligt följande.
<?php
require 'vendor/autoload.php';
use AwsS3S3Client;
use AwsTranscribeServiceTranscribeServiceClient;
// submission code
Efter detta laddar du upp mediefilen på S3-skopan. Och ta tag i S3-URL: en för det uppladdade mediet.
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();
}
}
Se till att ersätta platshållarna med de faktiska värdena. Därefter måste vi skicka den uppladdade medias URL till Amazon Transcribe-tjänsten. Det kräver också ett unikt jobb-ID som jag kommer att skapa med uniqid()
metoden.
// 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
I ovanstående kod instanserar vi Amazon Transcribe Client och startar Transkriptionsjobbet. Det kan ta några minuter att slutföra översättningen. Jag har hanterat det med metoden while loop and sleep(). Jag kontrollerar om processen är klar efter var 5: e sekund och bryter slingan när processen är klar.
Du kan se denna transkriptionsprocess på AWS-instrumentpanelen under Amazon Transcribe-> Transkriptionsjobb som visas på skärmdumpen nedan.
Slutligen ladda ner filen med koden nedan.
$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();
Den här koden skickar den genererade textfilen till webbläsaren så att användaren kan ladda ner den.
Slutlig provkod
Koden skriven ovan är i bitar. Om du vill ha en hel kod tillsammans är det som följer.
<?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>
Jag hoppas att du förstår hur du konverterar tal till text med Amazon Transcribe i PHP. Dela dina tankar och förslag i kommentarsektionen nedan.
relaterade artiklar
- Text-till-tal med Amazon Polly i PHP
- Ladda upp filer till Amazon S3 med AWS PHP SDK
- Hur laddar jag upp filen till S3 med Laravel Filesystem