ThinkPHP百度语音合成方法
之前公司做了一个支付语音提醒功能,由于每次支付的金额不确定,于是不能使用固定的音源来作为提示音。于是想到了百度语言合成接口,通过开发调试,实现不同支付金额提示音。
代码如下 api.php
其中用到了自定义函数http_host()
代码如下 function.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);//返回本地音源路径
}
}
仅此笔记,希望能帮助大家。/**
* 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;
}
}