Speech-To-Text usando Amazon Transcribe em PHP
Recentemente, estava trabalhando em um projeto em que fui apresentado ao serviço Amazon Transcribe. Queríamos adicionar o recurso de conversão de voz em texto em nosso aplicativo. E descobrimos que o Amazon Transcribe é a melhor opção para isso. O Amazon Transcribe usa um processo de aprendizado profundo denominado reconhecimento automático de fala (ASR) para converter fala em texto com rapidez e precisão.
Neste artigo, mostro como converter fala em texto usando o Amazon Transcribe em PHP. Usaremos o pacote oficial do SDK da AWS desenvolvido para programação PHP.
Começando
Para começar, você deve ter uma conta AWS. Faça login em sua conta da AWS e obtenha suas credenciais de segurança. Exigiremos essas credenciais na parte posterior do tutorial.
Depois disso, instale a biblioteca AWS SDK PHP usando o comando Composer:
composer require aws/aws-sdk-php
Para converter a fala em texto, você precisa de seus arquivos de mídia prontos. Os formatos de mídia permitidos são mp3 | mp4 | wav | flac
. Além disso, existem vários idiomas disponíveis para converter sua fala em texto. Você pode ver todos os idiomas suportados e itens básicos sobre parâmetros em sua documentação. O usuário pode converter a fala de idiomas suportados em texto.
Ao integrar o Amazon Transcribe no aplicativo, temos que construir o fluxo da seguinte forma:
- Faça upload do arquivo de mídia no S3 Bucket.
- Instancie um Amazon Transcribe Client.
- Inicie um trabalho de transcrição do Amazon Transcribe passando o URL de mídia S3 e o ID de trabalho exclusivo.
- O serviço Amazon Transcribe pode levar alguns minutos para concluir o processo de tradução. Então espere por isso.
- Baixe o arquivo de texto após a AWS concluir o trabalho de transcrição.
Vamos ver como lidar com esse fluxo com o código PHP real.
Speech-To-Text usando Amazon Transcribe em PHP
Em primeiro lugar, crie um formulário HTML onde os usuários podem navegar no arquivo de mídia e clicar no botão enviar. Após o envio, pegamos o arquivo de mídia para processamento posterior e, finalmente, enviamos um texto de tradução de volta ao navegador no formato de arquivo ‘.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>
No final do PHP, você deve enviar o arquivo de mídia ao serviço AWS para processamento, portanto, inclua o ambiente AWS da seguinte forma.
<?php
require 'vendor/autoload.php';
use AwsS3S3Client;
use AwsTranscribeServiceTranscribeServiceClient;
// submission code
Depois disso, carregue o arquivo de mídia no balde S3. E pegue o URL S3 da mídia carregada.
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();
}
}
Certifique-se de substituir os marcadores de posição pelos valores reais. Em seguida, precisamos passar a URL da mídia carregada para o serviço Amazon Transcribe. Ele também requer um ID de trabalho exclusivo, que criarei usando o 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
No código acima, instanciamos o Amazon Transcribe Client e iniciamos o trabalho de transcrição. O processo de tradução pode demorar alguns minutos. Eu lidei com isso usando o método while loop e sleep(). Estou verificando se o processo é concluído a cada 5 segundos e interrompendo o ciclo ao terminar o processo.
Você pode ver esse processo de transcrição no painel da AWS em Amazon Transcribe-> Transcription jobs, conforme mostrado na captura de tela abaixo.
Por fim, baixe o arquivo usando o código abaixo.
$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 envia o arquivo de texto gerado ao navegador para que o usuário possa baixá-lo.
Código de amostra final
O código escrito acima está em blocos. Se você quiser um código inteiro junto, é o seguinte.
<?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 você entenda como converter fala em texto usando o Amazon Transcribe em PHP. Por favor, compartilhe seus pensamentos e sugestões na seção de comentários abaixo.
Artigos relacionados
- Text-To-Speech usando Amazon Polly em PHP
- Carregar arquivos para o Amazon S3 usando AWS PHP SDK
- Como fazer upload de arquivo para S3 usando o sistema de arquivos Laravel