PHP使用科大訊飛語音合成WebApi筆記

科大訊飛語音合成

  • 將文字信息轉(zhuǎn)化為聲音信息,給應(yīng)用配上“嘴巴”。

  • 接入示例:
    其中 TTS_APP_ID 為你在科大訊飛添加服務(wù)后獲得的APPID, TTS_API_KEY 為你在科大訊飛添加服務(wù)后獲得的APIKey, TTS_API_URL 為請(qǐng)求語音在線合成的api接口地址(http://api.xfyun.cn/v1/service/v1/tts), TTS_SAVE_PATH 為你服務(wù)器下的一個(gè)可讀寫的目錄,用來保存合成的語音文件。

function ttsOnline($text, $aue='lame', $volume="50") {
    if (in_array($aue, ['raw', 'lame']) === false) return false;
    $paramArr = [
        "aue" => $aue,
        "pitch" => "50",
        "speed" => "50",
        "volume" => $volume,
        "text_type" => "text",
        "engine_type" => "intp65",
        "voice_name" => "xiaoyan",
        "auf" => "audio/L16;rate=16000",
    ];
    $paramJson = json_encode($paramArr, JSON_UNESCAPED_SLASHES);
    $paramString = base64_encode($paramJson);
    $curTime = time();
    $checkSum = md5(TTS_API_KEY . $curTime . $paramString);
    $header = [
        'X-Appid:' . TTS_APP_ID,
        'X-CurTime:' . $curTime,
        'X-Param:' . $paramString,
        'X-CheckSum:' . $checkSum,
        'Content-Type:' . 'application/x-www-form-urlencoded; charset=utf-8',
    ];
    $text = utf8_encode(urlencode($text));
    $body = 'text=' . $text;
    $res = curl(TTS_API_URL, $header, $body);
    if ($res) {
        $resArr = json_decode($res, true);
        if (json_last_error() === JSON_ERROR_NONE) {
            saveLog($res);
            return false;
        } else {
            $saveFilePath = TTS_SAVE_PATH . date('Ymd');
            if (!is_dir($saveFilePath)) {
                mkdir($saveFilePath);
                chmod($saveFilePath, 0775);
            }
            if ($aue == 'raw') {
                $saveFileTo = $saveFilePath . DS . mt_rand(10000000, 99999999) . '.wav';
            } else {
                $saveFileTo = $saveFilePath . DS . mt_rand(10000000, 99999999) . '.mp3';
            }
            $ret = file_put_contents($saveFileTo, $res);
            if ($ret === false) {
                saveLog('save audio file failed:path'.$saveFileTo);
                return false;
            } else {
                $url = 'https://www.zzzyb.top' . $saveFileTo;
                return ['code' => 1, 'url' => $url];
            }
        }
    } else {
        return false;
    }
}

function curl($url,$header=null, $data=null){
    // 初始化curl
    $curl = curl_init();

    // 設(shè)置curl傳輸選項(xiàng)
    if(isset($header) && !empty($header)){
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    }

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_URL, $url);

    if (!empty($data)){// post方式
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    }

    $output = curl_exec($curl);
    curl_close($curl);
    return $output;
}

在合成成功時(shí)接口會(huì)返回

header:
    Content-Type:audio/mpeg
    Connection:keep-alive
    Cache-Control:no-cache
    sid:hts0000bb3f@ch3d5c059d83b3477200
body:
    音頻數(shù)據(jù)(二進(jìn)制數(shù)組)

而合成失敗的情況下接口會(huì)返回

header:
    Content-Type:text/plain
body:
    {
        "code": "10106",
        "desc": "invalid parameter|invalid speed",
        "data": "",
        "sid": "hts0000bb3f@ch3d5c059d83b3477200"
    }

這里我是使用判斷內(nèi)容時(shí)候?yàn)閖son來判斷是否合成成功的,理論上應(yīng)該改成判斷header的內(nèi)容更加合理。

傳送門:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容