xiaoyuan-assistant 0.5.49 → 0.5.53
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/CHANGELOG.md +25 -0
- package/README.md +15 -0
- package/XIAOYUAN-BUSINESS-FLOW.md +22 -0
- package/package.json +1 -1
- package/src/assets/wake/zh-CN-XiaoxiaoNeural2.mp3 +0 -0
- package/src/assets/wake/zh-CN-XiaoyiNeural2.mp3 +0 -0
- package/src/components/XiaoyuanAssistant.vue +69 -20
- package/src/index.js +5 -2
- package/src/voice/builtinReceivedTTS.js +16 -0
- package/src/voice/builtinWakeTTS.js +13 -0
- package/src/voice/hewoyi.js +29 -0
- package/src/voice/localReceivedTTS.js +15 -16
- package/src/voice/speech.js +211 -19
package/CHANGELOG.md
CHANGED
|
@@ -411,3 +411,28 @@ ls -lh /mnt/data/xiaoyuan-assistant-siliconflow-v0.5.29.zip
|
|
|
411
411
|
- `XiaoyuanAssistant.vue` 改为优先通过 `app.provide('xiaoyuan', runtime)` 获取运行时,避免 NPM 重复依赖/重复模块实例导致 singleton 不一致。
|
|
412
412
|
- `useXiaoyuan()` 对外返回 `runtime.api`,可直接调用 `registerData`、`registerFunction`、`setContext` 等 API。
|
|
413
413
|
|
|
414
|
+
|
|
415
|
+
## v0.5.50 - 运行时初始化彻底移除硬抛错
|
|
416
|
+
|
|
417
|
+
- `useXiaoyuan()` 不再因为运行时暂时不可用而直接 `throw`。
|
|
418
|
+
- 优先读取模块 runtime,其次读取 `window.$xiaoyuan`,都不存在时返回 `null`。
|
|
419
|
+
- 组件继续通过 Vue `provide/inject` 获取 runtime,避免 NPM/Vite 重复模块实例造成误报。
|
|
420
|
+
- 增加 `XIAOYUAN_VERSION` 常量,便于宿主排查实际加载的 SDK 版本。
|
|
421
|
+
- 保持 package.json / ZIP / CHANGELOG 版本一致。
|
|
422
|
+
|
|
423
|
+
## v0.5.51
|
|
424
|
+
|
|
425
|
+
- 修复 NPM + Vite 场景下内置“收到指令”TTS 使用 `new URL(..., import.meta.url)` 被预构建到 `node_modules/.vite/assets` 后产生 404 的问题。
|
|
426
|
+
- 两个内置 voice 的提示音改为随 JS 包内嵌 Base64,运行时直接生成 Blob,不再请求静态 MP3 URL。
|
|
427
|
+
|
|
428
|
+
## v0.5.52
|
|
429
|
+
- 移除小园面板右上角的停止播报/静音图标。
|
|
430
|
+
- 优化语音输入:手动录音前先暂停唤醒识别并等待浏览器释放麦克风,避免双 Recognition 抢占。
|
|
431
|
+
- 增加麦克风权限、设备占用、audio-capture、aborted、启动超时等兼容处理与最多 2 次轻量重试。
|
|
432
|
+
- 语音识别异常不再强制触发 TTS,避免识别与播报互相干扰。
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
## v0.5.53
|
|
436
|
+
- 新增“你好小园”唤醒后的本地“我在您请讲”语音,按配置 voice 使用对应内置 MP3。
|
|
437
|
+
- 唤醒后进入连续语音收音,连续 3 秒无新输入才结束收音并进入指令处理。
|
|
438
|
+
- 手动打开小园仍保持输入框模式,不自动抢占麦克风。
|
package/README.md
CHANGED
|
@@ -231,3 +231,18 @@ app.use(Xiaoyuan, {
|
|
|
231
231
|
|
|
232
232
|
### v0.5.49
|
|
233
233
|
修复 NPM/Vite 环境下运行时注入与 `useXiaoyuan()` 的初始化问题。
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
## v0.5.50 初始化说明
|
|
237
|
+
`useXiaoyuan()` 不再因模块实例分裂或 HMR 时序问题直接抛出“请先 app.use(Xiaoyuan)”异常。宿主仍应正常执行 `app.use(Xiaoyuan, options)`。
|
|
238
|
+
|
|
239
|
+
## v0.5.51
|
|
240
|
+
|
|
241
|
+
- 修复 NPM + Vite 场景下内置“收到指令”TTS 使用 `new URL(..., import.meta.url)` 被预构建到 `node_modules/.vite/assets` 后产生 404 的问题。
|
|
242
|
+
- 两个内置 voice 的提示音改为随 JS 包内嵌 Base64,运行时直接生成 Blob,不再请求静态 MP3 URL。
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
## v0.5.53 语音唤醒
|
|
246
|
+
- `wakeWord` 默认:`你好小园`。
|
|
247
|
+
- 唤醒成功后播放本地 `我在您请讲`,按 `voice` 匹配。
|
|
248
|
+
- 唤醒后的后续语音连续收音,3 秒静默后进入指令处理。
|
|
@@ -1237,3 +1237,25 @@ AI 分析开始提示音与数据获取/模型分析并行;多个数据源采
|
|
|
1237
1237
|
## v0.5.49 初始化兼容修复
|
|
1238
1238
|
- NPM/Vite/HMR 下即使存在多个模块实例,也会将已有 runtime 注入当前 Vue App。
|
|
1239
1239
|
- 组件不再因初始化时序直接 throw,保证宿主应用正常挂载。
|
|
1240
|
+
|
|
1241
|
+
|
|
1242
|
+
## v0.5.50
|
|
1243
|
+
运行时初始化采用非抛错策略:组件通过 Vue provide/inject 获取 runtime;SDK composable 在 runtime 尚未就绪时返回 null,不阻断宿主应用。通过 `window.$xiaoyuan` 作为浏览器环境的兜底引用。
|
|
1244
|
+
|
|
1245
|
+
## v0.5.51
|
|
1246
|
+
|
|
1247
|
+
- 修复 NPM + Vite 场景下内置“收到指令”TTS 使用 `new URL(..., import.meta.url)` 被预构建到 `node_modules/.vite/assets` 后产生 404 的问题。
|
|
1248
|
+
- 两个内置 voice 的提示音改为随 JS 包内嵌 Base64,运行时直接生成 Blob,不再请求静态 MP3 URL。
|
|
1249
|
+
|
|
1250
|
+
## v0.5.52 变更
|
|
1251
|
+
- 移除面板右上角停止播报/静音图标,避免用户误触。
|
|
1252
|
+
- 语音输入采用“先暂停唤醒监听 -> 短暂释放麦克风 -> 单次 Recognition”的顺序,降低语音输入偶发失效。
|
|
1253
|
+
- 麦克风权限、设备缺失、设备占用、浏览器启动失败和网络异常增加明确错误处理与轻量重试。
|
|
1254
|
+
- 语音识别错误不自动播报错误 TTS,减少 SpeechRecognition 与 SpeechSynthesis 之间的资源竞争。
|
|
1255
|
+
|
|
1256
|
+
|
|
1257
|
+
## v0.5.53 唤醒与连续语音流程
|
|
1258
|
+
- 手动打开:只展开输入框,不自动监听。
|
|
1259
|
+
- 说“你好小园”:命中后暂停唤醒监听,立即播放对应 voice 的本地“我在您请讲”MP3。
|
|
1260
|
+
- 播放开始后进入连续收音;3 秒没有新的语音输入,结束本轮收音。
|
|
1261
|
+
- 收音结束后调用“收到指令,请您稍等”本地/缓存 TTS,再解析并按现有步骤流程执行。
|
package/package.json
CHANGED
|
Binary file
|
|
Binary file
|
|
@@ -30,9 +30,6 @@
|
|
|
30
30
|
<button type="button" class="xy-icon-btn" title="收起" @click="collapse" aria-label="收起">
|
|
31
31
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14"/></svg>
|
|
32
32
|
</button>
|
|
33
|
-
<button type="button" class="xy-icon-btn" title="停止播报" @click="stopSpeech" aria-label="停止播报">
|
|
34
|
-
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 4l16 16M9.5 6.2A7 7 0 0 1 19 12v1.2M4.8 9.1A7 7 0 0 0 5 13"/></svg>
|
|
35
|
-
</button>
|
|
36
33
|
</div>
|
|
37
34
|
</header>
|
|
38
35
|
|
|
@@ -120,6 +117,7 @@ const runtime =
|
|
|
120
117
|
// 如果宿主项目因为 HMR / 重复依赖导致当前模块暂时拿不到注入值,
|
|
121
118
|
// 组件保持可挂载,并在 mounted 后再次尝试解析,避免整个页面崩溃。
|
|
122
119
|
const safeRuntime = runtime || { manager: null, speech: null, options: {} }
|
|
120
|
+
const XIAOYUAN_SDK_VERSION = '0.5.53'
|
|
123
121
|
const { manager, speech, options } = safeRuntime
|
|
124
122
|
|
|
125
123
|
const wakeWord = options.wakeWord || '你好小园'
|
|
@@ -219,19 +217,60 @@ function collapse() {
|
|
|
219
217
|
}
|
|
220
218
|
|
|
221
219
|
async function activate(reason = 'manual') {
|
|
222
|
-
// 用户点击/唤醒时先完成本地前置 TTS 的解锁与预解码,避免收到识别结果后播放被浏览器拦截。
|
|
223
220
|
await speech.unlockTTS?.()
|
|
224
221
|
expanded.value = true
|
|
225
|
-
showSubtitle(reason === 'wake' ? '
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
222
|
+
showSubtitle(reason === 'wake' ? '我在您请讲' : '小园已唤醒,请输入或说出您的指令。')
|
|
223
|
+
|
|
224
|
+
if (reason !== 'wake') return
|
|
225
|
+
|
|
226
|
+
wakeController?.pause?.()
|
|
227
|
+
wakeListening.value = false
|
|
228
|
+
|
|
229
|
+
// 唤醒后的固定应答必须先本地播放,但不等待播放完成;声音开始后即可进入后续收音。
|
|
230
|
+
if (options.enableTTS) {
|
|
231
|
+
try {
|
|
232
|
+
const started = await speech.ttsProvider?.speakWakeResponseAsync?.()
|
|
233
|
+
if (started !== false) {
|
|
234
|
+
await new Promise((resolve) => window.setTimeout(resolve, 120))
|
|
235
|
+
}
|
|
236
|
+
} catch (_) {}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
if (!expanded.value || processing.value || listening.value) return
|
|
240
|
+
void listenAfterWake()
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
async function listenAfterWake() {
|
|
244
|
+
if (!speech?.listenAfterWake) return
|
|
245
|
+
listening.value = true
|
|
246
|
+
interimText.value = ''
|
|
247
|
+
showSubtitle('我在您请讲…', 0)
|
|
248
|
+
try {
|
|
249
|
+
const spoken = await speech.listenAfterWake({
|
|
250
|
+
silenceMs: 3000,
|
|
251
|
+
retries: 2,
|
|
252
|
+
onInterim: (value) => { interimText.value = value || '' }
|
|
253
|
+
})
|
|
254
|
+
interimText.value = ''
|
|
255
|
+
if (spoken) {
|
|
256
|
+
// 3 秒无后续输入后,才进入“收到指令”前置提示与业务解析流程。
|
|
257
|
+
await handleCommand(spoken, 'voice-wake')
|
|
258
|
+
} else {
|
|
259
|
+
showSubtitle('没有听到您的指令,请再说一次。', 5000)
|
|
260
|
+
}
|
|
261
|
+
} catch (error) {
|
|
262
|
+
interimText.value = ''
|
|
263
|
+
showSubtitle(String(error?.message || '语音识别失败'), 6000)
|
|
264
|
+
} finally {
|
|
265
|
+
listening.value = false
|
|
266
|
+
if (!processing.value && options.enableWakeWord) {
|
|
267
|
+
window.setTimeout(() => {
|
|
268
|
+
if (!processing.value && !listening.value) {
|
|
269
|
+
wakeController?.resume?.()
|
|
270
|
+
wakeListening.value = true
|
|
271
|
+
}
|
|
272
|
+
}, 120)
|
|
273
|
+
}
|
|
235
274
|
}
|
|
236
275
|
}
|
|
237
276
|
|
|
@@ -285,12 +324,21 @@ function interruptForNewCommand() {
|
|
|
285
324
|
|
|
286
325
|
async function toggleListening() {
|
|
287
326
|
if (!manager || !speech) return
|
|
288
|
-
if (listening.value) return
|
|
289
|
-
|
|
290
|
-
|
|
327
|
+
if (listening.value || processing.value) return
|
|
328
|
+
try {
|
|
329
|
+
await speech.unlockTTS?.()
|
|
330
|
+
// 先彻底暂停唤醒识别,给浏览器一个很短的释放麦克风窗口,避免两个 Recognition 抢占。
|
|
331
|
+
wakeController?.pause?.()
|
|
332
|
+
wakeListening.value = false
|
|
333
|
+
await new Promise((resolve) => window.setTimeout(resolve, 120))
|
|
334
|
+
await listenForCommand({ manual: true })
|
|
335
|
+
} catch (error) {
|
|
336
|
+
const message = String(error?.message || error || '语音识别启动失败')
|
|
337
|
+
showSubtitle(message, 6000)
|
|
338
|
+
}
|
|
291
339
|
}
|
|
292
340
|
|
|
293
|
-
async function listenForCommand({ auto = false } = {}) {
|
|
341
|
+
async function listenForCommand({ auto = false, manual = false } = {}) {
|
|
294
342
|
// 在开始语音识别时就完成本地前置 TTS 的 AudioContext 解锁/预解码,
|
|
295
343
|
// 这样识别结束后收到结果时无需依赖新的用户手势。
|
|
296
344
|
await speech.unlockTTS?.()
|
|
@@ -303,6 +351,8 @@ async function listenForCommand({ auto = false } = {}) {
|
|
|
303
351
|
// 手动或唤醒后的单次聆听期间,暂停持续唤醒监听,避免两个 Recognition 实例抢麦克风。
|
|
304
352
|
wakeController?.pause?.()
|
|
305
353
|
wakeListening.value = false
|
|
354
|
+
// 等待上一个 recognition.onend 真正释放麦克风,避免 Chrome/Edge 报 audio-capture/not-allowed。
|
|
355
|
+
await new Promise((resolve) => window.setTimeout(resolve, manual ? 120 : 80))
|
|
306
356
|
|
|
307
357
|
listening.value = true
|
|
308
358
|
interimText.value = ''
|
|
@@ -320,9 +370,8 @@ async function listenForCommand({ auto = false } = {}) {
|
|
|
320
370
|
} catch (error) {
|
|
321
371
|
interimText.value = ''
|
|
322
372
|
const message = String(error?.message || error || '语音识别失败')
|
|
323
|
-
addMessage('assistant', message)
|
|
324
373
|
showSubtitle(message, 6000)
|
|
325
|
-
|
|
374
|
+
// 语音识别错误不再强制播报,避免把浏览器 TTS 与识别重新启动互相干扰。
|
|
326
375
|
} finally {
|
|
327
376
|
listening.value = false
|
|
328
377
|
// 当前指令处理结束后恢复全局唤醒监听。
|
package/src/index.js
CHANGED
|
@@ -10,10 +10,13 @@ import { KEY, getXiaoyuanSingleton, setXiaoyuanSingleton } from './context.js'
|
|
|
10
10
|
|
|
11
11
|
export function useXiaoyuan() {
|
|
12
12
|
const runtime = getXiaoyuanSingleton()
|
|
13
|
-
if (
|
|
14
|
-
return
|
|
13
|
+
if (runtime?.api) return runtime.api
|
|
14
|
+
if (typeof window !== 'undefined' && window.$xiaoyuan) return window.$xiaoyuan
|
|
15
|
+
return null
|
|
15
16
|
}
|
|
16
17
|
|
|
18
|
+
export const XIAOYUAN_VERSION = '0.5.52'
|
|
19
|
+
|
|
17
20
|
const Xiaoyuan = {
|
|
18
21
|
install(app, options = {}) {
|
|
19
22
|
// 同一个页面可能因为 Vite/NPM 依赖解析或 HMR 出现多个 Xiaoyuan 模块实例。
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Built-in "收到指令,请您稍等" audio embedded into the package.
|
|
2
|
+
// Kept in JS so Vite/NPM dependency pre-bundling cannot rewrite the asset URL
|
|
3
|
+
// into node_modules/.vite/assets and cause a 404 on first use.
|
|
4
|
+
export const BUILTIN_RECEIVED_COMMAND_AUDIO = Object.freeze({
|
|
5
|
+
'zh-CN-XiaoyiNeural': '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qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq',
|
|
6
|
+
'zh-CN-XiaoxiaoNeural': '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NhsRnnHRrjK26O4+fbb8KDyNmf9FjtcRGjn/AWwjaPMNcG////NkxJUaYcJEE1gYAPhgJSPQv4/cqz//wIhOzLstsQXoTZNraxv6Lmh7myN7OKsTRdE5IKsf//8uCoywJxUXfj0o2ETYsMn////3RRnOq6VutvmZ64oqLQuBfv/////2Bwj779/ea93h5sL58xay5ImLMw////////01felfH+s3pT6f5zSNGxGxl7b6hq2P//NkxK41/Dq+XZh4Av//////////zqN/vN9vHmqU1d/Hfx/8RF1iNZdwIeoss0fbbtulfUzCemWDWxDXTgTkjNu9esLtAsgcZqsNOWzdIBB5n5yGFKMbImobMrUAL+PC9z8z5YsfUlpoKA8iAc0QChvkslk1gnH0xTJ50mGr0z2slNM5Zt/pjX3/13VomzGs//NkxFkkSnrGV9hYALp1f///8/8MiFDuzr5////+7re17zRk22W008pif//prNZpFhAQpaDJZomInQsBXwKkcDJGo3lE1YJwAApW021tbnJqlBnocXVWi6KtCXtdqdJIUxQ0PXCqxYJMsUh3PPKez9jck9JJFQeD1NHZLs7boZ1ETDBcCqj9dXuQSY6LW6Nm//NkxEoc+d7a3nmKzJvq7GZ2QWMTvVsBNZoRpKlTUl/9Pu0pDI0F1AVa2PUPEaVPUT556v+kOueQmlklklJFAAoS652GSsvzvOZyrDQslrnESM3BFRAtTZLZfk5IcDFr/JFzOd3wubrvE+W1u3fu331X8LZGhJi2h5rBC0oKiqSRYG1Pk+aIgmEjQMwaiX////NkxFkcCXblngvMEnLNbK8RAEXQZ0b5GidcYNFrGDkqN47G1cWQzVXaTY+yACVx0gWG2TvOaeUkYmS1ovguKhiQEBuljs2yTWTCZk8AAnUnVl6JMGRnra/95W/s6kmlfKh1et1dAz6d+//qyJLN3JrK6P////p66/Z+9VWdJUI+v//6OcaFE8WsNe8apth///NkxGsbc7LFfnmE5VA2KYZKkGtrlrc7lOsyU92MojpQTUSAyU65ezBOGjvadfmTCc7Jb3S7BI43C8nl5+3jRTY56NuLlUP/r9n7bMb9asZiFMLqZWlZHATGI+j/2p9UUpTXfxZzgKspV/////6/5qo87I7rp+vT/9ZRSAi04yzp9xKaggmSaTaS5gOK7FZn//NkxIAcw67SPsGE1icrhAwW5njJgKjbJH0wV7KQtjUsoGT/fMwi098oUmZXQWZzH26P2tqX/dWUoopE7IgqYpVTZMdPP725jPZmtQzFBVHCIlDC3cU4iUn7+VArkFEDkIJbfEbhUYBQkHFavsQXDaoCm41G220/ksW0goBiXF1uE+fRoSujMTMw0jVUzkxM//NkxJAcClrJvnmKls+IgoS5GEjku8yRRNIo0kclTVtd+8/tUzMyUpSp+yepSsUxg8coiAodKYxjZSlMhvu7o8yXb8q9ZSl6////7rSVv6P/9HlVDCTjJavEV1bCq/r89UOqPIEctlsbbiUtYJ9FiTbLX/Hy/MlxSztNRaSMm5wUypefJgCSq/Ap27o5jWKi//NkxKIdE0aQXnmK8p9JXzNM8l2tb1KDMIYokNKlh5IXepziLT0bQdW7yq3Sye3//p//31f8lTocBZJeV5DFEOk7BMIDbWF1MX1aTbk+o+CkcSpracdksUqS2ViI8jTNfPOLsytLx0JTWng0CgsWPkCoqYgyoXDJ6k02lK0soHbXY0VGNdFnuSm7a4WveK40//NkxLAVqXplHnmEXMEVpRNCyY1V0lIpM99tIZNKCGHgSJQsuCvXgiPshVAGrWmysnRmMELWCqs86DCso0WGsIPGdXXRSZY1JGZqIzLmb2G3bz6V3PMNVmoMWSuRtwNwurm9aKq7Mf1yrnw78mUvSM6RGk4VhFQQYz0ybbcy9i1RWthc7ZDc7w9Z+hKwb96j//NkxNwaWWo8CHpGNFpMbQyXvISVmVuGboYUKTuNSGFVEgPN2Zs0pXoMx2uZMee/T00NKfSFSmdM7ZbZKQOGdISaeciMXvdTYrYRTzF8OyoRhX9C7C6T64NzVeIZCTq5fDuSl4M1qxIIJksIvXJUeymby5EsoMQytWSHNBQYpFK8i5UhrkRBDMls7hgl9clw//NkxPUhXDoUCsJGLF1uopKLrBxgmO2gLiCBBtpjvYTV4TobDSbEaFrNDRDzaXelSOk0JhjIoUI3wkrl2/GQnzpyFKVLhY57CzCYItphwUDNo5cLQjPU2iTivcG5Fcl8jRF3CAj1PJaZGdSrCFuhoV4VFRh2ZzDOKCqSoOKRBINVWkcFkFtCqILdpAuEqL0K//NkxPIeu8oQwEhGBYExiABQ6wgb7FyawHglQGoJDZhkjvdSyzJh0phnXY2lPhMZPMm1DWkXc8xj2yY1L2XPR2skY9vX+hjCoDI9BS9DQkFGimGDnVXmUI2s9W8C79Tm5LVECVoIVrdxII3xiMS6BarAThg64I3QLYDKD5LuJgpGEh30zKldyLHCiYqGYbcr//NkxPoh/DIMyEhGIQ6gZgYKIgssmVtWlaGFplcMwdECoepgpJyMA2EklL40FVY339YKqlqQY1Jv9jUmOMao1JodXY12okMKVSDEzVSjfDXwzgLgMb1IMQYwpNS+7Uv/8vOnVh/lSak1JkaqUagNAUAnAUYwJxLfk0arBQMmL+VdvY12YKYChrDXlWNVjKwo//NkxPUhNDoEAFgGZCiQxlIalGokMMGNf2rVYKV31BKKZUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxPMhJAncAGGGCVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV'
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
export function base64ToBlob(base64, mimeType = 'audio/mpeg') {
|
|
10
|
+
const binary = atob(base64)
|
|
11
|
+
const bytes = new Uint8Array(binary.length)
|
|
12
|
+
for (let i = 0; i < binary.length; i += 1) {
|
|
13
|
+
bytes[i] = binary.charCodeAt(i)
|
|
14
|
+
}
|
|
15
|
+
return new Blob([bytes], { type: mimeType })
|
|
16
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Built-in wake response: “我在您请讲” audio, keyed by the configured TTS voice.
|
|
2
|
+
// Embedded directly into the package to avoid NPM/Vite asset URL rewriting.
|
|
3
|
+
export const BUILTIN_WAKE_RESPONSE_AUDIO = Object.freeze({
|
|
4
|
+
'zh-CN-XiaoxiaoNeural': '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RNQJGqJHjQaEpzf/6fKfKfHypbZp/3bf/VPG5Ut5KtE7ZbfT//NkxPciJDYAAEhGxMbLPn+vlPiTbNP3w5kjTEiMJG9AhRVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxPEhBBHUAFDNOVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NkxHwAAANIAAAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV',
|
|
5
|
+
'zh-CN-XiaoyiNeural': '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qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NkxHwAAANIAAAAAKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq',
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
export function base64ToWakeBlob(base64, mimeType = 'audio/mpeg') {
|
|
9
|
+
const binary = atob(base64)
|
|
10
|
+
const bytes = new Uint8Array(binary.length)
|
|
11
|
+
for (let i = 0; i < binary.length; i += 1) bytes[i] = binary.charCodeAt(i)
|
|
12
|
+
return new Blob([bytes], { type: mimeType })
|
|
13
|
+
}
|
package/src/voice/hewoyi.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getReceivedCommandAudio, saveReceivedCommandAudio } from './localReceivedTTS.js'
|
|
2
|
+
import { BUILTIN_WAKE_RESPONSE_AUDIO, base64ToWakeBlob } from './builtinWakeTTS.js'
|
|
2
3
|
|
|
3
4
|
const RECEIVED_COMMAND_TEXT = '收到指令,请您稍等。'
|
|
4
5
|
|
|
@@ -641,6 +642,34 @@ export class HewoyiTTSProvider {
|
|
|
641
642
|
}
|
|
642
643
|
}
|
|
643
644
|
|
|
645
|
+
getBuiltinWakeResponseBlob() {
|
|
646
|
+
const base64 = BUILTIN_WAKE_RESPONSE_AUDIO[String(this.voice || '').trim()]
|
|
647
|
+
if (!base64) return null
|
|
648
|
+
try {
|
|
649
|
+
return base64ToWakeBlob(base64, 'audio/mpeg')
|
|
650
|
+
} catch (error) {
|
|
651
|
+
this.error('内置“我在您请讲”语音解析失败:', error?.message || error)
|
|
652
|
+
return null
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
async speakWakeResponseAsync() {
|
|
657
|
+
// 唤醒词响应只走本地音频,不请求网络。
|
|
658
|
+
const blob = this.getBuiltinWakeResponseBlob()
|
|
659
|
+
if (!blob) return false
|
|
660
|
+
try {
|
|
661
|
+
this.stopCurrentSpeechOnly()
|
|
662
|
+
const played = await this.playWithAudioElement(blob, { waitForEnd: false, minStartHoldMs: 80 })
|
|
663
|
+
if (played) {
|
|
664
|
+
this.log('本地“我在您请讲”语音已开始播放,voice:', this.voice)
|
|
665
|
+
return true
|
|
666
|
+
}
|
|
667
|
+
} catch (error) {
|
|
668
|
+
this.error('本地“我在您请讲”播放失败:', error?.message || error)
|
|
669
|
+
}
|
|
670
|
+
return false
|
|
671
|
+
}
|
|
672
|
+
|
|
644
673
|
async speakReceivedCommandAsync() {
|
|
645
674
|
const value = RECEIVED_COMMAND_TEXT
|
|
646
675
|
|
|
@@ -3,10 +3,19 @@ const DB_VERSION = 1
|
|
|
3
3
|
const STORE_NAME = 'audio'
|
|
4
4
|
const CACHE_PREFIX = 'received-command::'
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
import { BUILTIN_RECEIVED_COMMAND_AUDIO, base64ToBlob } from './builtinReceivedTTS.js'
|
|
7
|
+
|
|
8
|
+
let builtinObjectUrls = new Map()
|
|
9
|
+
|
|
10
|
+
function getBuiltinBlob(voice) {
|
|
11
|
+
const base64 = BUILTIN_RECEIVED_COMMAND_AUDIO[normalizeVoice(voice)]
|
|
12
|
+
if (!base64) return null
|
|
13
|
+
try {
|
|
14
|
+
return base64ToBlob(base64, 'audio/mpeg')
|
|
15
|
+
} catch (_) {
|
|
16
|
+
return null
|
|
17
|
+
}
|
|
18
|
+
}
|
|
10
19
|
|
|
11
20
|
function isBrowser() {
|
|
12
21
|
return typeof window !== 'undefined' && typeof indexedDB !== 'undefined'
|
|
@@ -39,18 +48,8 @@ export async function getReceivedCommandAudio(voice) {
|
|
|
39
48
|
if (!isBrowser()) return null
|
|
40
49
|
|
|
41
50
|
const normalized = normalizeVoice(voice)
|
|
42
|
-
const
|
|
43
|
-
if (
|
|
44
|
-
try {
|
|
45
|
-
const response = await fetch(builtinUrl, { cache: 'force-cache' })
|
|
46
|
-
if (response.ok) {
|
|
47
|
-
const blob = await response.blob()
|
|
48
|
-
if (blob.size) return blob
|
|
49
|
-
}
|
|
50
|
-
} catch (_) {
|
|
51
|
-
// 内置资源读取失败时继续走 IndexedDB / 首次网络 TTS 逻辑。
|
|
52
|
-
}
|
|
53
|
-
}
|
|
51
|
+
const builtinBlob = getBuiltinBlob(normalized)
|
|
52
|
+
if (builtinBlob?.size) return builtinBlob
|
|
54
53
|
|
|
55
54
|
const db = await openDB()
|
|
56
55
|
return await new Promise((resolve, reject) => {
|
package/src/voice/speech.js
CHANGED
|
@@ -26,13 +26,38 @@ export class SpeechService {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
async requestMicrophonePermission() {
|
|
29
|
-
if (typeof navigator === 'undefined'
|
|
29
|
+
if (typeof navigator === 'undefined') {
|
|
30
|
+
throw new Error('当前环境无法访问麦克风')
|
|
31
|
+
}
|
|
32
|
+
if (!navigator.mediaDevices?.getUserMedia) {
|
|
33
|
+
// Web Speech 在部分浏览器可用,即使 MediaDevices API 不可用,也继续让 Recognition 自己处理。
|
|
30
34
|
return true
|
|
31
35
|
}
|
|
32
36
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
37
|
+
try {
|
|
38
|
+
const stream = await navigator.mediaDevices.getUserMedia({
|
|
39
|
+
audio: {
|
|
40
|
+
echoCancellation: true,
|
|
41
|
+
noiseSuppression: true,
|
|
42
|
+
autoGainControl: true,
|
|
43
|
+
channelCount: 1
|
|
44
|
+
}
|
|
45
|
+
})
|
|
46
|
+
for (const track of stream.getTracks()) track.stop()
|
|
47
|
+
return true
|
|
48
|
+
} catch (error) {
|
|
49
|
+
const name = error?.name || 'unknown'
|
|
50
|
+
if (name === 'NotAllowedError' || name === 'SecurityError') {
|
|
51
|
+
throw new Error('麦克风权限被拒绝,请在浏览器地址栏允许当前页面使用麦克风')
|
|
52
|
+
}
|
|
53
|
+
if (name === 'NotFoundError' || name === 'DevicesNotFoundError') {
|
|
54
|
+
throw new Error('没有检测到麦克风设备,请检查麦克风是否连接')
|
|
55
|
+
}
|
|
56
|
+
if (name === 'NotReadableError' || name === 'TrackStartError') {
|
|
57
|
+
throw new Error('麦克风正在被其他程序占用,请关闭其他录音/视频程序后重试')
|
|
58
|
+
}
|
|
59
|
+
throw error
|
|
60
|
+
}
|
|
36
61
|
}
|
|
37
62
|
|
|
38
63
|
createRecognition({ continuous = false } = {}) {
|
|
@@ -169,30 +194,59 @@ export class SpeechService {
|
|
|
169
194
|
}
|
|
170
195
|
}
|
|
171
196
|
|
|
172
|
-
listenOnce() {
|
|
197
|
+
async listenOnce({ retries = 2 } = {}) {
|
|
198
|
+
if (!this.supported()) {
|
|
199
|
+
throw new Error('当前浏览器不支持语音识别,请使用 Chrome / Edge')
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
let lastError = null
|
|
203
|
+
for (let attempt = 0; attempt <= retries; attempt += 1) {
|
|
204
|
+
try {
|
|
205
|
+
return await this._listenOnceInternal()
|
|
206
|
+
} catch (error) {
|
|
207
|
+
lastError = error
|
|
208
|
+
const msg = String(error?.message || '')
|
|
209
|
+
const retryable = /启动失败|audio-capture|麦克风|网络异常|network|aborted/i.test(msg)
|
|
210
|
+
if (!retryable || attempt >= retries) throw error
|
|
211
|
+
await new Promise((resolve) => window.setTimeout(resolve, 220 + attempt * 280))
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
throw lastError || new Error('语音识别失败')
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
_listenOnceInternal() {
|
|
173
218
|
return new Promise(async (resolve, reject) => {
|
|
174
|
-
|
|
175
|
-
|
|
219
|
+
try {
|
|
220
|
+
await this.requestMicrophonePermission()
|
|
221
|
+
} catch (error) {
|
|
222
|
+
reject(error instanceof Error ? error : new Error(String(error)))
|
|
176
223
|
return
|
|
177
224
|
}
|
|
178
225
|
|
|
226
|
+
let recognition
|
|
179
227
|
try {
|
|
180
|
-
|
|
228
|
+
recognition = this.createRecognition({ continuous: false })
|
|
181
229
|
} catch (error) {
|
|
182
|
-
|
|
183
|
-
reject(new Error(`麦克风权限不可用:${reason}`))
|
|
230
|
+
reject(error)
|
|
184
231
|
return
|
|
185
232
|
}
|
|
186
233
|
|
|
187
|
-
const recognition = this.createRecognition({ continuous: false })
|
|
188
234
|
let finalText = ''
|
|
189
235
|
let settled = false
|
|
236
|
+
let startTimer = null
|
|
237
|
+
let stopTimer = null
|
|
238
|
+
|
|
239
|
+
const cleanup = () => {
|
|
240
|
+
if (startTimer) window.clearTimeout(startTimer)
|
|
241
|
+
if (stopTimer) window.clearTimeout(stopTimer)
|
|
242
|
+
this.listening = false
|
|
243
|
+
this.recognition = null
|
|
244
|
+
}
|
|
190
245
|
|
|
191
246
|
const finish = (error = null) => {
|
|
192
247
|
if (settled) return
|
|
193
248
|
settled = true
|
|
194
|
-
|
|
195
|
-
this.recognition = null
|
|
249
|
+
cleanup()
|
|
196
250
|
this.onEnd()
|
|
197
251
|
if (error) reject(error)
|
|
198
252
|
else resolve(finalText.trim())
|
|
@@ -200,6 +254,7 @@ export class SpeechService {
|
|
|
200
254
|
|
|
201
255
|
recognition.onstart = () => {
|
|
202
256
|
this.listening = true
|
|
257
|
+
if (startTimer) window.clearTimeout(startTimer)
|
|
203
258
|
}
|
|
204
259
|
|
|
205
260
|
recognition.onresult = (event) => {
|
|
@@ -215,17 +270,16 @@ export class SpeechService {
|
|
|
215
270
|
}
|
|
216
271
|
this.onInterim(interim)
|
|
217
272
|
|
|
218
|
-
// 已得到 final 文本就尽快结束本轮,减少“说完以后还要等很久”的感觉。
|
|
219
273
|
if (finalText.trim()) {
|
|
220
|
-
window.
|
|
274
|
+
if (stopTimer) window.clearTimeout(stopTimer)
|
|
275
|
+
stopTimer = window.setTimeout(() => {
|
|
221
276
|
try { recognition.stop() } catch (_) {}
|
|
222
|
-
},
|
|
277
|
+
}, 60)
|
|
223
278
|
}
|
|
224
279
|
}
|
|
225
280
|
|
|
226
281
|
recognition.onerror = (event) => {
|
|
227
282
|
const code = event?.error || 'unknown'
|
|
228
|
-
// no-speech 更像“没有听到”,不是系统故障。
|
|
229
283
|
if (code === 'no-speech') {
|
|
230
284
|
finish(new Error('没有听到您的声音,请再说一次。'))
|
|
231
285
|
return
|
|
@@ -235,30 +289,168 @@ export class SpeechService {
|
|
|
235
289
|
return
|
|
236
290
|
}
|
|
237
291
|
if (code === 'audio-capture') {
|
|
238
|
-
finish(new Error('
|
|
292
|
+
finish(new Error('没有检测到可用麦克风,或麦克风正在被其他程序占用。'))
|
|
239
293
|
return
|
|
240
294
|
}
|
|
241
295
|
if (code === 'network') {
|
|
242
296
|
finish(new Error('语音识别网络异常,请检查网络后再试。'))
|
|
243
297
|
return
|
|
244
298
|
}
|
|
299
|
+
if (code === 'aborted') {
|
|
300
|
+
// aborted 通常来自外部 stop/pause,不把它当成系统崩溃。
|
|
301
|
+
if (finalText.trim()) finish()
|
|
302
|
+
else finish(new Error('语音识别被中断,请再试一次。'))
|
|
303
|
+
return
|
|
304
|
+
}
|
|
245
305
|
finish(new Error(`语音识别失败:${code}`))
|
|
246
306
|
}
|
|
247
307
|
|
|
248
308
|
recognition.onend = () => {
|
|
249
|
-
finish()
|
|
309
|
+
if (finalText.trim()) finish()
|
|
310
|
+
else if (!settled) finish(new Error('语音识别结束但没有识别到内容,请再试一次。'))
|
|
250
311
|
}
|
|
251
312
|
|
|
252
313
|
try {
|
|
253
314
|
recognition.start()
|
|
254
315
|
this.recognition = recognition
|
|
255
316
|
this.listening = true
|
|
317
|
+
// 防止某些 Chrome 版本 start() 成功但迟迟没有 onstart,释放状态并让上层重试。
|
|
318
|
+
startTimer = window.setTimeout(() => {
|
|
319
|
+
if (!settled && !this.listening) {
|
|
320
|
+
try { recognition.stop() } catch (_) {}
|
|
321
|
+
finish(new Error('语音识别启动失败,请再试一次。'))
|
|
322
|
+
}
|
|
323
|
+
}, 1800)
|
|
256
324
|
} catch (error) {
|
|
257
325
|
finish(error instanceof Error ? error : new Error('语音识别启动失败'))
|
|
258
326
|
}
|
|
259
327
|
})
|
|
260
328
|
}
|
|
261
329
|
|
|
330
|
+
listenAfterWake({ silenceMs = 3000, retries = 1, onInterim = this.onInterim } = {}) {
|
|
331
|
+
if (!this.supported()) return Promise.reject(new Error('当前浏览器不支持语音识别,请使用 Chrome / Edge'))
|
|
332
|
+
|
|
333
|
+
const run = () => new Promise(async (resolve, reject) => {
|
|
334
|
+
try {
|
|
335
|
+
await this.requestMicrophonePermission()
|
|
336
|
+
} catch (error) {
|
|
337
|
+
reject(error instanceof Error ? error : new Error(String(error)))
|
|
338
|
+
return
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
let recognition
|
|
342
|
+
try {
|
|
343
|
+
recognition = this.createRecognition({ continuous: true })
|
|
344
|
+
} catch (error) {
|
|
345
|
+
reject(error)
|
|
346
|
+
return
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
let finalText = ''
|
|
350
|
+
let settled = false
|
|
351
|
+
let silenceTimer = null
|
|
352
|
+
let startTimer = null
|
|
353
|
+
|
|
354
|
+
const cleanup = () => {
|
|
355
|
+
if (silenceTimer) window.clearTimeout(silenceTimer)
|
|
356
|
+
if (startTimer) window.clearTimeout(startTimer)
|
|
357
|
+
this.listening = false
|
|
358
|
+
this.recognition = null
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
const finish = (error = null) => {
|
|
362
|
+
if (settled) return
|
|
363
|
+
settled = true
|
|
364
|
+
cleanup()
|
|
365
|
+
try { recognition.stop() } catch (_) {}
|
|
366
|
+
this.onEnd()
|
|
367
|
+
if (error) reject(error)
|
|
368
|
+
else resolve(finalText.trim())
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
const armSilenceTimer = () => {
|
|
372
|
+
if (silenceTimer) window.clearTimeout(silenceTimer)
|
|
373
|
+
silenceTimer = window.setTimeout(() => finish(), Math.max(1200, Number(silenceMs) || 3000))
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
recognition.onstart = () => {
|
|
377
|
+
this.listening = true
|
|
378
|
+
if (startTimer) window.clearTimeout(startTimer)
|
|
379
|
+
armSilenceTimer()
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
recognition.onresult = (event) => {
|
|
383
|
+
let interim = ''
|
|
384
|
+
let gotSpeech = false
|
|
385
|
+
for (let i = event.resultIndex; i < event.results.length; i += 1) {
|
|
386
|
+
const part = event.results[i][0]?.transcript || ''
|
|
387
|
+
if (part) gotSpeech = true
|
|
388
|
+
if (event.results[i].isFinal) {
|
|
389
|
+
finalText += part
|
|
390
|
+
this.onFinal(part)
|
|
391
|
+
} else {
|
|
392
|
+
interim += part
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
onInterim?.(interim)
|
|
396
|
+
this.onInterim(interim)
|
|
397
|
+
if (gotSpeech) armSilenceTimer()
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
recognition.onerror = (event) => {
|
|
401
|
+
const code = event?.error || 'unknown'
|
|
402
|
+
if (code === 'no-speech') {
|
|
403
|
+
// 3 秒无输入视为用户说完,不当成崩溃。
|
|
404
|
+
finish()
|
|
405
|
+
return
|
|
406
|
+
}
|
|
407
|
+
if (code === 'aborted' && finalText.trim()) {
|
|
408
|
+
finish()
|
|
409
|
+
return
|
|
410
|
+
}
|
|
411
|
+
if (code === 'not-allowed' || code === 'service-not-allowed') {
|
|
412
|
+
finish(new Error('麦克风权限被拒绝,请允许当前页面使用麦克风后再试。'))
|
|
413
|
+
return
|
|
414
|
+
}
|
|
415
|
+
if (code === 'audio-capture') {
|
|
416
|
+
finish(new Error('没有检测到可用麦克风,或麦克风正在被其他程序占用。'))
|
|
417
|
+
return
|
|
418
|
+
}
|
|
419
|
+
if (code === 'network') {
|
|
420
|
+
finish(new Error('语音识别网络异常,请稍后再试。'))
|
|
421
|
+
return
|
|
422
|
+
}
|
|
423
|
+
finish(new Error(`语音识别失败:${code}`))
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
recognition.onend = () => {
|
|
427
|
+
if (settled) return
|
|
428
|
+
if (finalText.trim()) finish()
|
|
429
|
+
else finish(new Error('语音识别结束但没有识别到内容,请再说一次。'))
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
try {
|
|
433
|
+
recognition.start()
|
|
434
|
+
this.recognition = recognition
|
|
435
|
+
this.listening = true
|
|
436
|
+
startTimer = window.setTimeout(() => {
|
|
437
|
+
if (!settled && !this.listening) finish(new Error('语音识别启动失败,请再试一次。'))
|
|
438
|
+
}, 1800)
|
|
439
|
+
} catch (error) {
|
|
440
|
+
finish(error instanceof Error ? error : new Error('语音识别启动失败'))
|
|
441
|
+
}
|
|
442
|
+
})
|
|
443
|
+
|
|
444
|
+
return run().catch(async (error) => {
|
|
445
|
+
const retryable = /启动失败|audio-capture|网络异常|network|aborted/i.test(String(error?.message || ''))
|
|
446
|
+
if (retryable && retries > 0) {
|
|
447
|
+
await new Promise((resolve) => window.setTimeout(resolve, 220))
|
|
448
|
+
return this.listenAfterWake({ silenceMs, retries: retries - 1, onInterim })
|
|
449
|
+
}
|
|
450
|
+
throw error
|
|
451
|
+
})
|
|
452
|
+
}
|
|
453
|
+
|
|
262
454
|
startWakeWordListener({ wakeWord = '你好小园', onWake, onError }) {
|
|
263
455
|
if (!this.supported()) return { stop: () => {}, pause: () => {}, resume: () => {} }
|
|
264
456
|
|