语音合成
百度 官方文档
将用户输入的文字,转换成流畅自然的语音输出,并且可以支持语速、 音调、音量设置,打破传统文字式人机交互的方式,让人机沟通更自然
基本说明:
接口地址:http://tsn.baidu.com/text2audio
返回格式:json
请求方式:get/post
请求示例:
请求参数说明:
名称 类型 必填 说明
tex string 必填 合成的文本,使用UTF-8编码。小于2048个中文字或者英文数字。(文本在百度服务器内转换为GBK后,长度必须小于4096字节)
tok string 必填 开放平台获取到的开发者access_token(见上面的“鉴权认证机制”段落)
cuid int 必填 用户唯一标识,用来计算UV值。建议填写能区分用户的机器 MAC 地址或 IMEI 码,长度为60字符以内
ctp int 必填 客户端类型选择,web端填写固定值1
lan string 必填 固定值zh。语言选择,目前只有中英文混合模式,填写固定值zh
spd int 选填 语速,取值0-15,默认为5中语速
pit int 选填 音调,取值0-15,默认为5中语调
vol int 选填 音量,取值0-15,默认为5中音量
per int 选填 发音人选择, 0为普通女声,1为普通男生,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女声
aue int 选填 3为mp3格式(默认); 4为pcm-16k;5为pcm-8k;6为wav(内容同pcm-16k); 注意aue=4或者6是语音识别要求的格式,但是音频内容不是语音识别要求的自然人发音,所以识别效果会受影响。
返回参数说明:
名称 类型 说明
err_no int 错误码
err_msg string 错误码描述
sn string 语音数据唯一标识,系统内部产生。如果反馈及debug请提供sn。
idx int 暂无
JSON返回示例:
{
	"err_no": 500,
	"err_msg": "notsupport.",
	"sn": "abcdefgh",
	"idx": 1
}
服务级错误码参照
错误码 说明
500 不支持输入
501 输入参数不正确
502 token验证失败
503 合成后端错误
完整教学代码示例
<?php
/**
 * Created by PhpStorm.
 * User: FZS
 * Time: 2019/3/13 17:10
 */
//----------------------------------
// 百度语音合成调用类
//----------------------------------
class freeApi{
    private $apiKey = false; //百度应用AppID
    private $secretKey = false; //百度应用API Key
    private $tokenUrl = 'https://aip.baidubce.com/oauth/2.0/token';
    private $apiUrl = 'https://tsn.baidu.com/text2audio';
    public function __construct($apikey,$secretkey){
        $this->apiKey = $apikey;
        $this->secretKey = $secretkey;
    }
    /**
     * 获取token
     * @return array
     */
    public function getToken(){
        $params = [
            'grant_type' => 'client_credentials',
            'client_id'  => $this->apiKey,
            'client_secret' => $this->secretKey,
        ];
        $params = $this->handleUrl($params);
        return $this->returnArray($this->freeApiCurl($this->tokenUrl,$params,1));
    }
    /**
     * url拼接
     * @return array
     */
    private function handleUrl($params){
        $o = "";
        foreach ( $params as $k => $v )
        {
            $o.= "$k=" . urlencode( $v ). "&" ;
        }
        $params = substr($o,0,-1);
        return $params;
    }
    /**
     * 将JSON内容转为数据,并返回
     * @param string $content [内容]
     * @return array
     */
    public function returnArray($content){
        return json_decode($content,true);
    }
    /**
     * 获取语音文件字节数
     * @return int
     */
    public function getResult(){
        $params = [
            'tex' => 'php是最好的语言',
            'lan'  => 'zh',
            'aue' => 3,
            'ctp' => 1,
            'cuid' => 1,
            'tok' => $this->getToken()['access_token'],
        ];
        $params = $this->handleUrl($params);
        return file_put_contents('./test.mp3',file_get_contents($this->apiUrl.'?'.$params));
    }
    /**
     * 请求接口返回内容
     * @param  string $url [请求的URL地址]
     * @param  string $params [请求的参数]
     * @param  int $ipost [是否采用POST形式]
     * @return  string
     */
    public function freeApiCurl($url,$params=false,$ispost=0){
        $httpInfo = array();
        $ch = curl_init();
        curl_setopt( $ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1 );
        curl_setopt( $ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1 );
        curl_setopt( $ch, CURLOPT_USERAGENT , 'chuanshuoapi' );
        curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT , 60 );
        curl_setopt( $ch, CURLOPT_TIMEOUT , 60);
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER , true );
        if( $ispost )
        {
            curl_setopt( $ch , CURLOPT_POST , true );
            curl_setopt( $ch , CURLOPT_POSTFIELDS , $params );
            curl_setopt( $ch , CURLOPT_URL , $url );
        }
        else
        {
            if($params){
                curl_setopt( $ch , CURLOPT_URL , $url.'?'.$params );
            }else{
                curl_setopt( $ch , CURLOPT_URL , $url);
            }
        }
        $response = curl_exec( $ch );
        if ($response === FALSE) {
            return false;
        }
        $httpCode = curl_getinfo( $ch , CURLINFO_HTTP_CODE );
        $httpInfo = array_merge( $httpInfo , curl_getinfo( $ch ) );
        curl_close( $ch );
        return $response;
    }
}