Amazon Polly AudioStream 始终为空
Amazon Polly AudioStream is always empty
我正在尝试让 Polly 为我读一些东西,使用 PHP。
我创建了一个新项目,安装了 Amazon composer require aws/aws-sdk-php
,然后使用 SDK documentation example 中的代码创建了一个文件,并修改了一些小的东西,例如将凭据从默认值更改为值,var_dump 到 var_export 最后将流的内容保存到文件
<?php
require 'vendor/autoload.php';
use Aws\Exception\AwsException;
use Aws\Polly\PollyClient;
use Aws\Credentials\Credentials;
// Create a PollyClient
$client = new Aws\Polly\PollyClient([
//'profile' => 'default',
'credentials' => new Credentials('XXXXXXXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'),
'version' => '2016-06-10',
'region' => 'us-east-2'
]);
try {
$result = $client->synthesizeSpeech([
'Text' => 'Hello',
'OutputFormat' => 'json', //json|mp3|ogg_vorbis|pcm
'VoiceId' => 'Joanna',
]);
var_export($result);
$data = $result->get('AudioStream')->getContents();
echo "\n\n";
var_export($data);
$file = fopen('test.txt','w+');
fwrite($file,$data);
fclose($file);
} catch (AwsException $e) {
echo $e->getMessage() . "\n";
}
我得到的结果如下
Aws\Result::__set_state(array(
'data' => array (
'AudioStream' => GuzzleHttp\Psr7\Stream::__set_state(array(
'stream' => NULL,
'size' => NULL,
'seekable' => true,
'readable' => true,
'writable' => true,
'uri' => 'php://temp',
'customMetadata' => array (),
)),
'ContentType' => 'application/x-json-stream',
'RequestCharacters' => '5',
'@metadata' => array (
'statusCode' => 200,
'effectiveUri' => 'https://polly.us-east-2.amazonaws.com/v1/speech',
'headers' => array (
'x-amzn-requestid' => 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
'x-amzn-requestcharacters' => '5',
'content-type' => 'application/x-json-stream',
'transfer-encoding' => 'chunked',
'date' => 'Sat, 18 Sep 2021 05:11:20 GMT',
),
'transferStats' => array (
'http' => array (
0 => array (),
),
),
),
),
'monitoringEvents' => array (),
))
''
如您所见,AudioStream 的大小为空(其中没有任何内容),而且创建的文件也是空的,因为流中没有任何内容可供读取。
如果我将凭据更改为无效字符串,我会收到错误,并且使用有效凭据时,状态代码为 200,这让我相信我的请求已成功。
我将 voiceId 更改为任何其他有效或无效的 ID,甚至更改了区域,其他有效值获得状态 200,无效值获得错误消息,但我仍然没有从 polly 中得到任何东西,它不想说话!
注意:当我运行$arr_voices = $polly->describeVoices();
时,我可以正确读取语音列表。
注意: 我在 .NET SDK 上也遇到了同样的问题,这让我觉得要么我的请求有问题,要么 [=42] 中缺少一些错误消息=].
问题
我做错了什么?
你没有做错任何事,但如果你正在寻找语音标记,它只会输出 JSON。尝试切换为 MP3 等音频输出格式,如下所示。
$result = $client->synthesizeSpeech([
'Text' => 'Hello',
'OutputFormat' => 'mp3', //json|mp3|ogg_vorbis|pcm
'VoiceId' => 'Joanna',
]);
如果您要查找语音标记 - 将要合成的语音元数据 - 您需要指定 SpeechMarkTypes,如此处所示 https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-polly-2016-06-10.html#synthesizespeech
我正在尝试让 Polly 为我读一些东西,使用 PHP。
我创建了一个新项目,安装了 Amazon composer require aws/aws-sdk-php
,然后使用 SDK documentation example 中的代码创建了一个文件,并修改了一些小的东西,例如将凭据从默认值更改为值,var_dump 到 var_export 最后将流的内容保存到文件
<?php
require 'vendor/autoload.php';
use Aws\Exception\AwsException;
use Aws\Polly\PollyClient;
use Aws\Credentials\Credentials;
// Create a PollyClient
$client = new Aws\Polly\PollyClient([
//'profile' => 'default',
'credentials' => new Credentials('XXXXXXXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'),
'version' => '2016-06-10',
'region' => 'us-east-2'
]);
try {
$result = $client->synthesizeSpeech([
'Text' => 'Hello',
'OutputFormat' => 'json', //json|mp3|ogg_vorbis|pcm
'VoiceId' => 'Joanna',
]);
var_export($result);
$data = $result->get('AudioStream')->getContents();
echo "\n\n";
var_export($data);
$file = fopen('test.txt','w+');
fwrite($file,$data);
fclose($file);
} catch (AwsException $e) {
echo $e->getMessage() . "\n";
}
我得到的结果如下
Aws\Result::__set_state(array(
'data' => array (
'AudioStream' => GuzzleHttp\Psr7\Stream::__set_state(array(
'stream' => NULL,
'size' => NULL,
'seekable' => true,
'readable' => true,
'writable' => true,
'uri' => 'php://temp',
'customMetadata' => array (),
)),
'ContentType' => 'application/x-json-stream',
'RequestCharacters' => '5',
'@metadata' => array (
'statusCode' => 200,
'effectiveUri' => 'https://polly.us-east-2.amazonaws.com/v1/speech',
'headers' => array (
'x-amzn-requestid' => 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
'x-amzn-requestcharacters' => '5',
'content-type' => 'application/x-json-stream',
'transfer-encoding' => 'chunked',
'date' => 'Sat, 18 Sep 2021 05:11:20 GMT',
),
'transferStats' => array (
'http' => array (
0 => array (),
),
),
),
),
'monitoringEvents' => array (),
))
''
如您所见,AudioStream 的大小为空(其中没有任何内容),而且创建的文件也是空的,因为流中没有任何内容可供读取。
如果我将凭据更改为无效字符串,我会收到错误,并且使用有效凭据时,状态代码为 200,这让我相信我的请求已成功。 我将 voiceId 更改为任何其他有效或无效的 ID,甚至更改了区域,其他有效值获得状态 200,无效值获得错误消息,但我仍然没有从 polly 中得到任何东西,它不想说话!
注意:当我运行$arr_voices = $polly->describeVoices();
时,我可以正确读取语音列表。
注意: 我在 .NET SDK 上也遇到了同样的问题,这让我觉得要么我的请求有问题,要么 [=42] 中缺少一些错误消息=].
问题
我做错了什么?
你没有做错任何事,但如果你正在寻找语音标记,它只会输出 JSON。尝试切换为 MP3 等音频输出格式,如下所示。
$result = $client->synthesizeSpeech([
'Text' => 'Hello',
'OutputFormat' => 'mp3', //json|mp3|ogg_vorbis|pcm
'VoiceId' => 'Joanna',
]);
如果您要查找语音标记 - 将要合成的语音元数据 - 您需要指定 SpeechMarkTypes,如此处所示 https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-polly-2016-06-10.html#synthesizespeech