ブログ のお勧め記事

PHP(WordPress)で無料の中国語TTS(Microsoft Translator)を実装する(第1回)

2016/10/11

WordPressに中国語音声(Text To Speech)出力を実装する方法についての解説です。
初回はまず、利用登録を行って音声出力するPHPプログラムを作成するところまで説明します。

このブログにはあちこちに、中国語の音声を出力するアイコンがあります。(参考記事:中国語で動物の鳴き声は?

WordPressでブログを運営している人なら、簡単な手順で自分のブログに導入することができます。

今日はまず、音声が出力できるところまでサクっと作ってしまいましょう。

Microsoft Azure Marketplace の Translationサービスを利用

この音声合成機能は、マイクロソフト社のAPIを使用しています。

まずは、この機能を使用する登録を行います。

Microsoftアカウントを作成する

Microsoftアカウントが必要です。まだ持っていない人はあらかじめ作成します。

Microsoft Azure Marketplaceにサインイン

https://datamarket.azure.com/home/ にアクセスし、右上の「サインイン」からサインインします。

Microsoft Azure Marketplaceログイン画面

サインインします。

Microsoftサインイン

 Microsoft Translatorに登録

上のメニューから「データ」をクリックします。

全画面キャプチャ 20150317 230202

 

左のリストから「開発者向け」をクリックします。

全画面キャプチャ 20150317 230805

 

少し下にスクロールして「Microsoft Translator」をクリックします。

Chrome Legacy Window 20150317 221307_compressed

 

右上の2,000,000文字/月の横にある「サインアップ」をクリックします。
ほとんどの場合、この無料の範囲で十分まかなえるはずです。

Chrome Legacy Window 20150317 221312_compressed

 

 

右下のチェックボックスにチェックを入れ、「サインアップ」をクリックします。Chrome Legacy Window 20150317 221316_compressed

登録が完了しました。

開発者登録をする

続いてWordPressから利用する登録を行います。
上のメニューから「マイアカウント」をクリックします。

Chrome Legacy Window 20150317 221329_compressed

 

左から「開発者」をクリックします。

Chrome Legacy Window 20150317 221338_compressed

 

下の「登録」ボタンをクリックします。

Chrome Legacy Window 20150317 221343_compressed

 

クライアントID、名前、リダイレクトURIを入力します。

Chrome Legacy Window 20150317 221524_compressed

クライアントIDは数字・英字・ハイフン・アンダースコアが使えます。公開されるものではないので、適当に決めても大丈夫です。
名前も自分が分かればOKです。
リダイレクトURIは、「http://example.com」(意味のないアドレス)と入力します。
そして「クライアントID」と「顧客の秘密」をどこかにコピー貼り付けしてメモしておきます。

登録されました。

Chrome Legacy Window 20150317 221531_compressed

PHPコードの作成

続いてphpのコードを作成していきます。

PHPのソースコードを作成

下のコードをまるごとエディタに貼り付けて使えます。
それから、コードの下の方にあるclientIDとclientSecretを、先ほどメモした2つの文字列で置き換えます。

class AccessTokenAuthentication {
    /*
     * 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();
        }
    }
}

/*
 * Class:HTTPTranslator
 *
 * Processing the translator request.
 */
Class HTTPTranslator {
    /*
     * 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;
    }

    /*
     * Create Request XML Format.
     *
     * @param string $languageCode  Language code
     *
     * @return string.
     */
    function createReqXML($languageCode) {
        //Create the Request XML.
        $requestXml = '<ArrayOfstring xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">';
        if($languageCode) {
            $requestXml .= "<string>$languageCode</string>";
        } else {
            throw new Exception('Language Code is empty.');
        }
        $requestXml .= '</ArrayOfstring>';
        return $requestXml;
    }
}

try {
    //Client ID of the application.
    $clientID = "/*Client ID*/";
    //Client Secret key of the application.
    $clientSecret = "/*Client Secret*/";
    //OAuth Url.
    $authUrl      = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/";
    //Application Scope Url
    $scopeUrl     = "http://api.microsofttranslator.com";
    //Application grant type
    $grantType    = "client_credentials";

    //Create the AccessTokenAuthentication object.
    $authObj      = new AccessTokenAuthentication();
    //Get the Access token.
    $accessToken  = $authObj->getTokens($grantType, $scopeUrl, $clientID, $clientSecret, $authUrl);
    //Create the authorization Header string.
    $authHeader = "Authorization: Bearer ". $accessToken;

    //Create the Translator Object.
    $translatorObj = new HTTPTranslator();

    //Input String.
    $inputStr = urlencode($_GET['source']);
    $language = 'zh-tw';
    if ($_GET['lang'] == '1') {
        $language = 'en';
    } elseif ($_GET['lang'] == '2') {
        $language = 'ja';
    } elseif ($_GET['lang'] == '3') {
        $language = 'zh-hk';
    } elseif ($_GET['lang'] == '4') {
        $language = 'zh-chs';
    }
    if ($_GET['type'] == 'm') {
        $fmt = 'mp3';
    } else {
        $fmt = 'wav';
    }
    $params = "text=$inputStr&language=$language&format=audio/$fmt"; 

    //HTTP Speak method URL.
    $url = "http://api.microsofttranslator.com/V2/Http.svc/Speak?$params";
    //Set the Header Content Type.
    header('Content-Type: audio/' . $fmt);

    //Create the Translator Object.
    $translatorObj = new HTTPTranslator();

    //Call the curlRequest.
    $strResponse = $translatorObj->curlRequest($url, $authHeader);
    echo $strResponse;
} catch (Exception $e) {
    echo "Exception: " . $e->getMessage() . PHP_EOL;
}

出典:https://msdn.microsoft.com/ja-jp/library/ff512420.aspx

サーバーにアップロード

phpファイルを作ったら、任意のディレクトリにアップロードします。

今日の作業はここまでです。

動作確認

動作確認をしてみましょう。

http://(自分のサーバーのURL)/(作成したPHPファイルのパス)?source=你好&lang=0&type=m

上のアドレスを書きなおして、ブラウザから実行してみてください。

ブラウザによって表示は違いますが、上のようなプレイヤーが表示されて、音声が再生できれば完成です。

パラメータは以下の通りです。

source=発音したい文字列を指定

lang=(言語を指定)

  • (指定なし):中国語(台湾)
  • 1:英語
  • 2:日本語
  • 3:広東語
  • 4:中国語(中国)

type=(音声ファイルの形式)

  • m:mp3
  • (指定なし):wav

次回はこのモジュールをブログに組み込むところを解説します。

初心者にもおすすめのWordpress教科書

これからWordpressを勉強したいと思う方におススメの一冊です。

初心者でも、しっかり読み込んでいけば必ずできるようになりますよ!

WordPressレッスンブック HTML5&CSS準拠
WordPressレッスンブック HTML5&CSS準拠エビスコム

ソシム 2014-06-18

Amazonで詳しく見る by G-Tools

-ブログ

この記事を書いた人

C-STUDY管理人。フリーランスのプログラマー+中国語通訳翻訳+ブロガーをやってます。中国語は独学でHSK8級+中検準1級。中国・中華圏を中心に東アジア~東南アジアが活動範囲です。もっと詳しく

共有する

これは役に立つ!面白い!と思ったら共有してくださるとうれしいです。シェアしていただけると、がぜんやる気がでます^^

C-STUDYの定期読者になりませんか?

ブログの更新情報をメールでお届けします。購読は無料、解除も簡単です。 読者数:245人

関連記事