...
✅ Noticias, temas, complementos de WEB y WordPress. Aquí compartimos consejos y las mejores soluciones para sitios web.

Conversión de voz a texto con Amazon Transcribe en PHP

369

Recientemente, estaba trabajando en un proyecto en el que me presentaron el servicio Amazon Transcribe. Queríamos agregar la función de convertir voz en texto en nuestra aplicación. Y descubrimos que Amazon Transcribe es la mejor opción. Amazon Transcribe utiliza un proceso de aprendizaje profundo llamado reconocimiento automático de voz (ASR) para convertir la voz en texto de forma rápida y precisa.

En este artículo, le muestro cómo convertir voz en texto usando Amazon Transcribe en PHP. Usaremos el paquete AWS SDK oficial creado para la programación PHP.

Empezando

Para comenzar, debe tener una cuenta de AWS. Inicie sesión en su cuenta de AWS y obtenga sus credenciales de seguridad. Necesitaremos estas credenciales en la parte posterior del tutorial.

Conversión de voz a texto con Amazon Transcribe en PHP

Después de esto, instale la biblioteca PHP de AWS SDK con el comando Composer:

composer require aws/aws-sdk-php

Para convertir el discurso en texto, necesita que sus archivos multimedia estén listos. Los formatos de medios permitidos son mp3 | mp4 | wav | flac. Además de esto, hay varios idiomas disponibles para convertir su discurso en texto. Puede ver todos los idiomas admitidos y aspectos básicos sobre los parámetros en su documentación. El usuario puede convertir el habla de los idiomas admitidos en texto.

Al integrar Amazon Transcribe en la aplicación, tenemos que construir el flujo de la siguiente manera:

  • Cargue el archivo multimedia en S3 Bucket.
  • Cree una instancia de un cliente de Amazon Transcribe.
  • Inicie un trabajo de transcripción de Amazon Transcribe pasando la URL de medios de S3 y una identificación de trabajo única.
  • El servicio Amazon Transcribe puede tardar unos minutos en finalizar el proceso de traducción. Así que espéralo.
  • Descargue el archivo de texto después de que AWS complete el trabajo de transcripción.

Veamos cómo manejar este flujo con el código PHP real.

Conversión de voz a texto con Amazon Transcribe en PHP

Al principio, cree un formulario HTML donde los usuarios puedan navegar por el archivo multimedia y presionar el botón enviar. Una vez enviado, tomamos el archivo multimedia para su procesamiento posterior y finalmente enviamos un texto de traducción al navegador en formato de archivo ‘.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>

En el extremo de PHP, debe enviar el archivo multimedia al servicio de AWS para su procesamiento, por lo que debe incluir el entorno de AWS de la siguiente manera.

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

Después de esto, cargue el archivo multimedia en el depósito de S3. Y tome la URL de S3 de los medios cargados.

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

Asegúrese de reemplazar los marcadores de posición con los valores reales. A continuación, debemos pasar la URL de los medios cargados al servicio Amazon Transcribe. También requiere una identificación de trabajo única que crearé usando el uniqid()método.

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

En el código anterior, creamos una instancia de Amazon Transcribe Client e iniciamos el trabajo de Transcripción. Es posible que el proceso de traducción demore unos minutos. Lo he manejado usando el método while loop y sleep(). Estoy verificando si el proceso se completa después de cada 5 segundos y rompiendo el ciclo al finalizar el proceso.

Puede ver este proceso de transcripción en el panel de AWS en Amazon Transcribe-> Trabajos de transcripción como se muestra en la captura de pantalla a continuación.

Conversión de voz a texto con Amazon Transcribe en PHP

Finalmente, descargue el archivo usando el siguiente código.

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

Este código envía el archivo de texto generado al navegador para que el usuario pueda descargarlo.

Código de muestra final

El código escrito arriba está en trozos. Si desea un código completo junto, entonces es el siguiente.

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

Espero que comprenda cómo convertir voz en texto usando Amazon Transcribe en PHP. Comparta sus pensamientos y sugerencias en la sección de comentarios a continuación.

Artículos relacionados

Fuente de grabación: 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