技术栈

主页 > 后端开发 >

移动端快速接入语音播报

技术栈 - 中国领先的IT技术门户

最近在忙一个小程序蓝牙秤的项目,开发环境为php+小程序,上传物料的时候需要用到语音播报(即将文字转换为语音),于是开始研究,试了几个,最终使用腾讯AI的API来完成这个功能。官网上(http://ai.qq.com/)也有相应教程,大致分为这几个步骤

1.创建应用

填写应用的相关信息,勾选所需的AI技术服务,完成应用的创建,最多可以为应用开放所有的接口权限。

2.获取密钥

在应用创建完毕后,您便可在应用详情中查看到此应用的接入凭证,主要为AppID、AppKey。每个应用唯一标示,互不相同,这两个值需要保存好,后期要用到哦

3.生成签名

应用在调用平台AI技术接口之前,首先需要获取接口鉴权签名。

4.启动开发

一切就绪,便可以开发


上边呢,是大体的步骤,具体知道有这几步就可以了,下面举个实例,更容易让大家理解,其实这个接口的作用就是将文字转换为语音,然后返回文字的语音数据

5.后台配置

  1. 请求的参数

clipboard.png

模型编码

女生 0
女生纯英文1
男生 2
喜道公子 6

语速编码

0.6倍速 -2
0.8倍速 -1
正常速度 0
1.2倍速 1
1.5倍速 2

下面使用PHP实现该HTTP API调用(text即为待合成的语音)

    public function actionBluetoothScaleVoice()
     {
        $data  = Yii::$app->request->get('data');
        $appkey = 'Ejxghuuuuuuuuu';
        $params = array(
            'app_id'     => '11060809832473294',
            'text'       => $data,
            'model_type' => '0',
            'speed'      => '0',
            'time_stamp' => strval(time()),
            'nonce_str'  => strval(rand()),
            'sign'       => '',
        );
        $params['sign'] = $this->getReqSign($params, $appkey);
        // 执行API调用
        $url = 'https://api.ai.qq.com/fcgi-bin/aai/aai_tta';
        $response =$this->doHttpPost($url, $params);
        return $response;
    }
        
       //获取签名
       
      public function getReqSign($params /* 关联数组 */, $appkey /* 字符串*/)
        {
            // 1. 字典升序排序
            ksort($params);
            // 2. 拼按URL键值对
            $str = '';
            foreach ($params as $key => $value)
            {
                if ($value !== '')
                {
                    $str .= $key . '=' . urlencode($value) . '&';
                }
            }
            // 3. 拼接app_key
            $str .= 'app_key=' . $appkey;

            // 4. MD5运算+转换大写,得到请求签名
            $sign = strtoupper(md5($str));
            return $sign;
        }
        
        //执行请求
        public function doHttpPost($url, $params)
    {
        $curl = curl_init();

        $response = false;
        do
        {
            // 1. 设置HTTP URL (API地址)
            curl_setopt($curl, CURLOPT_URL, $url);

            // 2. 设置HTTP HEADER (表单POST)
            $head = array(
                'Content-Type: application/x-www-form-urlencoded'
            );
            curl_setopt($curl, CURLOPT_HTTPHEADER, $head);

            // 3. 设置HTTP BODY (URL键值对)
            $body = http_build_query($params);
            curl_setopt($curl, CURLOPT_POST, true);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $body);

            // 4. 调用API,获取响应结果
            curl_setopt($curl, CURLOPT_HEADER, false);
            curl_setopt($curl, CURLOPT_NOBODY, false);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            // curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
            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;
    }

2.响应参数

clipboard.png

后台写好了,前台该怎么展示呢,这里以小程序为例:

6.前台处理

1.在页面中添加audio标签

<audio data-src="" id="myAudio" ></audio>

2.添加请求

    wx.request({
      url: 'https://xxxx.com',
      data: { data: "待合成的语音数据"},
      method: "get",
      header: {
        'content-type': 'application/json' // 默认值
      },
      dataType: "json",
      success: function (res) {
        let myAudio = wx.createAudioContext('myAudio');
        myAudio.setSrc("data:audio/mp3;base64," + res.data.data.voice);
        myAudio.play();
      }
    })

大致就这么多,如果有不清楚的,或者有更好办法的欢迎留言,共同进步

责任编辑:admin  二维码分享:
本文标签: php