Создать .WAV из PCM (AWS Polly) - PullRequest
       56

Создать .WAV из PCM (AWS Polly)

1 голос
/ 27 октября 2019

Я пытался найти ответы в Интернете, но не смог найти ничего, что помогло бы мне ...

Я пытаюсь преобразовать поток PCM в файл WAV с помощью PHP (7.2) и сохранить его. на сервере.

В частности, я генерирую речь через Amazon Polly с кодом ниже:

try {
    $result = $client->synthesizeSpeech([
        'Text' => 'Dies ist ein Test.',
        'OutputFormat' => 'pcm',
        'SampleRate' => '8000',
        'VoiceId' => 'Hans'
    ]);

    $resultData = $result->get('AudioStream')->getContents();
}

Мне нужен файл WAV для использования с другим кодом позже.

Большое спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 27 октября 2019

Вам просто нужно добавить заголовок и добавить данные PCM. http://soundfile.sapp.org/doc/WaveFormat/

Я не смог найти для этого ни одной библиотеки PHP, поэтому я написал для этого простую PHP-программу:

<?php

$pcm = file_get_contents('polly.raw');

//$pcm = $result->get('AudioStream')->getContents();

//Output file
$fp = fopen('file.wav', 'wb');

$pcm_size = strlen($pcm);

$size = 36 + $pcm_size;

$chunk_size = 16;

$audio_format = 1;

$channels = 1; //mono

/**From the AWS Polly documentation: Valid values for pcm are "8000" and "16000" The default value is "16000".
 * https://docs.aws.amazon.com/polly/latest/dg/API_SynthesizeSpeech.html#polly-SynthesizeSpeech-request-OutputFormat
**/
$sample_rate = 16000; //Hz

$bits_per_sample = 16;

$block_align = $channels * $bits_per_sample / 8;

$byte_rate = $sample_rate * $channels * $bits_per_sample / 8;

/**
* http://soundfile.sapp.org/doc/WaveFormat/
* https://github.com/jwhu1024/pcm-to-wav/blob/master/inc/wave.h
* https://jun711.github.io/aws/convert-aws-polly-synthesized-speech-from-pcm-to-wav-format/
**/

//RIFF chunk descriptor
fwrite($fp, 'RIFF');

fwrite($fp,pack('I', $size));
fwrite($fp, 'WAVE');

//fmt sub-chunk
fwrite($fp, 'fmt ');

fwrite($fp,pack('I', $chunk_size));
fwrite($fp,pack('v', $audio_format));
fwrite($fp,pack('v', $channels));
fwrite($fp,pack('I', $sample_rate));
fwrite($fp,pack('I', $byte_rate));
fwrite($fp,pack('v', $block_align));
fwrite($fp,pack('v', $bits_per_sample));

//data sub-chunk

fwrite($fp, 'data');
fwrite($fp,pack('i', $pcm_size));
fwrite($fp, $pcm);

fclose($fp);

Вы также можете использовать FFmpeg для достижения этой цели,но мое решение написано исключительно на PHP.

Я надеюсь, что смогу вам помочь!

0 голосов
/ 28 октября 2019

Функции расширения PHP и / или классы, которые можно вызывать из сценариев PHP

https://www.php -cpp.com / Документация / Функции

Файл Simple Native Waveпример писателя:

https://www3.nd.edu/~dthain/courses/cse20211/fall2013/wavfile/

...