Speech-To-Text à l’aide d’Amazon Transcribe en PHP
Récemment, je travaillais sur un projet où j’ai été présenté avec le service Amazon Transcribe. Nous voulions ajouter la fonctionnalité de conversion de la parole en texte dans notre application. Et nous avons trouvé qu’Amazon Transcribe est la meilleure solution pour cela. Amazon Transcribe utilise un processus d’apprentissage en profondeur appelé reconnaissance vocale automatique (ASR) pour convertir la parole en texte rapidement et avec précision.
Dans cet article, je vous montre comment convertir la parole en texte à l’aide d’Amazon Transcribe en PHP. Nous utiliserons le package AWS SDK officiel conçu pour la programmation PHP.
Commencer
Pour commencer, vous devez avoir un compte AWS. Connectez-vous à votre compte AWS et récupérez vos informations d’identification de sécurité. Nous aurons besoin de ces informations d’identification dans la dernière partie du didacticiel.
Après cela, installez la bibliothèque PHP AWS SDK à l’aide de la commande Composer :
composer require aws/aws-sdk-php
Pour convertir le discours en texte, vous devez disposer de vos fichiers multimédias. Les formats multimédias autorisés sont mp3 | mp4 | wav | flac
. En plus de cela, plusieurs langues sont disponibles pour convertir votre discours en texte. Vous pouvez voir toutes les langues prises en charge et les informations de base sur les paramètres dans leur documentation. L’utilisateur peut convertir le discours des langues prises en charge en texte.
Lors de l’intégration d’Amazon Transcribe dans l’application, nous devons construire le flux comme suit :
- Téléchargez le fichier multimédia sur S3 Bucket.
- Instanciez un client Amazon Transcribe.
- Démarrez une tâche de transcription d’Amazon Transcribe en transmettant l’URL multimédia de S3 et l’ID de tâche unique.
- Le service Amazon Transcribe peut prendre quelques minutes pour terminer le processus de traduction. Attendez-le donc.
- Téléchargez le fichier texte une fois qu’AWS a terminé la tâche de transcription.
Voyons comment gérer ce flux avec le code PHP réel.
Speech-To-Text à l’aide d’Amazon Transcribe en PHP
Dans un premier temps, créez un formulaire HTML où les utilisateurs peuvent parcourir le fichier multimédia et cliquer sur le bouton d’envoi. Lors de la soumission, nous prenons le fichier multimédia pour un traitement ultérieur et finalement renvoyons un texte de traduction au navigateur au format de fichier ‘.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>
Côté PHP, vous devez envoyer le fichier multimédia au service AWS pour traitement, donc incluez l’environnement AWS comme suit.
<?php
require 'vendor/autoload.php';
use AwsS3S3Client;
use AwsTranscribeServiceTranscribeServiceClient;
// submission code
Après cela, téléchargez le fichier multimédia sur le compartiment S3. Et récupérez l’URL S3 du média téléchargé.
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();
}
}
Assurez-vous de remplacer les espaces réservés par les valeurs réelles. Ensuite, nous devons transmettre l’URL du média téléchargé au service Amazon Transcribe. Cela nécessite également un identifiant de travail unique que je vais créer à l’aide de la uniqid()
méthode.
// 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
Dans le code ci-dessus, nous instancions Amazon Transcribe Client et démarrons la tâche de transcription. Le processus de traduction peut prendre quelques minutes. Je l’ai géré en utilisant la boucle while et la méthode sleep(). Je vérifie si le processus est terminé toutes les 5 secondes et je casse la boucle à la fin du processus.
Vous pouvez voir ce processus de transcription sur le tableau de bord AWS sous Amazon Transcribe->Tâches de transcription, comme indiqué dans la capture d’écran ci-dessous.
Enfin, téléchargez le fichier en utilisant le code ci-dessous.
$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();
Ce code envoie le fichier texte généré au navigateur afin que l’utilisateur puisse le télécharger.
Exemple de code final
Le code écrit ci-dessus est en morceaux. Si vous voulez un code entier ensemble, alors c’est comme suit.
<?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>
J’espère que vous comprendrez comment convertir la parole en texte à l’aide d’Amazon Transcribe en PHP. S’il vous plaît partager vos pensées et suggestions dans la section commentaires ci-dessous.
Articles Liés
- Text-To-Speech utilisant Amazon Polly en PHP
- Charger des fichiers sur Amazon S3 à l’aide d’AWS PHP SDK
- Comment télécharger un fichier sur S3 à l’aide du système de fichiers Laravel