阿里云+tp5.1 实现语音合成(文字转音频)大请忽略!!!
效果视频链接:http://images.junely.vip/textToAudio.mp4
已准备项目appkey,详情请参见创建项目。
已获取Access Token,详情请参见获取Token。
获取Token代码:
/**
* 获取Token
* @return int|mixed|string
* @throws ClientException
*/
public function getToken(){
$cacheToken = cache('AccessToken');
if ($cacheToken) return $cacheToken;
AlibabaCloud::accessKeyClient(
config('aliyun.accessKeyId'), //你的阿里云accessKeyId
config('aliyun.accessKeySecret') //你的阿里云accessKeySecret
)
->regionId("cn-shanghai")
->asDefaultClient();
try {
$response = AlibabaCloud::nlsCloudMeta()
->v20180518()
->createToken()
->request();
$token = $response["Token"];
if($token) {
cache('AccessToken',$response["Token"]['Id'],3600); //存缓存
return $response["Token"]['Id']; //Token在此
}
return 0;
} catch (ClientException $exception) {
// 获取错误消息
return $exception->getErrorMessage();
} catch (ServerException $exception) {
// 获取错误消息
return $exception->getErrorMessage();
}
}
控制器代码:
index();
$this->assign('file', $data);
return $this->fetch();
}
}
模型代码:
public function index(){
$text = input('post.text');
$appkey = config('aliyun.appKey'); //项目AppKey
$token = $this->getToken();
$audioSaveFile = date('YmdHis').".wav"; //文件名
$format = "wav";
$sampleRate = 16000;
$res = $this->processPOSTRequest($appkey, $token, $text, $audioSaveFile, $format, $sampleRate);
return ($res);
}
public function processPOSTRequest($appkey, $token, $text, $audioSaveFile, $format, $sampleRate)
{
$url = "nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/tts";
/**
* 请求参数,以JSON格式字符串填入HTTPS POST请求的Body中。
*/
$taskArr = array(
"appkey" => $appkey,
"token" => $token,
"text" => $text,
"format" => $format,
"sample_rate" => $sampleRate,
// voice 发音人,可选,默认是xiaoyun。
"voice" => "Aida",
// volume 音量,范围是0~100,可选,默认50。
"volume" => 50,
// speech_rate 语速,范围是-500~500,可选,默认是0。
"speech_rate" => -350,
// pitch_rate 语调,范围是-500~500,可选,默认是0。
"pitch_rate" => 50
);
/**
* 数组转json,中文不转义
*/
$body = json_encode($taskArr,JSON_UNESCAPED_UNICODE);
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
/**
* 设置HTTPS POST URL。
*/
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, TRUE);
/**
* 设置HTTPS POST请求头部。
* */
$httpHeaders = array(
"Content-Type: application/json"
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $httpHeaders);
/**
* 设置HTTPS POST请求体。
*/
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
/**
* 设置返回的响应包含HTTPS头部信息。
*/
curl_setopt($curl, CURLOPT_HEADER, TRUE);
/**
* 发送HTTPS POST请求。
*/
$response = curl_exec($curl);
if ($response == FALSE) {
curl_close($curl);
return 'curl_exec failed!';
}
/**
* 处理服务端返回的响应。
*/
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$headers = substr($response, 0, $headerSize);
$bodyContent = substr($response, $headerSize);
curl_close($curl);
if (stripos($headers, "Content-Type: audio/mpeg") != FALSE || stripos($headers, "Content-Type:audio/mpeg") != FALSE) {
// $res = file_put_contents('audioFile/'.$audioSaveFile, $bodyContent); //写入文件输出到本地
//转成base64格式
$base64String = 'data:' . 'audio/mpeg' . ';base64,' . chunk_split(base64_encode($bodyContent));
return $base64String;
}
}
视图:
Title
(文笔不好,请勿介意)~