WokerTask/extend/IFlytek/Xfyun/Speech/TtsClient.php

138 lines
4.3 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Copyright 1999-2021 iFLYTEK Corporation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
namespace IFlytek\Xfyun\Speech;
use Exception;
use IFlytek\Xfyun\Speech\Config\TtsConfig;
use IFlytek\Xfyun\Speech\Constants\TtsConstants;
use IFlytek\Xfyun\Speech\Traits\TtsTrait;
use IFlytek\Xfyun\Core\Handler\WsHandler;
use IFlytek\Xfyun\Core\WsClient;
use IFlytek\Xfyun\Core\Traits\SignTrait;
use Psr\Log\LoggerInterface;
/**
* 语音合成客户端
*
* @author guizheng@iflytek.com
*/
class TtsClient
{
use SignTrait;
use TtsTrait;
/**
* @var string app_id
*/
protected $appId;
/**
* @var string api_key
*/
protected $apiKey;
/**
* @var string api_secret
*/
protected $apiSecret;
/**
* @var array 合成参数配置
*/
protected $requestConfig;
/**
* @var LoggerInterface or null 日志处理
*/
protected $logger;
public function __construct($appId, $apiKey, $apiSecret, $requestConfig = [], $logger = null)
{
$this->appId = $appId;
$this->apiKey = $apiKey;
$this->apiSecret = $apiSecret;
$this->requestConfig = new TtsConfig($requestConfig);
$this->logger = $logger;
}
/**
* 合成文本,并返回结果(字节数组)在Response->getBody()->getContents()
*
* @param string $text 待合成的文本
* @return \GuzzleHttp\Psr7\Response
* @throws Exception
*/
public function request($text)
{
$ttsHandler = new WsHandler(
$this->signUriV1(TtsConstants::URI, [
'appId' => $this->appId,
'apiKey' => $this->apiKey,
'apiSecret' => $this->apiSecret,
'host' => TtsConstants::HOST,
'requestLine' => TtsConstants::REQUEST_LINE,
]),
$this->generateInput($text, $this->appId, $this->requestConfig->toArray())
);
if ($this->logger) {
$ttsHandler->setLogger($this->logger);
}
$client = new WsClient([
'handler' => $ttsHandler
]);
return $client->sendAndReceive();
}
function assembleAuthUrl($addr,$method='GET') {
$apiKey=$this->apiKey;
$apiSecret=$this->apiSecret;
if ($apiKey == "" && $apiSecret == "") { // 不鉴权
return $addr;
}
$ul = parse_url($addr); // 解析地址
if ($ul === false) { // 地址不对,也不鉴权
return $addr;
}
// // $date = date(DATE_RFC1123); // 获取当前时间并格式化为RFC1123格式的字符串
$timestamp = time();
$rfc1123_format = gmdate("D, d M Y H:i:s \G\M\T", $timestamp);
// $rfc1123_format = "Mon, 31 Jul 2023 08:24:03 GMT";
// 参与签名的字段 host, date, request-line
$signString = array("host: " . $ul["host"], "date: " . $rfc1123_format, $method . " " . $ul["path"] . " HTTP/1.1");
// 对签名字符串进行排序,确保顺序一致
// ksort($signString);
// 将签名字符串拼接成一个字符串
$sgin = implode("\n", $signString);
// 对签名字符串进行HMAC-SHA256加密得到签名结果
$sha = hash_hmac('sha256', $sgin, $apiSecret,true);
$signature_sha_base64 = base64_encode($sha);
// 将API密钥、算法、头部信息和签名结果拼接成一个授权URL
$authUrl = "api_key=\"$apiKey\",algorithm=\"hmac-sha256\",headers=\"host date request-line\",signature=\"$signature_sha_base64\"";
// 对授权URL进行Base64编码并添加到原始地址后面作为查询参数
$authAddr = $addr . '?' . http_build_query(array(
'host' => $ul['host'],
'date' => $rfc1123_format,
'authorization' => base64_encode($authUrl),
));
return $authAddr;
}
}