Распознование и синтез речи (Speech Api)

30.10.2016

Столкнулся с тем, что сервис гугла по распознаванию речи загнулся, а точнее переделался в облачный и, похоже, стлал платным.
Поэтому решил воспользоваться сервисом от Яндекса.

Еще по теме: raspberry pi распознавание речи


Сначала нужно получить ключ для API.
Теперь можно использовать один ключ для целого ряда сервизов

Первый пример: Генерация/синтез речи

 
  // https://tech.yandex.ru/speechkit/cloud/doc/dg/concepts/speechkit-dg-tts-docpage/
  $text = 'Какой-то текст';
  $qs = http_build_query(array(
    'format' => 'mp3',
    'lang' => 'ru-RU',
    'speaker' => 'jane',
    'key' => 'cefd81f7-b266-XX-b38b-XXX',
    'emotion' => 'good', 
    'text' => $text
  ));
  
  $ctx = stream_context_create(array(
    'http'=>array('method'=>'GET','header'=>'Referer: \r\n')
  ));
  
  $soundfile = file_get_contents('https://tts.voicetech.yandex.net/generate?'.$qs, false, $ctx); // запрос на генерацию mp3 файла
  
  file_put_contents('out.mp3', $soundfile);

  echo('Done');

Второй пример: Распознавание речи

 
<?php

// https://tech.yandex.ru/speechkit/cloud/doc/dg/concepts/speechkit-dg-recogn-quick-start-docpage/

/*
if (!function_exists('curl_file_create')) {
    function curl_file_create($filename, $mimetype = '', $postname = '') {
        return "@$filename;filename="
            . ($postname ?: basename($filename))
            . ($mimetype ? ";type=$mimetype" : '');
    }
}
*/
function generateRandomSelection($min, $max, $count)
{
    $result=array();
    if($min>$max) return $result;
    $count=min(max($count,0),$max-$min+1);
    while(count($result)<$count) {
        $value=rand($min,$max-count($result));
        foreach($result as $used) if($used<=$value) $value++; else break;
        $result[]=dechex($value);
        sort($result);
    }
    shuffle($result);
    return $result;
}
function recognize($file, $key) {
    $uuid=generateRandomSelection(0,30,64);
    $uuid=implode($uuid);    $uuid=substr($uuid,1,32);
    $curl = curl_init();
    $url = 'https://asr.yandex.net/asr_xml?'.http_build_query(array(
        'key'=>$key,
        'uuid' => $uuid,
        'topic' => 'queries',
        'lang'=>'ru-RU'
    ));
    curl_setopt($curl, CURLOPT_URL, $url);
    $data=file_get_contents(realpath($file));
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

   // https://tech.yandex.ru/speechkit/cloud/doc/dg/concepts/speechkit-dg-recogn-params-docpage/
    curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: audio/x-mpeg-3'));
    curl_setopt($curl, CURLOPT_VERBOSE, true);
    $response = curl_exec($curl);
    $err = curl_errno($curl);
    curl_close($curl);
    if ($err)
        throw new exception("curl err $err");
    echo '$response: '.$response.';';
}

/*
print_r($argv);
$filename = $argv[1];
$key = $argv[2];
*/
$filename = 'out.mp3';
$key = ' 'key' => 'cefd81f7-b266-XX-b38b-XXX',

recognize($filename, $key);
  
  echo('<br />Done');

Еще есть "Выделение смысловых объектов", но его я оставил на другой раз :-)


Яндекс.Метрика