...
Actualités WEB et WordPress, thèmes, plugins. Ici, nous partageons des conseils et les meilleures solutions de sites Web.

Speech-To-Text à l’aide d’Amazon Transcribe en PHP

51

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.

Speech-To-Text à l'aide d'Amazon Transcribe en PHP

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.

Speech-To-Text à l'aide d'Amazon Transcribe en PHP

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

Source d’enregistrement: artisansweb.net

Ce site utilise des cookies pour améliorer votre expérience. Nous supposerons que cela vous convient, mais vous pouvez vous désinscrire si vous le souhaitez. J'accepte Plus de détails