|
最近正在研究小程序地图开发项目,其中有一个是要实现路线导航播放功能,找了各个平台的语音合成,发现只有腾讯AI开放平台的Restful API本人比较看得懂,于是决定先用这个接口实践测试。
官方地址请走:https://ai.qq.com/doc/aaitts.shtml
我这里使用的是第一种方式,语音合成(AI Lab)。然后后端开发环境使用的是phpStudy软件。接着跟着我下面的步骤走。
1、注册登录开放平台,我这里默认使用qq登录,然后创建一个新应用,然后就可以在应用管理列表获取到每个应用的appid和appkey了。如下图:

2、使用php调用方集成语音合成API。这里重在测试,所有方法都集成在一个页面上。具体代码如下:
<?php
function getReqSign($params , $appkey )
{
ksort($params);
$str = '';
foreach ($params as $key => $value)
{
if ($value !== '')
{
$str .= $key . '=' . urlencode($value) . '&';
}
}
$str .= 'app_key=' . $appkey;
$sign = strtoupper(md5($str));
return $sign;
}
function doHttpPost($url, $params)
{
$curl = curl_init();
$response = false;
do
{
curl_setopt($curl, CURLOPT_URL, $url);
$head = array(
'Content-Type: application/x-www-form-urlencoded'
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $head);
$body = http_build_query($params);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_NOBODY, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($curl);
if ($response === false)
{
$response = false;
break;
}
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($code != 200)
{
$response = false;
break;
}
} while (0);
curl_close($curl);
return $response;
}
$appkey = '你的应用的appkey';
$params = array(
'app_id' => '你的应用的appid',
'speaker' => '5',
'format' => '3',
'volume' => '0',
'speed' => '100',
'text' => '哈哈哈,你好,腾讯',
'aht' => '0',
'apc' => '58',
'time_stamp' => strval(time()),
'nonce_str' => strval(rand()),
'sign' => ''
);
$params['sign'] = getReqSign($params, $appkey);
$url = 'https://api.ai.qq.com/fcgi-bin/aai/aai_tts';
$response = doHttpPost($url, $params);
$res_arr=json_decode($response, true);
$ret=array(
'ret'=>$res_arr['ret'],
'data'=>$res_arr['msg']
);
if($res_arr['ret']===0){
$audio = file_put_contents('upload/audio/audio.mp3', base64_decode($res_arr['data']['speech']));
$ret['data']='http://你的本机ip地址:8282/phpserver/upload/audio/audio.mp3';
}
echo json_encode($ret);
?>
3、小程序发起请求得到合成的音频地址:
Page({
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
let that=this;
//
const innerAudioContext = wx.createInnerAudioContext();
innerAudioContext.autoplay = true;
innerAudioContext.loop=true;
wx.request({
url: 'http://你的本机ip地址:8282/phpserver/speech.php',
data: {},
method: 'POST',
success(res){
console.log('success');
console.log(res);
let data=res.data;
if(data.ret===0){
innerAudioContext.src=data.data; //后端返回的mp3文件地址
innerAudioContext.onPlay(()=>{
console.log('开始播放啦');
});
innerAudioContext.onError((res) => {
console.log(res.errMsg)
console.log(res.errCode)
});
}
},
fail(err){
console.log('err');
console.log(err)
}
});
}
})
最终测试效果如下:

目前有个问题未得到解决,该api的text文本长度上线是150字节,也就是75个文本,那么超出的情况我怎么做到无缝播放。如果有该方面经验的网友看到该博文,希望分享下你的经验,谢谢~ |