...
✅ Notizie, temi, plugin WEB e WordPress. Qui condividiamo suggerimenti e le migliori soluzioni per siti web.

Speech-to-Text utilizzando Amazon Transcribe in PHP

42

Recentemente stavo lavorando a un progetto in cui sono stato introdotto con il servizio Amazon Transcribe. Volevamo aggiungere la funzionalità di conversione della voce in testo nella nostra applicazione. E abbiamo scoperto che Amazon Transcribe è la soluzione migliore. Amazon Transcribe utilizza un processo di deep learning chiamato riconoscimento vocale automatico (ASR) per convertire il parlato in testo in modo rapido e preciso.

In questo articolo, ti mostro come convertire la voce in testo utilizzando Amazon Transcribe in PHP. Utilizzeremo il pacchetto SDK AWS ufficiale creato per la programmazione PHP.

Iniziare

Per iniziare, dovresti avere un account AWS. Accedi al tuo account AWS e prendi le tue credenziali di sicurezza. Richiederemo queste credenziali nella parte successiva del tutorial.

Speech-to-Text utilizzando Amazon Transcribe in PHP

Successivamente, installa la libreria PHP dell’SDK AWS utilizzando il comando Composer:

composer require aws/aws-sdk-php

Per convertire il discorso in testo, hai bisogno che i tuoi file multimediali siano pronti. I formati multimediali consentiti sono mp3 | mp4 | wav | flac. Oltre a questo, sono disponibili diverse lingue per convertire il tuo discorso in testo. Puoi vedere tutte le lingue supportate e le cose di base sui parametri nella loro documentazione. L’utente può convertire il parlato delle lingue supportate nel testo.

Durante l’integrazione di Amazon Transcribe nell’applicazione, dobbiamo creare il flusso come segue:

  • Carica il file multimediale su S3 Bucket.
  • Crea un’istanza di un client Amazon Transcribe.
  • Avvia un processo di trascrizione di Amazon Transcribe passando l’URL multimediale di S3 e l’ID processo univoco.
  • Il servizio Amazon Transcribe potrebbe richiedere alcuni minuti per completare il processo di traduzione. Quindi aspettalo.
  • Scarica il file di testo dopo che AWS ha completato il processo di trascrizione.

Vediamo come gestire questo flusso con il codice PHP vero e proprio.

Speech-to-Text utilizzando Amazon Transcribe in PHP

Inizialmente, crea un modulo HTML in cui gli utenti possono sfogliare il file multimediale e premere il pulsante di invio. Dopo l’invio, prendiamo il file multimediale per un’ulteriore elaborazione e infine inviamo un testo di traduzione al browser nel formato di file ‘.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>

Sul lato PHP, devi inviare il file multimediale al servizio AWS per l’elaborazione, quindi includi l’ambiente AWS come segue.

<?php
require 'vendor/autoload.php';
  
use AwsS3S3Client;
use AwsTranscribeServiceTranscribeServiceClient;
 
// submission code

Successivamente, carica il file multimediale sul bucket S3. E prendi l’URL S3 del supporto caricato.

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();
    }
}

Assicurati di sostituire i segnaposto con i valori effettivi. Successivamente, dobbiamo passare l’URL del supporto caricato al servizio Amazon Transcribe. Richiede anche un ID lavoro univoco che creerò utilizzando il uniqid()metodo.

// 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

Nel codice sopra, creiamo un’istanza di Amazon Transcribe Client e avviamo il processo di trascrizione. Potrebbero essere necessari alcuni minuti per completare il processo di traduzione. L’ho gestito usando il ciclo while e il metodo sleep(). Sto controllando se il processo viene completato ogni 5 secondi e interrompo il ciclo al termine del processo.

Puoi vedere questo processo di trascrizione sul pannello di controllo di AWS sotto Amazon Transcribe-> Lavori di trascrizione come mostrato nello screenshot qui sotto.

Speech-to-Text utilizzando Amazon Transcribe in PHP

Infine, scarica il file utilizzando il codice sottostante.

$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();

Questo codice invia il file di testo generato al browser in modo che l’utente possa scaricarlo.

Codice campione finale

Il codice scritto sopra è in blocchi. Se vuoi un intero codice insieme, è come segue.

<?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>

Spero che tu capisca come convertire la voce in testo utilizzando Amazon Transcribe in PHP. Per favore condividi i tuoi pensieri e suggerimenti nella sezione commenti qui sotto.

articoli Correlati

Fonte di registrazione: artisansweb.net

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More