Статьи

Перевод и преобразование текста в речь с помощью Microsoft Translator

Текст в речь — это популярный метод, используемый многими веб-сайтами для интерактивного предоставления контента. Поколение искусственного человеческого голоса известно как синтез речи. Несмотря на то, что он очень популярен, существует очень мало услуг по синтезу речи, особенно когда вы ищете их бесплатно. Microsoft Translator — одна из служб, которую мы можем использовать для получения речевых служб с ограниченными функциями. В этом уроке мы рассмотрим, как мы можем использовать Microsoft Translator API для перевода контента, а затем создавать аудиофайлы, используя этот контент.

Вы можете скачать весь исходный код этого проекта на Github .

Создание приложения Windows Azure Marketplace

Сначала нам нужно создать приложение в Windows Azure Data Marketplace, чтобы подписаться на Microsoft Translator API. Давайте начнем с процесса создания приложения.

Предварительные условия — учетная запись электронной почты Microsoft

Шаг 1. Войдите в свою учетную запись Azure.

Используйте учетную запись электронной почты и войдите в Azure Marketplace .

Шаг 2 — Регистрация приложения

Теперь нам нужно создать приложение для использования переводческого и речевого сервиса. Это похоже на приложения, которые мы создаем для популярных сайтов социальных сетей, таких как Facebook, LinkedIn или Twitter. Нажмите на ссылку Зарегистрировать приложение, чтобы создать новое приложение. Вы получите экран, похожий на следующий.

Заполните все детали данной заявки. Вы можете определить свой собственный идентификатор клиента, который будет использоваться для приложения. Секрет клиента будет автоматически сгенерирован для вас. Оставьте его без изменений и заполните необходимые данные.

Нажмите на кнопку Создать , и вы получите список созданных приложений, как показано на следующем экране.

Запишите идентификатор клиента и секрет клиента, которые будут использоваться для приложения.

Шаг 3 — Подписаться на услугу перевода

Далее мы должны подписаться на Microsoft Translator, чтобы использовать API. Перейдите к Microft Translator и подпишитесь на один из пакетов. Первые 2 000 000 символов бесплатны, и очевидно, что мы должны использовать его для тестирования.

На следующем снимке экрана показан экран подписки. Подпишитесь на бесплатный пакет.

Теперь мы выполнили предварительные условия для использования Microsoft Translator API. Приступим к разработке сервиса преобразования текста в речь.

Инициализация настроек API перевода

Давайте начнем с инициализации необходимых настроек для использования Translator API. Создайте файл с именем translation_api_initializer.php со следующим кодом.

  <?php class TranslationApiInitializer { private $clientID; private $clientSecret; private $authUrl; private $grantType; private $scopeUrl; public function __construct() { $this->clientID = "Client ID"; $this->clientSecret = "Client Secret"; //OAuth Url. $this->authUrl = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/"; //Application Scope Url $this->scopeUrl = "http://api.microsofttranslator.com"; //Application grant type $this->grantType = "client_credentials"; } } ?> 

Здесь мы настроили необходимые параметры для использования сервиса перевода. Вы должны использовать идентификатор клиента и секрет клиента, сгенерированные в процессе регистрации приложения. Другие параметры содержат URL-адрес аутентификации и тип предоставления. Мы можем оставить его как есть для каждого приложения, если только оно не было официально изменено Microsoft.

Генерация токенов приложения

Следующая задача — сгенерировать токены для доступа к сервису «Переводчик». Жетоны имеют ограниченное время жизни, и мы должны генерировать их регулярно. Давайте посмотрим на реализацию функции генерации токена.

  /* * Get the access token. * * @param string $grantType Grant type. * @param string $scopeUrl Application Scope URL. * @param string $clientID Application client ID. * @param string $clientSecret Application client ID. * @param string $authUrl Oauth Url. * * @return string. */ function getTokens($grantType, $scopeUrl, $clientID, $clientSecret, $authUrl) { try { //Initialize the Curl Session. $ch = curl_init(); //Create the request Array. $paramArr = array( 'grant_type' => $grantType, 'scope' => $scopeUrl, 'client_id' => $clientID, 'client_secret' => $clientSecret ); //Create an Http Query.// $paramArr = http_build_query($paramArr); //Set the Curl URL. curl_setopt($ch, CURLOPT_URL, $authUrl); //Set HTTP POST Request. curl_setopt($ch, CURLOPT_POST, TRUE); //Set data to POST in HTTP "POST" Operation. curl_setopt($ch, CURLOPT_POSTFIELDS, $paramArr); //CURLOPT_RETURNTRANSFER- TRUE to return the transfer as a string of the return value of curl_exec(). curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //CURLOPT_SSL_VERIFYPEER- Set FALSE to stop cURL from verifying the peer's certificate. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //Execute the cURL session. $strResponse = curl_exec($ch); //Get the Error Code returned by Curl. $curlErrno = curl_errno($ch); if ($curlErrno) { $curlError = curl_error($ch); throw new Exception($curlError); } //Close the Curl Session. curl_close($ch); //Decode the returned JSON string. $objResponse = json_decode($strResponse); if ($objResponse->error) { throw new Exception($objResponse->error_description); } return $objResponse->access_token; } catch (Exception $e) { echo "Exception-" . $e->getMessage(); } } 

Здесь мы используем функцию getTokens , которая принимает все настройки в качестве параметров. Внутри функции мы делаем запрос curl для определенного URL аутентификации, передавая остальные параметры. При успешном выполнении мы можем получить доступ к токену, используя
$objResponse->access_token .

Реализация многоразового запроса Curl

Как только токен доступа получен, мы можем получить доступ к функциям перевода, авторизовав запрос токеном доступа. Обычно мы используем curl для отправки запросов к API, поэтому давайте реализуем функцию многократного использования для нашего запроса curl, как показано в следующем коде.

  /* * Create and execute the HTTP CURL request. * * @param string $url HTTP Url. * @param string $authHeader Authorization Header string. * @param string $postData Data to post. * * @return string. * */ function curlRequest($url, $authHeader, $postData=''){ //Initialize the Curl Session. $ch = curl_init(); //Set the Curl url. curl_setopt($ch, CURLOPT_URL, $url); //Set the HTTP HEADER Fields. curl_setopt($ch, CURLOPT_HTTPHEADER, array($authHeader, "Content-Type: text/xml")); //CURLOPT_RETURNTRANSFER- TRUE to return the transfer as a string of the return value of curl_exec(). curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //CURLOPT_SSL_VERIFYPEER- Set FALSE to stop cURL from verifying the peer's certificate. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, False); if ($postData) { //Set HTTP POST Request. curl_setopt($ch, CURLOPT_POST, TRUE); //Set data to POST in HTTP "POST" Operation. curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); } //Execute the cURL session. $curlResponse = curl_exec($ch); //Get the Error Code returned by Curl. $curlErrno = curl_errno($ch); if ($curlErrno) { $curlError = curl_error($ch); throw new Exception($curlError); } //Close a cURL session. curl_close($ch); return $curlResponse; } 

Эта функция принимает URL-адрес запроса, заголовок запроса и данные публикации в качестве параметров и возвращает ответ или ошибку скручивания. Теперь все необходимые функции для доступа к услуге переводчика готовы.

Перевод контента

Microsoft Translator API предоставляет широкий спектр методов для функций, связанных с переводом. В этом уроке мы будем использовать методы Translate и Speak . Вы можете посмотреть полный набор методов API на http://msdn.microsoft.com/en-us/library/ff512419.aspx .
Давайте начнем с реализации функции перевода.

  /* * Get the translated text * * @param string $text Text content for translation * @param string $from_lang Language of the text * @param string $to_lang Translation language * @return array Result set */ public function textTranslate($text, $from_lang, $to_lang) { try { //Get the Access token. $accessToken = $this->getTokens($this->grantType, $this->scopeUrl, $this->clientID, $this->clientSecret, $this->authUrl); //Create the authorization Header string. $authHeader = "Authorization: Bearer " . $accessToken; //Input String. $inputStr = urlencode($text); $from = $from_lang; $to = $to_lang; //HTTP Detect Method URL. $detectMethodUrl = "http://api.microsofttranslator.com/V2/Http.svc/Translate?text=" . urlencode($inputStr) . "&from=" . $from . "&to=" . $to."&contentType=text/plain"; //Call the curlRequest. $strResponse = $this->curlRequest($detectMethodUrl, $authHeader); //Interprets a string of XML into an object. $xmlObj = simplexml_load_string($strResponse); foreach ((array) $xmlObj[0] as $val) { $translated_str = $val; } return array("status" => "success", "msg" => $translated_str); } catch (Exception $e) { return array("status" => "error", "msg" => $e->getMessage()); } } 

Для перевода требуется перевод исходного языка, языка назначения и текста. Поэтому мы использовали их в качестве параметров функции textTranslate . Затем мы используем ранее созданную функцию getToken чтобы извлечь токен и назначить его заголовку запроса, используя Authorization: Bearer .

Затем мы устанавливаем исходный и целевой языки, используя $from_lang и $to_lang . Также мы должны кодировать текстовое содержимое с помощью PHP-функции urlencode .

Теперь пришло время начать процесс перевода. Translator API предоставляет метод Translate, и мы можем получить к нему доступ, используя URL-адрес по адресу http://api.microsofttranslator.com/V2/Http.svc/Translate

Этот метод принимает в качестве обязательных параметров appId, text, language и type content. Поскольку мы используем заголовок авторизации, указывать appId не обязательно . Поэтому мы присваиваем все необходимые параметры URL-адресу Translate API с $detectMethodUrl переменной $detectMethodUrl .

Наконец, мы инициализируем запрос curl, передавая URL-адрес API перевода и заголовок авторизации. При успешном выполнении мы получим переведенные данные в формате XML. Поэтому мы используем функцию simplexml_load_string для загрузки строки XML и фильтрации переведенного текста.
Теперь мы можем переводить текст между любыми поддерживаемыми языками.

Генерация речевых файлов

Последняя задача этого урока состоит в том, чтобы создать речь в mp3-файле с использованием переведенного текста. Мы будем использовать аналогичную технику для этого. Создайте функцию с именем textToSpeech со следующим кодом.

  /** * Returns a stream of a wave-file speaking the passed-in text in the desired language. * @param string $text text of language to break * @param string $to_lang language of the text * @return - */ public function textToSpeech($text, $to_lang) { try { //Get the Access token. $accessToken = $this->getTokens($this->grantType, $this->scopeUrl, $this->clientID, $this->clientSecret, $this->authUrl); //Create the authorization Header string. $authHeader = "Authorization: Bearer " . $accessToken; //Set the params. $inputStr = urlencode($text); $language = $to_lang; $params = "text=$inputStr&language=$language&format=audio/mp3"; //HTTP Speak method URL. $url = "http://api.microsofttranslator.com/V2/Http.svc/Speak?$params"; //Set the Header Content Type. header('Content-Type: audio/mp3'); header('Content-Disposition: attachment; filename=' . uniqid('SPC_') . '.mp3'); //Call the curlRequest. $strResponse = $this->curlRequest($url, $authHeader); echo $strResponse; } catch (Exception $e) { echo "Exception: " . $e->getMessage() . PHP_EOL; } } 

Эта функция по своей природе похожа на функцию перевода. Здесь мы используем URL-адрес метода Speak по адресу
http://api.microsofttranslator.com/V2/Http.svc/Speak вместо URL перевода. Мы должны использовать текст, язык и формат в качестве необходимых параметров. Поскольку мы используем переведенный текст для генерации речи, языковой параметр должен быть равен $to_lang используемому в функции textTranslate .

Затем мы должны использовать необходимые заголовки для автоматической загрузки файла речи. Здесь мы использовали audio/mp3 в качестве типа контента, а функция uniqid используется для генерации уникального имени файла. Теперь у нас есть готовые к использованию функции перевода и речи.

Реализация интерфейса веб-интерфейса

До сих пор мы реализовали функции перевода и речи в серверной части приложения. Теперь нам нужно создать упрощенный интерфейс внешнего интерфейса для доступа к сервису генерации речевых файлов. Давайте создадим файл с именем index.php с базовой формой HTML.

  <?php $bing_language_codes = array('da' => 'Danish', 'de' =>'German','en'=> 'English','fi'=> 'Finnish', 'fr'=>'French','nl'=>'Dutch','ja'=> 'Japanese','pl'=> 'Polish', 'es'=> 'Spanish','ru'=> 'Russian',); ?> <form action='' method='POST' > <table> <tr><td>Select From Language</td> <td><select name='from_lang' > <?php foreach($bing_language_codes as $code=>$lang){ ?> <option value='<?php echo $code; ?>'><?php echo $lang; ?></option> <?php } ?> </select> </td> </tr> <tr><td>Select To Language</td> <td><select name='to_lang' > <?php foreach($bing_language_codes as $code=>$lang){ ?> <option value='<?php echo $code; ?>'><?php echo $lang; ?></option> <?php } ?> </select> </td> </tr> <tr><td>Text</td> <td><textarea cols='50' name='text' ></textarea> </td> </tr> <tr><td></td> <td><input type='submit' value='Submit' /> </td> </tr> </table> </form> 

Эта форма позволяет пользователям выбирать предпочтительный исходный и целевой языки и вводить контент для преобразования в речь. Я использовал несколько поддерживаемых языков в массиве с именем $bing_language_codes . Теперь мы можем перейти к процессу обработки отправки формы, чтобы сгенерировать речевой файл, как показано ниже.

  <?php include_once "translation_api_initializer.php"; $bing_language_codes = array('da' => 'Danish', 'de' => 'German','en'=> 'English','fi'=> 'Finnish', 'fr'=> 'French', 'nl'=> 'Dutch','ja'=>'Japanese', 'pl'=> 'Polish','es'=> 'Spanish','ru'=> 'Russian'); if($_POST){ $bing = new TranslationApiInitializer(); $from_lang = isset($_POST['from_lang']) ? $_POST['from_lang'] : 'en'; $to_lang = isset($_POST['to_lang']) ? $_POST['to_lang'] : 'fr'; $text = isset($_POST['text']) ? $_POST['text'] : ''; $result = $bing->textTranslate($text, $from_lang, $to_lang); $bing->textToSpeech($result['msg'],$to_lang); } ?> 

Мы включаем файл TranslationApiInitializer созданный ранее в процессе, и выполняем функцию перевода и речи соответственно для создания аудиофайла. Как только код будет завершен, вы сможете создавать аудио файлы, используя этот сервис.

Вы можете посмотреть живую демонстрацию на http://www.innovativephp.com/demo/spc_text_to_speech

Заворачивать

В этом руководстве мы реализовали перевод и генерацию речи с помощью Microsoft Translator API. Хотя он прост в использовании и в некоторой степени бесплатен, есть и ограничения. Речевой сервис предоставляется только для ограниченного числа символов, примерно около 2000. Поэтому невозможно использовать этот сервис для большего блока текста. Я рекомендую вам использовать Acapela для крупномасштабных сервисов генерации речи.

Надеюсь, вам понравился урок и с нетерпением ждем ваших комментариев и предложений.