Puhe-tekstiksi käyttämällä Amazon Transcriptiä PHP: ssä
Viime aikoina työskentelin projektissa, jossa minulle esiteltiin Amazon Transcribe -palvelu. Halusimme lisätä sovelluksellemme ominaisuuden muuntaa puhe tekstiksi. Löysimme, että Amazon Transcribe sopii siihen parhaiten. Amazon Transcribe käyttää syvää oppimisprosessia, jota kutsutaan automaattiseksi puheentunnistukseksi (ASR) muuntaa puhe tekstiksi nopeasti ja tarkasti.
Tässä artikkelissa näytän sinulle, kuinka puhe voidaan muuntaa tekstiksi Amazon Transcribe -ohjelmalla PHP: ssä. Käytämme virallista AWS SDK -pakettia, joka on rakennettu PHP-ohjelmointiin.
Päästä alkuun
Aloittamiseksi sinulla on oltava AWS-tili. Kirjaudu AWS-tilillesi ja tartu suojaustiedoihisi. Vaadimme nämä tunnistetiedot opetusohjelman myöhemmässä osassa.
Asenna tämän jälkeen AWS SDK PHP -kirjasto Composer-komennolla:
composer require aws/aws-sdk-php
Puheen muuntamiseksi tekstiksi tarvitset mediatiedostosi valmiina. Sallitut mediamuodot ovat mp3 | mp4 | wav | flac
. Tämän lisäksi on olemassa useita kieliä, joilla puheesi voidaan muuntaa tekstiksi. Näet kaikki tuetut kielet ja parametrien perustiedot niiden dokumentaatiosta. Käyttäjä voi muuntaa tuettujen kielten puheen tekstiksi.
Integroimalla Amazon Transcribe sovellukseen, meidän on rakennettava virtaus seuraavasti:
- Lataa mediatiedosto S3 Bucketiin.
- Välitä Amazon Transcribe Client.
- Aloita Amazon Transcriben transkriptiotyö välittämällä S3: n media-URL ja yksilöllinen työn tunnus.
- Amazon Transcribe -palvelun käännösprosessi saattaa kestää muutaman minuutin. Joten odota sitä.
- Lataa tekstitiedosto sen jälkeen, kun AWS on suorittanut transkriptiotyön.
Katsotaanpa, kuinka käsitellä tätä kulkua todellisen PHP-koodin kanssa.
Puhe-tekstiksi käyttämällä Amazon Transcriptiä PHP: ssä
Luo ensin HTML-lomake, jossa käyttäjät voivat selata mediatiedostoa ja painaa Lähetä-painiketta. Lähetettäessä toimitamme mediatiedoston jatkokäsittelyyn ja lopulta lähetämme käännöstekstin takaisin selaimeen .txt-tiedostomuodossa.
<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-lopussa sinun on lähetettävä mediatiedosto AWS-palvelulle käsittelyä varten, joten sisällytä AWS-ympäristö seuraavasti.
<?php
require 'vendor/autoload.php';
use AwsS3S3Client;
use AwsTranscribeServiceTranscribeServiceClient;
// submission code
Tämän jälkeen lataa mediatiedosto S3-ämpäriin. Tartu sitten ladatun median S3-URL-osoitteeseen.
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();
}
}
Muista korvata paikkamerkit todellisilla arvoilla. Seuraavaksi meidän on lähetettävä ladattu media-URL Amazon Transcribe -palvelulle. Se vaatii myös ainutlaatuisen työtunnuksen, jonka luon uniqid()
menetelmällä.
// 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
Yllä olevassa koodissa me välitämme Amazon Transcribe Client -sovelluksen ja aloitamme transkriptiotyön. Käännöksen suorittaminen voi kestää muutaman minuutin. Olen käsitellyt sen käyttäen while loop and sleep() -menetelmää. Tarkistan, onko prosessi valmis 5 sekunnin välein, ja katkaisen silmukan prosessin päätyttyä.
Näet tämän transkriptioprosessin AWS-hallintapaneelissa Amazon Transcriptione-> Transcription -työt -kohdassa alla olevan kuvakaappauksen mukaisesti.
Lataa lopuksi tiedosto alla olevalla koodilla.
$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();
Tämä koodi lähettää luodun tekstitiedoston selaimeen, jotta käyttäjä voi ladata sen.
Lopullinen näytekoodi
Yllä kirjoitettu koodi on paloina. Jos haluat kokonaisen koodin yhdessä, se on seuraava.
<?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>
Toivon, että ymmärrät kuinka muuntaa puhe tekstiksi Amazon Transcribe -ohjelmalla PHP: ssä. Jaa ajatuksesi ja ehdotuksesi alla olevassa kommenttiosassa.