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