Zamiana mowy na tekst przy użyciu transkrypcji Amazon w PHP
Ostatnio pracowałem nad projektem, w którym zapoznałem się z usługą Amazon Transscribe. Chcieliśmy dodać funkcję konwersji mowy na tekst w naszej aplikacji. Odkryliśmy, że najlepiej do tego nadaje się Amazon Transcribe. Amazon Transscribe wykorzystuje proces głębokiego uczenia się zwany automatycznym rozpoznawaniem mowy (ASR), aby szybko i dokładnie konwertować mowę na tekst.
W tym artykule pokażę, jak przekonwertować mowę na tekst za pomocą Amazon Transcribe w PHP. Wykorzystamy oficjalny pakiet AWS SDK zbudowany do programowania w PHP.
Pierwsze kroki
Aby rozpocząć, powinieneś mieć konto AWS. Zaloguj się na swoje konto AWS i pobierz swoje dane uwierzytelniające. Te poświadczenia będą nam potrzebne w dalszej części samouczka.
Następnie zainstaluj bibliotekę PHP AWS SDK za pomocą polecenia Composer:
composer require aws/aws-sdk-php
Aby przekonwertować mowę na tekst, potrzebujesz gotowych plików multimedialnych. Dozwolone formaty multimediów to mp3 | mp4 | wav | flac
. Oprócz tego dostępnych jest kilka języków do konwersji mowy na tekst. Możesz zobaczyć wszystkie obsługiwane języki i podstawowe informacje o parametrach w ich dokumentacji. Użytkownik może konwertować mowę obsługiwanych języków na tekst.
Integrując Amazon Transcribe w aplikacji, musimy zbudować przepływ w następujący sposób:
- Prześlij plik multimedialny do S3 Bucket.
- Utwórz wystąpienie klienta Amazon Transscribe.
- Rozpocznij zadanie transkrypcji usługi Amazon Transcribe, przekazując adres URL mediów S3 i unikalny identyfikator zadania.
- Usługa Amazon Transscribe może potrwać kilka minut, aby zakończyć proces tłumaczenia. Więc poczekaj na to.
- Pobierz plik tekstowy po zakończeniu przez AWS zadania transkrypcji.
Zobaczmy, jak obsłużyć ten przepływ z rzeczywistym kodem PHP.
Zamiana mowy na tekst przy użyciu transkrypcji Amazon w PHP
Najpierw utwórz formularz HTML, w którym użytkownicy mogą przeglądać plik multimedialny i nacisnąć przycisk przesyłania. Po przesłaniu pobieramy plik multimedialny do dalszego przetwarzania i na koniec wysyłamy tekst tłumaczenia z powrotem do przeglądarki w formacie pliku „.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>
Po stronie PHP musisz wysłać plik multimedialny do usługi AWS w celu przetworzenia, więc dołącz środowisko AWS w następujący sposób.
<?php
require 'vendor/autoload.php';
use AwsS3S3Client;
use AwsTranscribeServiceTranscribeServiceClient;
// submission code
Następnie prześlij plik multimedialny do zasobnika S3. I pobierz adres URL S3 przesłanych multimediów.
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();
}
}
Pamiętaj, aby zastąpić symbole zastępcze rzeczywistymi wartościami. Następnie musimy przekazać adres URL przesłanego multimediów do usługi Amazon Transscribe. Wymaga również unikalnego identyfikatora pracy, który stworzę tą uniqid()
metodą.
// 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
W powyższym kodzie tworzymy instancję klienta transkrypcji Amazon i rozpoczynamy zadanie transkrypcji. Ukończenie procesu tłumaczenia może potrwać kilka minut. Obsłużyłem to za pomocą pętli while i metody sleep(). Sprawdzam, czy proces się kończy co 5 sekund i przerywam pętlę po zakończeniu procesu.
Możesz zobaczyć ten proces transkrypcji na pulpicie nawigacyjnym AWS w zakładce Amazon Transcribe->Transkrypcja, jak pokazano na zrzucie ekranu poniżej.
Na koniec pobierz plik, korzystając z poniższego kodu.
$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();
Ten kod wysyła wygenerowany plik tekstowy do przeglądarki, aby użytkownik mógł go pobrać.
Kod próbki końcowej
Kod napisany powyżej jest porcjami. Jeśli chcesz mieć cały kod razem, to wygląda następująco.
<?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>
Mam nadzieję, że rozumiesz, jak konwertować mowę na tekst za pomocą Amazon Transscribe w PHP. Podziel się swoimi przemyśleniami i sugestiami w sekcji komentarzy poniżej.
Powiązane artykuły
- Text-To-Speech przy użyciu Amazon Polly w PHP
- Prześlij pliki do Amazon S3 za pomocą AWS PHP SDK
- Jak przesłać plik do S3 za pomocą systemu plików Laravel?