ThinkPHP百度语音合成方法

9148阅读
0评论
0点赞

之前公司做了一个支付语音提醒功能,由于每次支付的金额不确定,于是不能使用固定的音源来作为提示音。于是想到了百度语言合成接口,通过开发调试,实现不同支付金额提示音。 代码如下 api.php

//百度语音合成
public function bdtsn(){
    $appid = '86***17';//填写自己的appid
    $apikey = 'BRIviMY56F3W0yknlq81g***';//填写自己的
    $secretkey = '6d49f9ecc9588913566eb6bb0185d***';//填写自己的

    $tex = I('tex','','trim');//要合成音源的文字(比如: 成功收款0.01元 )

    if(!$tex){
        $this->error('字符非法');
    }

    $tex = urlencode($tex);

    //语言文件地址
    $file = './Uploads/Mp3/'.md5($tex).'.mp3'; //本地缓存音源的路径 避免同样提示音重复去百度生成
    if(!file_exists($file)){

        //缓存名称
        $name = 'bdtsn_'.$appid;
        if(!$json = S($name)){
            //获取百度语音token信息 并缓存
            $jsonStr = http_post('https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id='.$apikey.'&client_secret='.$secretkey);
            $json = json_decode($jsonStr,true);
            S($name,$json,$json['expires_in']);
        }

        if(!$json){
            $this->error('token获取失败');
        }

        //获取语语音数据 并生成 本地mp3文件
        $url = 'http://tsn.baidu.com/text2audio?tex='.$tex.'&lan=zh&cuid='.$appid.'&ctp=1&tok='.$json['access_token'];
        $data = file_get_contents($url);

        if(!$json){
            $this->error('音频数据获取失败');
        }

        file_put_contents($file,$data);

    }

    if($file){
        $this->success('success',$file);//返回本地音源路径 
    }

}
  其中用到了自定义函数http_host() 代码如下  function.php
/**
 * POST 请求
 * @param string $url
 * @param array $param
 * @param boolean $post_file 是否文件上传
 * @return string content
 */
function http_post($url,$param,$post_file=false){
    $oCurl = curl_init();
    if(stripos($url,"https://")!==FALSE){
        curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
    }
    if (is_string($param) || $post_file) {
        $strPOST = $param;
    } else {
        $aPOST = array();
        foreach($param as $key=>$val){
            $aPOST[] = $key."=".urlencode($val);
        }
        $strPOST =  join("&", $aPOST);
    }
    curl_setopt($oCurl, CURLOPT_URL, $url);
    curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt($oCurl, CURLOPT_POST,true);
    curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST);
    $sContent = curl_exec($oCurl);
    $aStatus = curl_getinfo($oCurl);
    curl_close($oCurl);
    if(intval($aStatus["http_code"])==200){
        return $sContent;
    }else{
        return false;
    }
}
仅此笔记,希望能帮助大家。

评论(0)
暂无评论