ms-vite-plugin 1.1.2 → 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build.js +6 -0
- package/dist/cli.js +91 -1
- package/dist/mcp/device-config.d.ts +55 -0
- package/dist/mcp/device-config.js +183 -0
- package/dist/mcp/docs-service.d.ts +65 -0
- package/dist/mcp/docs-service.js +168 -0
- package/dist/mcp/project.d.ts +16 -0
- package/dist/mcp/project.js +74 -0
- package/dist/mcp/tools.d.ts +18 -0
- package/dist/mcp/tools.js +825 -0
- package/dist/mcp/types.d.ts +32 -0
- package/dist/mcp/types.js +11 -0
- package/dist/mcp-server.d.ts +2 -0
- package/dist/mcp-server.js +86 -0
- package/dist/project.d.ts +89 -0
- package/dist/project.js +306 -0
- package/dist/version.d.ts +12 -0
- package/dist/version.js +63 -0
- package/docs/api/action.md +922 -0
- package/docs/api/appleocr.md +229 -0
- package/docs/api/config.md +122 -0
- package/docs/api/cryptoUtils.md +232 -0
- package/docs/api/device.md +374 -0
- package/docs/api/file.md +516 -0
- package/docs/api/global.md +617 -0
- package/docs/api/hid.md +1032 -0
- package/docs/api/hotUpdate.md +166 -0
- package/docs/api/http.md +548 -0
- package/docs/api/image.md +907 -0
- package/docs/api/ime.md +290 -0
- package/docs/api/logger.md +324 -0
- package/docs/api/media.md +248 -0
- package/docs/api/mysql.md +441 -0
- package/docs/api/netCard.md +200 -0
- package/docs/api/node.md +353 -0
- package/docs/api/paddleocr.md +246 -0
- package/docs/api/pip.md +242 -0
- package/docs/api/system.md +572 -0
- package/docs/api/thread.md +269 -0
- package/docs/api/tomatoocr.md +425 -0
- package/docs/api/tts.md +334 -0
- package/docs/api/ui.md +947 -0
- package/docs/api/utils.md +265 -0
- package/docs/api/yolo.md +310 -0
- package/docs/apicn/action.md +919 -0
- package/docs/apicn/appleocr.md +233 -0
- package/docs/apicn/config.md +120 -0
- package/docs/apicn/device.md +385 -0
- package/docs/apicn/file.md +511 -0
- package/docs/apicn/global.md +613 -0
- package/docs/apicn/hid.md +1033 -0
- package/docs/apicn/hotUpdate.md +170 -0
- package/docs/apicn/http.md +672 -0
- package/docs/apicn/image.md +924 -0
- package/docs/apicn/ime.md +290 -0
- package/docs/apicn/logger.md +332 -0
- package/docs/apicn/media.md +252 -0
- package/docs/apicn/mysql.md +445 -0
- package/docs/apicn/netCard.md +200 -0
- package/docs/apicn/node.md +362 -0
- package/docs/apicn/paddleocr.md +255 -0
- package/docs/apicn/pip.md +242 -0
- package/docs/apicn/system.md +575 -0
- package/docs/apicn/thread.md +269 -0
- package/docs/apicn/tts.md +338 -0
- package/docs/apicn/ui.md +933 -0
- package/docs/apicn/utils.md +265 -0
- package/docs/apicn/yolo.md +314 -0
- package/docs/apipython/action.md +901 -0
- package/docs/apipython/appleocr.md +226 -0
- package/docs/apipython/config.md +126 -0
- package/docs/apipython/cryptoUtils.md +246 -0
- package/docs/apipython/device.md +365 -0
- package/docs/apipython/file.md +476 -0
- package/docs/apipython/g.md +154 -0
- package/docs/apipython/hid.md +1059 -0
- package/docs/apipython/hotUpdate.md +154 -0
- package/docs/apipython/image.md +938 -0
- package/docs/apipython/ime.md +306 -0
- package/docs/apipython/logger.md +330 -0
- package/docs/apipython/media.md +221 -0
- package/docs/apipython/mysql.md +432 -0
- package/docs/apipython/netCard.md +219 -0
- package/docs/apipython/node.md +331 -0
- package/docs/apipython/overview.md +66 -0
- package/docs/apipython/paddleocr.md +211 -0
- package/docs/apipython/pip.md +231 -0
- package/docs/apipython/system.md +458 -0
- package/docs/apipython/tomatoocr.md +444 -0
- package/docs/apipython/tts.md +331 -0
- package/docs/apipython/ui.md +949 -0
- package/docs/apipython/utils.md +284 -0
- package/docs/apipython/yolo.md +281 -0
- package/package.json +8 -4
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
# 多线程模块 ($线程)
|
|
2
|
+
|
|
3
|
+
多线程模块提供了简单的多线程编程能力,允许您在后台执行任务而不阻塞主线程。配合 `$共享状态` 全局对象,可以实现线程间的数据共享和通信。
|
|
4
|
+
|
|
5
|
+
## 功能概览
|
|
6
|
+
|
|
7
|
+
- **异步执行**: 使用 `$线程.运行` 快速启动新线程。
|
|
8
|
+
- **线程控制**: 支持取消线程、检查线程状态。
|
|
9
|
+
- **状态共享**: 使用 `$共享状态` 在不同线程间共享数据。
|
|
10
|
+
|
|
11
|
+
## 注意事项
|
|
12
|
+
|
|
13
|
+
- **独立的执行环境**: 线程函数在独立的 JavaScript 环境中运行,无法访问主线程或其他作用域中的变量、函数或对象。
|
|
14
|
+
- **闭包限制**: 即使线程函数是闭包形式,它也无法捕获外部变量。传递给 `$线程.运行` 的函数会被转换并在新的上下文中执行。
|
|
15
|
+
- **数据通信**: 如果需要与主线程通信或使用外部数据,请使用 `$共享状态` 全局对象。
|
|
16
|
+
- **文件名限制**:执行的线程 js 文件名称必须以 `_thread.js` 结尾,例如 `worker_thread.js`。
|
|
17
|
+
|
|
18
|
+
## API 参考
|
|
19
|
+
|
|
20
|
+
### 线程模块
|
|
21
|
+
|
|
22
|
+
#### $线程.运行 - 异步执行代码
|
|
23
|
+
|
|
24
|
+
启动一个新的线程来执行指定的函数。
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
function 运行(线程函数: () => 无返回值): 线程;
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**参数:**
|
|
31
|
+
|
|
32
|
+
| 参数名 | 类型 | 描述 |
|
|
33
|
+
| ---------- | ---------------- | ---------------------- |
|
|
34
|
+
| `线程函数` | `() => 无返回值` | 要在子线程中执行的函数 |
|
|
35
|
+
|
|
36
|
+
**返回值:**
|
|
37
|
+
|
|
38
|
+
| 类型 | 描述 |
|
|
39
|
+
| ------ | ------------ |
|
|
40
|
+
| `线程` | 线程控制对象 |
|
|
41
|
+
|
|
42
|
+
**示例:**
|
|
43
|
+
|
|
44
|
+
```javascript
|
|
45
|
+
// 启动一个简单的线程
|
|
46
|
+
const t = $线程.运行("test_thread.js");
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
#### $线程.停止所有 - 停止所有线程
|
|
50
|
+
|
|
51
|
+
停止当前所有正在运行的子线程。
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
function 停止所有(): 布尔值;
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**返回值:**
|
|
58
|
+
|
|
59
|
+
| 类型 | 描述 |
|
|
60
|
+
| -------- | ------------ |
|
|
61
|
+
| `布尔值` | 是否停止成功 |
|
|
62
|
+
|
|
63
|
+
**示例:**
|
|
64
|
+
|
|
65
|
+
```javascript
|
|
66
|
+
const stopped = $线程.停止所有();
|
|
67
|
+
$打印信息日志("停止所有线程: " + stopped);
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
### 线程对象
|
|
73
|
+
|
|
74
|
+
`$线程.运行` 返回的对象,用于控制特定线程。
|
|
75
|
+
|
|
76
|
+
#### 属性
|
|
77
|
+
|
|
78
|
+
| 属性名 | 类型 | 描述 |
|
|
79
|
+
| ---------- | -------- | -------- |
|
|
80
|
+
| `线程名称` | `字符串` | 线程名称 |
|
|
81
|
+
|
|
82
|
+
#### 方法
|
|
83
|
+
|
|
84
|
+
##### 取消 - 取消线程
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
取消(): 布尔值;
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**返回值:** 是否取消成功。
|
|
91
|
+
|
|
92
|
+
**示例:**
|
|
93
|
+
|
|
94
|
+
```javascript
|
|
95
|
+
// t 是 $线程.运行 返回的对象
|
|
96
|
+
t.取消();
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
##### 是否已取消 - 检查是否已取消
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
是否已取消(): 布尔值;
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**返回值:** 如果线程已被取消则返回 `true`,否则返回 `false`。
|
|
106
|
+
|
|
107
|
+
**示例:**
|
|
108
|
+
|
|
109
|
+
```javascript
|
|
110
|
+
if (t.是否已取消()) {
|
|
111
|
+
$打印信息日志("线程已取消");
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
##### 是否正在执行 - 检查是否正在执行
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
是否正在执行(): 布尔值;
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**返回值:** 如果线程正在运行则返回 `true`,否则返回 `false`。
|
|
122
|
+
|
|
123
|
+
**示例:**
|
|
124
|
+
|
|
125
|
+
```javascript
|
|
126
|
+
if (t.是否正在执行()) {
|
|
127
|
+
$打印信息日志("线程正在运行");
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
### 共享状态 ($共享状态)
|
|
134
|
+
|
|
135
|
+
`$共享状态` 是一个全局对象,用于在主线程和子线程之间,或者不同子线程之间共享数据。
|
|
136
|
+
|
|
137
|
+
#### $共享状态.设置 - 设置状态
|
|
138
|
+
|
|
139
|
+
设置一个共享状态值。
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
设置(key: 字符串, value: 任意类型): 无返回值;
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**参数:**
|
|
146
|
+
|
|
147
|
+
| 参数名 | 类型 | 描述 |
|
|
148
|
+
| ------- | ---------- | -------- |
|
|
149
|
+
| `key` | `字符串` | 状态键名 |
|
|
150
|
+
| `value` | `任意类型` | 状态值 |
|
|
151
|
+
|
|
152
|
+
**示例:**
|
|
153
|
+
|
|
154
|
+
```javascript
|
|
155
|
+
$共享状态.设置("count", 1);
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
#### $共享状态.获取 - 获取状态
|
|
159
|
+
|
|
160
|
+
获取指定的共享状态值。
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
获取(key: 字符串): 任意类型;
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**参数:**
|
|
167
|
+
|
|
168
|
+
| 参数名 | 类型 | 描述 |
|
|
169
|
+
| ------ | -------- | -------- |
|
|
170
|
+
| `key` | `字符串` | 状态键名 |
|
|
171
|
+
|
|
172
|
+
**返回值:** 对应的状态值。
|
|
173
|
+
|
|
174
|
+
**示例:**
|
|
175
|
+
|
|
176
|
+
```javascript
|
|
177
|
+
const val = $共享状态.获取("count");
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
#### $共享状态.批量操作 - 批量操作
|
|
181
|
+
|
|
182
|
+
在回调中执行一系列状态操作,保证操作的原子性(视具体实现而定,通常用于在一个锁周期内完成多个操作)。
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
批量操作(block: () => 无返回值): 无返回值;
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**参数:**
|
|
189
|
+
|
|
190
|
+
| 参数名 | 类型 | 描述 |
|
|
191
|
+
| ------- | ---------------- | -------------------- |
|
|
192
|
+
| `block` | `() => 无返回值` | 包含状态操作的代码块 |
|
|
193
|
+
|
|
194
|
+
**示例:**
|
|
195
|
+
|
|
196
|
+
```javascript
|
|
197
|
+
$共享状态.批量操作(() => {
|
|
198
|
+
$共享状态.设置("a", 1);
|
|
199
|
+
$共享状态.设置("b", 2);
|
|
200
|
+
});
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
#### $共享状态.清除 - 清除所有状态
|
|
204
|
+
|
|
205
|
+
清除所有共享的状态数据。
|
|
206
|
+
|
|
207
|
+
```typescript
|
|
208
|
+
清除(): 无返回值;
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
**示例:**
|
|
212
|
+
|
|
213
|
+
```javascript
|
|
214
|
+
$共享状态.清除();
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## 综合示例:线程通信
|
|
218
|
+
|
|
219
|
+
下面的示例展示了如何使用 `$线程.运行` 启动线程,并通过 `$共享状态` 进行主线程与子线程之间的通信。
|
|
220
|
+
|
|
221
|
+
### 1. 子线程代码 (worker_thread.js)
|
|
222
|
+
|
|
223
|
+
```javascript
|
|
224
|
+
// worker_thread.js
|
|
225
|
+
$打印信息日志("子线程开始工作");
|
|
226
|
+
|
|
227
|
+
for (let i = 1; i <= 5; i++) {
|
|
228
|
+
// 检查是否需要提前停止
|
|
229
|
+
if (!$共享状态.获取("isRunning")) {
|
|
230
|
+
$打印信息日志("子线程检测到停止信号,退出");
|
|
231
|
+
break; // 或 return
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
$延时(1000); // 模拟耗时操作
|
|
235
|
+
|
|
236
|
+
// 更新进度到共享状态
|
|
237
|
+
$共享状态.设置("progress", i * 20);
|
|
238
|
+
$打印信息日志(`子线程更新进度: ${i * 20}%`);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
$打印信息日志("子线程工作完成");
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### 2. 主线程代码 (main.js)
|
|
245
|
+
|
|
246
|
+
```javascript
|
|
247
|
+
// main.js
|
|
248
|
+
|
|
249
|
+
// 1. 初始化状态
|
|
250
|
+
$共享状态.设置("progress", 0);
|
|
251
|
+
$共享状态.设置("isRunning", true);
|
|
252
|
+
|
|
253
|
+
// 2. 启动子线程执行耗时任务
|
|
254
|
+
const taskThread = $线程.运行("worker_thread.js");
|
|
255
|
+
|
|
256
|
+
// 3. 主线程监控进度
|
|
257
|
+
while (taskThread.是否正在执行()) {
|
|
258
|
+
const progress = $共享状态.获取("progress");
|
|
259
|
+
$打印信息日志(`主线程读取进度: ${progress}%`);
|
|
260
|
+
|
|
261
|
+
if (progress >= 100) {
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
$延时(500);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
$打印信息日志("任务结束");
|
|
269
|
+
```
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
# 文字转语音模块 ($文字转语音)
|
|
2
|
+
|
|
3
|
+
TTS(文本转语音)模块提供了语音合成、播放控制等功能,支持多种语言和语音设置。
|
|
4
|
+
|
|
5
|
+
## 接口定义
|
|
6
|
+
|
|
7
|
+
### 语音信息结构
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
interface 语音信息结构 {
|
|
11
|
+
/** 语音标识符 */
|
|
12
|
+
identifier: 字符串;
|
|
13
|
+
/** 语音名称 */
|
|
14
|
+
name: 字符串;
|
|
15
|
+
/** 语言代码 */
|
|
16
|
+
language: 字符串;
|
|
17
|
+
/** 语音质量等级 */
|
|
18
|
+
quality: 数字;
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**属性说明:**
|
|
23
|
+
|
|
24
|
+
| 属性名 | 类型 | 描述 |
|
|
25
|
+
| ------------ | ------ | ----------------------------------------- |
|
|
26
|
+
| `identifier` | 字符串 | 语音的唯一标识符,用于设置特定语音 |
|
|
27
|
+
| `name` | 字符串 | 语音的显示名称 |
|
|
28
|
+
| `language` | 字符串 | 语音支持的语言代码(如 "zh-CN", "en-US") |
|
|
29
|
+
| `quality` | 数字 | 语音质量等级,数值越高质量越好 |
|
|
30
|
+
|
|
31
|
+
## 语音播放
|
|
32
|
+
|
|
33
|
+
### 播放语音
|
|
34
|
+
|
|
35
|
+
#### 完整参数版本
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
function 播放语音(
|
|
39
|
+
text: 字符串,
|
|
40
|
+
rate?: 数字,
|
|
41
|
+
pitch?: 数字,
|
|
42
|
+
volume?: 数字,
|
|
43
|
+
language?: 字符串
|
|
44
|
+
): 布尔值;
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**参数说明:**
|
|
48
|
+
|
|
49
|
+
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|
|
50
|
+
| ---------- | ------ | -------- | ------- | ---------------------------- |
|
|
51
|
+
| `text` | 字符串 | 是 | | 要转换为语音的文本内容 |
|
|
52
|
+
| `rate` | 数字 | 否 | 0.5 | 语速,范围 0.0-1.0,默认 0.5 |
|
|
53
|
+
| `pitch` | 数字 | 否 | 1.0 | 音调,范围 0.5-2.0,默认 1.0 |
|
|
54
|
+
| `volume` | 数字 | 否 | 1.0 | 音量,范围 0.0-1.0,默认 1.0 |
|
|
55
|
+
| `language` | 字符串 | 否 | "zh-CN" | 语言代码,默认 "zh-CN" |
|
|
56
|
+
|
|
57
|
+
**返回值:**
|
|
58
|
+
|
|
59
|
+
| 类型 | 描述 |
|
|
60
|
+
| --------- | ---------------- |
|
|
61
|
+
| `boolean` | 是否成功开始播放 |
|
|
62
|
+
|
|
63
|
+
**示例:**
|
|
64
|
+
|
|
65
|
+
```javascript
|
|
66
|
+
// 使用简化参数播放中文文本
|
|
67
|
+
$文字转语音.播放语音("欢迎使用 TTS 功能");
|
|
68
|
+
|
|
69
|
+
// 使用完整参数播放中文语音
|
|
70
|
+
const success = $文字转语音.播放语音("你好世界", 0.5, 1.0, 1.0, "zh-CN");
|
|
71
|
+
if (success) {
|
|
72
|
+
logi("语音播放成功");
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// 播放英文语音,调整语速和音调
|
|
76
|
+
$文字转语音.播放语音("Hello World", 0.7, 1.2, 0.8, "en-US");
|
|
77
|
+
|
|
78
|
+
// 慢速播放,低音调
|
|
79
|
+
$文字转语音.播放语音("这是一段慢速语音", 0.3, 0.8, 1.0, "zh-CN");
|
|
80
|
+
|
|
81
|
+
// 快速播放,高音调
|
|
82
|
+
$文字转语音.播放语音("这是一段快速语音", 0.9, 1.5, 1.0, "zh-CN");
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## 播放控制
|
|
86
|
+
|
|
87
|
+
### 等待播放结束
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
function 等待播放结束(): void;
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**说明:**
|
|
94
|
+
|
|
95
|
+
- 调用 `等待播放结束()` 会阻塞当前线程,直到当前播放的语音完成。
|
|
96
|
+
- 通常在需要确保语音播放完成后再执行后续操作时使用。
|
|
97
|
+
|
|
98
|
+
**示例:**
|
|
99
|
+
|
|
100
|
+
```javascript
|
|
101
|
+
// 播放一段文本
|
|
102
|
+
$文字转语音.播放语音("这是一段需要等待播放完成的文本");
|
|
103
|
+
|
|
104
|
+
// 等待播放完成
|
|
105
|
+
$文字转语音.等待播放结束();
|
|
106
|
+
|
|
107
|
+
$打印信息日志("语音播放完成");
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### 停止播放
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
function 停止播放(): void;
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
停止当前正在播放的语音。
|
|
117
|
+
|
|
118
|
+
**示例:**
|
|
119
|
+
|
|
120
|
+
```javascript
|
|
121
|
+
// 开始播放
|
|
122
|
+
$文字转语音.播放语音("这是一段很长的文本内容...");
|
|
123
|
+
|
|
124
|
+
// 在某个条件下停止播放
|
|
125
|
+
if (shouldStop) {
|
|
126
|
+
$文字转语音.停止播放();
|
|
127
|
+
$打印信息日志("语音播放已停止");
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 是否正在播放
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
function 是否正在播放(): 布尔值;
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
检查当前是否正在播放语音。
|
|
138
|
+
|
|
139
|
+
**返回值:**
|
|
140
|
+
|
|
141
|
+
| 类型 | 描述 |
|
|
142
|
+
| --------- | ------------ |
|
|
143
|
+
| `boolean` | 是否正在播放 |
|
|
144
|
+
|
|
145
|
+
**示例:**
|
|
146
|
+
|
|
147
|
+
```javascript
|
|
148
|
+
// 检查播放状态
|
|
149
|
+
if ($文字转语音.是否正在播放()) {
|
|
150
|
+
$打印信息日志("正在播放语音");
|
|
151
|
+
} else {
|
|
152
|
+
$打印信息日志("当前没有播放语音");
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// 等待播放完成
|
|
156
|
+
while ($文字转语音.是否正在播放()) {
|
|
157
|
+
$延时(100); // 等待 100ms
|
|
158
|
+
}
|
|
159
|
+
$打印信息日志("语音播放完成");
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## 语音设置
|
|
163
|
+
|
|
164
|
+
### 获取可用的语音列表
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
function 获取可用的语音列表(): 数组<语音信息结构>;
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
获取系统中所有可用的语音信息。
|
|
171
|
+
|
|
172
|
+
**返回值:**
|
|
173
|
+
|
|
174
|
+
| 类型 | 描述 |
|
|
175
|
+
| -------------------- | ------------ |
|
|
176
|
+
| `数组<语音信息结构>` | 语音信息数组 |
|
|
177
|
+
|
|
178
|
+
**示例:**
|
|
179
|
+
|
|
180
|
+
```javascript
|
|
181
|
+
// 获取并显示所有可用语音
|
|
182
|
+
const 语音列表 = $文字转语音.获取可用的语音列表();
|
|
183
|
+
$打印信息日志(`找到 ${语音列表.length} 个可用语音:`);
|
|
184
|
+
|
|
185
|
+
语音列表.forEach((voice, index) => {
|
|
186
|
+
$打印信息日志(`${index + 1}. 名称: ${voice.name}`);
|
|
187
|
+
$打印信息日志(` 语言: ${voice.language}`);
|
|
188
|
+
$打印信息日志(` 标识符: ${voice.identifier}`);
|
|
189
|
+
$打印信息日志(` 质量: ${voice.quality}`);
|
|
190
|
+
$打印信息日志("---");
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
// 筛选中文语音
|
|
194
|
+
const chineseVoices = 语音列表.filter((voice) =>
|
|
195
|
+
voice.language.startsWith("zh")
|
|
196
|
+
);
|
|
197
|
+
$打印信息日志(`找到 ${chineseVoices.length} 个中文语音`);
|
|
198
|
+
|
|
199
|
+
// 筛选英文语音
|
|
200
|
+
const englishVoices = 语音列表.filter((voice) =>
|
|
201
|
+
voice.language.startsWith("en")
|
|
202
|
+
);
|
|
203
|
+
$打印信息日志(`找到 ${englishVoices.length} 个英文语音`);
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### 设置播报音色
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
function 设置播报音色(语音标识符: 字符串): 布尔值;
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
设置要使用的语音。
|
|
213
|
+
|
|
214
|
+
**参数说明:**
|
|
215
|
+
|
|
216
|
+
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|
|
217
|
+
| ------------ | ------ | -------- | ------ | -------------------------------------------- |
|
|
218
|
+
| `语音标识符` | 字符串 | 是 | | 语音标识符,可从 `获取可用的语音列表()` 获取 |
|
|
219
|
+
|
|
220
|
+
**返回值:**
|
|
221
|
+
|
|
222
|
+
| 类型 | 描述 |
|
|
223
|
+
| -------- | ------------ |
|
|
224
|
+
| `布尔值` | 是否设置成功 |
|
|
225
|
+
|
|
226
|
+
**示例:**
|
|
227
|
+
|
|
228
|
+
```javascript
|
|
229
|
+
// 获取可用语音并设置第一个中文语音
|
|
230
|
+
const 语音列表 = $文字转语音.获取可用的语音列表();
|
|
231
|
+
const chineseVoice = 语音列表.find((voice) => voice.language.startsWith("zh"));
|
|
232
|
+
|
|
233
|
+
if (chineseVoice) {
|
|
234
|
+
const success = $文字转语音.设置播报音色(chineseVoice.identifier);
|
|
235
|
+
if (success) {
|
|
236
|
+
$打印信息日志(`成功设置语音: ${chineseVoice.name}`);
|
|
237
|
+
$文字转语音.播放语音("语音设置成功");
|
|
238
|
+
} else {
|
|
239
|
+
$打印错误日志("语音设置失败");
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// 设置特定的系统语音
|
|
244
|
+
const success = $文字转语音.设置播报音色(
|
|
245
|
+
"com.apple.ttsbundle.Samantha-compact"
|
|
246
|
+
);
|
|
247
|
+
if (success) {
|
|
248
|
+
$打印信息日志("成功设置为 Samantha 语音");
|
|
249
|
+
$文字转语音.播放语音("Hello, I am Samantha");
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## 资源管理
|
|
254
|
+
|
|
255
|
+
### 释放资源
|
|
256
|
+
|
|
257
|
+
```typescript
|
|
258
|
+
function 释放资源(): 无返回值;
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
`$文字转语音.播放语音`方法调用时,会自动初始化 TTS 模块并在内存缓存,大概增加 20-30MB 的内存占用。
|
|
262
|
+
|
|
263
|
+
默认缓存的情况下,`$文字转语音.播放语音`方法调用会更快,因为不需要重复初始化 TTS 模块。
|
|
264
|
+
|
|
265
|
+
一般情况下,不需要手动调用`$文字转语音.释放资源`方法,除非内存资源有限。
|
|
266
|
+
|
|
267
|
+
调用`$文字转语音.释放资源`时,会立即停止当前播放并释放 TTS 资源。
|
|
268
|
+
|
|
269
|
+
**示例:**
|
|
270
|
+
|
|
271
|
+
```javascript
|
|
272
|
+
$文字转语音.释放资源();
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## 实用示例
|
|
276
|
+
|
|
277
|
+
### 语音提醒功能
|
|
278
|
+
|
|
279
|
+
```javascript
|
|
280
|
+
function 语音提醒(文本, 紧急) {
|
|
281
|
+
if (紧急) {
|
|
282
|
+
// 紧急提醒:快速、高音调
|
|
283
|
+
$文字转语音.播放语音(文本, 0.8, 1.5, 1.0, "zh-CN");
|
|
284
|
+
} else {
|
|
285
|
+
// 普通提醒:正常语速
|
|
286
|
+
$文字转语音.播放语音(文本, 0.5, 1.0, 0.8, "zh-CN");
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// 使用示例
|
|
291
|
+
$语音提醒("任务完成", false);
|
|
292
|
+
$语音提醒("发现错误,请立即处理", true);
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### 多语言播报
|
|
296
|
+
|
|
297
|
+
```javascript
|
|
298
|
+
function 播报多语言文本(文本, 语言) {
|
|
299
|
+
// 根据语言选择合适的语音
|
|
300
|
+
const 语音列表 = $文字转语音.获取可用的语音列表();
|
|
301
|
+
const 指定语音 = 语音列表.find((voice) => voice.language.startsWith(语言));
|
|
302
|
+
|
|
303
|
+
if (指定语音) {
|
|
304
|
+
$文字转语音.设置播报音色(指定语音.identifier);
|
|
305
|
+
$文字转语音.播放语音(文本, 0.5, 1.0, 1.0, 语言);
|
|
306
|
+
} else {
|
|
307
|
+
$打印警告日志(`未找到 ${语言} 语音,使用默认语音`);
|
|
308
|
+
$文字转语音.播放语音(文本);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// 使用示例
|
|
313
|
+
播报多语言文本("Hello World", "en");
|
|
314
|
+
播报多语言文本("你好世界", "zh");
|
|
315
|
+
播报多语言文本("こんにちは", "ja");
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
## 注意事项
|
|
319
|
+
|
|
320
|
+
1. **语音资源**:不同设备可用的语音可能不同,建议在使用前检查可用语音列表
|
|
321
|
+
2. **播放状态**:在开始新的语音播放前,建议检查当前播放状态
|
|
322
|
+
3. **语言匹配**:设置语音时要确保语音支持要播放的语言
|
|
323
|
+
4. **性能考虑**:频繁的语音播放可能影响性能,建议合理控制播放频率
|
|
324
|
+
5. **错误处理**:语音播放可能失败,建议检查返回值并进行适当的错误处理
|
|
325
|
+
|
|
326
|
+
## 常见问题
|
|
327
|
+
|
|
328
|
+
**Q: 为什么语音播放失败?**
|
|
329
|
+
|
|
330
|
+
A: 可能的原因包括:文本为空、语音资源不可用、系统音频设置问题等。建议检查参数和系统设置。
|
|
331
|
+
|
|
332
|
+
**Q: 如何实现更自然的语音效果?**
|
|
333
|
+
|
|
334
|
+
A: 可以通过调整语速(rate)、音调(pitch)参数,选择高质量的语音,以及在文本中添加适当的标点符号来改善语音效果。
|
|
335
|
+
|
|
336
|
+
**Q: 支持哪些语言?**
|
|
337
|
+
|
|
338
|
+
A: 支持的语言取决于系统安装的语音包,可以通过 `getAvailableVoices()` 查看所有可用的语言和语音。
|