基于 FC 利用 NLS 的语音合成

基于 FC 利用 NLS 的语音合成

NLS 是阿里云智能语音交互中的语音合成,产品详情页提供了立即合成功能还是不可以下载,对于需要下载少量语音比较麻烦,所以基于 FC 做了个程序。

下面我会介绍如何部署这个程序,如果你只是需要下载可以下滑到预览地址进行使用。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
<?php

require __DIR__ . '/vendor/autoload.php';

use AlibabaCloud\Client\AlibabaCloud;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use OSS\OssClient;
use RingCentral\Psr7\Response;

function handler($request, $context): Response {
// 如果是 GET 的话直接返回前端文件,这个需要自定义域名支持。
if($request->getMethod() === 'GET') {
return new Response(
200,
[
'Content-type' => 'text/html; charset=utf-8',
],
file_get_contents(__DIR__ . '/index.html')
);
}

// 获取存储桶名称
$bucket = getenv('oss_bucket');
// 获取存储桶地域
$region = getenv('oss_region');

// 实例化 OSS
// $ossClient = new OssClient(
// 'yourAccessKeyId',
// 'yourAccessKeySecret',
// 'https://oss-' . $region . '.aliyuncs.com'
// );
$ossClient = new OssClient(
$context['credentials']['accessKeyId'],
$context['credentials']['accessKeySecret'],
'https://oss-' . $region . '.aliyuncs.com',
false,
$context['credentials']['securityToken']
);

// 实例化 GuzzleHttp
// 具体接口地址参考:https://help.aliyun.com/document_detail/94737.html#h2-u670Du52A1u5730u57403
$httpClient = new Client([
'base_uri' => 'https://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/tts',
]);

// Token 获取
// 文档:https://help.aliyun.com/document_detail/72153.html
// AlibabaCloud::accessKeyClient(
// 'yourAccessKeyId',
// 'yourAccessKeySecret')
// ->regionId('cn-shanghai')
// ->asDefaultClient();
AlibabaCloud::StsClient(
$context['credentials']['accessKeyId'],
$context['credentials']['accessKeySecret'],
$context['credentials']['securityToken'])
->regionId('cn-shanghai')
->asDefaultClient();

try {
// 配置参考:https://help.aliyun.com/document_detail/72153.html#h2--commonrequest-5
$response = AlibabaCloud::rpc()
->regionId('cn-shanghai')
->version('2019-02-28')
->action('CreateToken')
->host('nls-meta.cn-shanghai.aliyuncs.com')
->method('POST')
->request();

$token = $response['Token'];

if($token == null) {
return error('Token获取失败');
}
} catch (\Exception $e) {
return error('系统错误');
}

// 用户输入配置
$body = (array) json_decode($request->getBody()->getContents());

// 对用户输入配置进行 json 编码然后 md5 加密,有效避免重复生成
$filename = md5(json_encode($body));

// 文件存储路径
$filepath = sprintf('tts/%s.%s', $filename, $body['format']);

// 获取文件是否存在
$exist = $ossClient->doesObjectExist($bucket, $filepath);

// 文件存在直接返回文件地址,不用重新生成
if($exist === true) {
return result([
'url' => $ossClient->signUrl($bucket, $filepath, 10 * 60),
]);
}

try {
// 调用语音合成接口
$response = $httpClient->post('', [
'body' => json_encode(array_merge([
'appkey' => getenv('appkey'),
'token' => $token['Id'],
], $body)),
]);
} catch (RequestException $e) {
// 请求失败后返回失败信息
$body = (array) json_decode($e->getResponse()->getBody()->getContents());

return error('[' . $body['status'] . '] ' . $body['message']);
}

// 将文件流上传到 OSS
$ossClient->putObject($bucket, $filepath, $response->getBody()->getContents());

return result([
'url' => $ossClient->signUrl($bucket, $filepath, 10 * 60),
]);
}

/**
* 返回成功
*
* @param array $data 数据
* @return RingCentral\Psr7\Response
*/
function result($data = []): Response {
return new Response(
200,
[],
json_encode([
'code' => 1,
'data' => $data,
])
);
}

/**
* 返回错误
*
* @param string $msg 错误信息
* @return RingCentral\Psr7\Response
*/
function error($msg): Response {
return new Response(
200,
[],
json_encode([
'code' => 0,
'msg' => $msg,
])
);
}

部署

创建一个新的函数

设置下函数的一些配置

函数创建完成后点击配置服务

到配置服务页面后下滑到最底部,需要拥有 AliyunOSSFullAccessAliyunFCFullAccessAliyunNLSFullAccess 这些权限

回到我们刚刚创建的函数,代码压缩包在文章底部,下载后进行上传保存

回到函数概览页,配置需要的环境变量

1
2
3
oss_bucket=     # OSS 桶名
oss_region= # OSS 地域
appkey= # appkey,获取文档:https://help.aliyun.com/document_detail/71936.html

上面我们已经配置好了程序,使用函数计算默认域名通过来访问 HTML 会变成下载(参考),所以我们需要配置下自定义域名。

进入自定义域名页面,点击创建域名

输入配置信息

点击保存后会提示域名没有解析

前往 DNS 进行 CNAME 解析

测试

预览

地址:https://tools.hongfs.cn/tts


源码下载

往上