...
✅ WEB- und WordPress-Nachrichten, Themen, Plugins. Hier teilen wir Tipps und beste Website-Lösungen.

Speech-to-Text mit Amazon Transcribe in PHP

55

Kürzlich arbeitete ich an einem Projekt, bei dem mir der Amazon Transcribe- Dienst vorgestellt wurde. Wir wollten in unserer Anwendung die Funktion zum Konvertieren von Sprache in Text hinzufügen. Und wir haben festgestellt, dass Amazon Transcribe dafür am besten geeignet ist. Amazon Transcribe verwendet einen Deep-Learning-Prozess namens automatische Spracherkennung (ASR), um Sprache schnell und genau in Text umzuwandeln.

In diesem Artikel zeige ich Ihnen, wie Sie mit Amazon Transcribe in PHP Sprache in Text umwandeln. Wir werden das offizielle AWS SDK-Paket verwenden, das für die PHP-Programmierung entwickelt wurde.

Einstieg

Um loszulegen, sollten Sie über ein AWS-Konto verfügen. Melden Sie sich bei Ihrem AWS-Konto an und rufen Sie Ihre Sicherheitsanmeldeinformationen ab. Wir werden diese Anmeldeinformationen im späteren Teil des Tutorials benötigen.

Speech-to-Text mit Amazon Transcribe in PHP

Installieren Sie anschließend die AWS SDK PHP- Bibliothek mit dem Composer-Befehl:

composer require aws/aws-sdk-php

Um die Sprache in Text umzuwandeln, benötigen Sie Ihre Mediendateien. Erlaubte Medienformate sind mp3 | mp4 | wav | flac. Darüber hinaus stehen Ihnen mehrere Sprachen zur Verfügung, um Ihre Sprache in Text umzuwandeln. Sie können alle unterstützten Sprachen und grundlegende Dinge zu Parametern in ihrer Dokumentation sehen. Der Benutzer kann die Sprache unterstützter Sprachen in den Text umwandeln.

Bei der Integration von Amazon Transcribe in die Anwendung müssen wir den Flow wie folgt aufbauen:

  • Laden Sie die Mediendatei in den S3-Bucket hoch.
  • Instanziieren Sie einen Amazon Transcribe-Client.
  • Starten Sie einen Transkriptionsjob von Amazon Transcribe, indem Sie die Medien-URL von S3 und eine eindeutige Job-ID übergeben.
  • Der Amazon Transcribe-Service kann einige Minuten dauern, bis der Übersetzungsvorgang abgeschlossen ist. Also warte darauf.
  • Laden Sie die Textdatei herunter, nachdem AWS den Transkriptionsjob abgeschlossen hat.

Sehen wir uns an, wie Sie diesen Fluss mit dem tatsächlichen PHP-Code handhaben können.

Speech-to-Text mit Amazon Transcribe in PHP

Erstellen Sie zunächst ein HTML-Formular, in dem Benutzer die Mediendatei durchsuchen und auf die Schaltfläche Senden klicken können. Nach dem Einreichen nehmen wir die Mediendatei zur Weiterverarbeitung und senden schließlich einen Übersetzungstext im Dateiformat ‘.txt’ an den Browser zurück.

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

Auf PHP-Seite müssen Sie die Mediendatei zur Verarbeitung an den AWS-Service senden, also binden Sie die AWS-Umgebung wie folgt ein.

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

Laden Sie anschließend die Mediendatei in den S3-Bucket hoch. Und nimm die S3-URL des hochgeladenen Mediums.

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

Stellen Sie sicher, dass Sie die Platzhalter durch die tatsächlichen Werte ersetzen. Als Nächstes müssen wir die hochgeladene Medien-URL an den Amazon Transcribe-Dienst übergeben. Es erfordert auch eine eindeutige Job-ID, die ich mit der uniqid()Methode erstellen werde .

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

Im obigen Code instanziieren wir Amazon Transcribe Client und starten den Transkriptionsjob. Es kann einige Minuten dauern, bis der Übersetzungsvorgang abgeschlossen ist. Ich habe es mit der while-Schleife und der sleep()-Methode behandelt. Ich überprüfe alle 5 Sekunden, ob der Vorgang abgeschlossen ist und unterbreche die Schleife, wenn der Vorgang abgeschlossen ist.

Sie können diesen Transkriptionsprozess im AWS-Dashboard unter den Amazon Transcribe->Transcription-Jobs sehen, wie im Screenshot unten gezeigt.

Speech-to-Text mit Amazon Transcribe in PHP

Laden Sie abschließend die Datei mit dem folgenden Code herunter.

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

Dieser Code sendet die generierte Textdatei an den Browser, damit der Benutzer sie herunterladen kann.

Endgültiger Beispielcode

Der oben geschriebene Code ist in Blöcken. Wenn Sie einen ganzen Code zusammen haben möchten, ist dies wie folgt.

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

Ich hoffe, Sie verstehen, wie Sie mit Amazon Transcribe in PHP Sprache in Text umwandeln. Bitte teilen Sie Ihre Gedanken und Vorschläge im Kommentarbereich unten mit.

Zum Thema passende Artikel

Aufnahmequelle: artisansweb.net

Diese Website verwendet Cookies, um Ihre Erfahrung zu verbessern. Wir gehen davon aus, dass Sie damit einverstanden sind, Sie können sich jedoch abmelden, wenn Sie möchten. Annehmen Weiterlesen