欢迎加入开源鸿蒙PC社区:
atomgit仓库地址: https://atomgit.com/m0_66062719/xiguandaka


鸿蒙TTS技术展示
一、功能概述
在甄嬛人物日志应用中,我们成功集成了TTS(文本转语音)功能,为用户提供沉浸式的语音朗读体验。本指南将详细介绍在鸿蒙PC Electron框架下实现这一功能的完整技术方案。
1.1 功能定位
| 功能模块 | 技术实现 | 核心能力 |
|---|---|---|
| 语音合成 | Web Speech API | 浏览器原生语音合成引擎 |
| 播放控制 | SpeechSynthesis接口 | 播放/暂停/停止/继续 |
| 语速调节 | rate参数控制 | 0.5x - 1.5x五档可调 |
| 状态反馈 | DOM实时更新 | 朗读状态可视化显示 |
1.2 技术优势
- 跨平台兼容:基于Web标准API,天然支持多平台
- 零额外依赖:无需引入第三方语音服务
- 响应式设计:适配不同屏幕尺寸
- 用户体验友好:直观的控制界面和状态反馈
🛠️ 技术栈
跨平台框架:Electron(桌面端)+ OpenHarmony(鸿蒙系统)
前端框架:原生 HTML5 + CSS3 +
JavaScript Web Engine:Web组件嵌入鸿蒙应用
响应式设计:支持移动端和桌面端
二、技术架构设计
2.1 整体架构
┌─────────────────────────────────────────────────────────────┐
│ 表示层 (UI) │
│ TTS控制栏:播放按钮、暂停按钮、停止按钮、语速选择、状态显示 │
├─────────────────────────────────────────────────────────────┤
│ 业务逻辑层 │
│ ZhenHuanApp类:TTS状态管理、语音合成控制、UI更新 │
├─────────────────────────────────────────────────────────────┤
│ 技术层 │
│ Web Speech API:SpeechSynthesis + SpeechSynthesisUtterance│
└─────────────────────────────────────────────────────────────┘
2.2 核心组件交互流程
用户点击播放按钮
│
▼
┌──────────────────┐
│ ttsPlayText() │
└────────┬─────────┘
│
▼
┌──────────────────┐ ┌─────────────────────────┐
│ 创建Utterance │────▶│ SpeechSynthesis.speak()│
│ 设置语言/语速 │ └───────────┬─────────────┘
└──────────────────┘ │
▼
┌─────────────────────────────────────┐
│ 事件监听:onstart/onend/onerror │
│ /onpause/onresume │
└───────────────────┬─────────────────┘
│
▼
┌───────────────────────┐
│ updateTTSStatus() │
│ 更新UI状态显示 │
└───────────────────────┘
三、核心代码实现
3.1 HTML结构设计
html
<!-- TTS控制栏 -->
<div class="tts-controls">
<button class="tts-btn" id="ttsPlay" title="播放">▶️ 朗读</button>
<button class="tts-btn" id="ttsPause" title="暂停">⏸️ 暂停</button>
<button class="tts-btn" id="ttsStop" title="停止">⏹️ 停止</button>
<div class="tts-speed">
<span>语速:</span>
<select id="ttsRate">
<option value="0.5">0.5x</option>
<option value="0.75">0.75x</option>
<option value="1" selected>1.0x</option>
<option value="1.25">1.25x</option>
<option value="1.5">1.5x</option>
</select>
</div>
<div class="tts-status" id="ttsStatus">就绪</div>
</div>
设计要点:
- 使用语义化HTML标签
- 添加title属性增强可访问性
- 语速选择提供五档调节
3.2 CSS样式设计
css
.tts-controls {
display: flex;
align-items: center;
gap: 15px;
background: rgba(255, 255, 255, 0.95);
border-radius: 15px;
padding: 15px 20px;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.08);
flex-wrap: wrap;
justify-content: center;
}
.tts-btn {
padding: 10px 20px;
background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%);
color: #fff;
border: none;
border-radius: 20px;
cursor: pointer;
transition: all 0.3s ease;
}
.tts-btn:hover {
transform: translateY(-2px);
box-shadow: 0 4px 15px rgba(233, 30, 99, 0.4);
}
.tts-status {
padding: 8px 15px;
background: #fce4ec;
border-radius: 15px;
color: #880e4f;
}
.tts-status.speaking {
background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%);
color: #fff;
animation: pulse 1.5s infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.7; }
}
设计亮点:
- 粉色渐变主题,与应用整体风格一致
- 悬停动画效果提升交互体验
- 朗读状态使用脉冲动画提示用户
3.3 JavaScript核心逻辑
3.3.1 状态初始化
javascript
class ZhenHuanApp {
constructor() {
// ... 其他初始化
this.ttsUtterance = null; // 语音合成实例
this.ttsRateValue = 1; // 语速(默认1倍)
this.isSpeaking = false; // 是否正在朗读
this.init();
}
}
3.3.2 DOM引用初始化
javascript
initDOMReferences() {
// ... 其他DOM引用
this.ttsPlay = document.getElementById('ttsPlay');
this.ttsPause = document.getElementById('ttsPause');
this.ttsStop = document.getElementById('ttsStop');
this.ttsRate = document.getElementById('ttsRate');
this.ttsStatus = document.getElementById('ttsStatus');
}
3.3.3 事件绑定
javascript
bindEventListeners() {
// ... 其他事件绑定
this.ttsPlay.addEventListener('click', () => {
this.ttsPlayText();
});
this.ttsPause.addEventListener('click', () => {
this.ttsPauseText();
});
this.ttsStop.addEventListener('click', () => {
this.ttsStopText();
});
this.ttsRate.addEventListener('change', (e) => {
this.ttsRateValue = parseFloat(e.target.value);
});
}
3.3.4 核心播放方法
javascript
ttsPlayText() {
if ('speechSynthesis' in window) {
// 如果正在播放,继续朗读
if (this.isSpeaking) {
window.speechSynthesis.resume();
this.updateTTSStatus('继续朗读...');
return;
}
// 获取当前人物数据
const char = this.characters[this.currentCharacter];
const text = `现在为您介绍${char.name}。${char.description}。`;
// 创建语音合成实例
this.ttsUtterance = new SpeechSynthesisUtterance(text);
this.ttsUtterance.lang = 'zh-CN'; // 中文语言
this.ttsUtterance.rate = this.ttsRateValue; // 语速
this.ttsUtterance.pitch = 1; // 音调
this.ttsUtterance.volume = 1; // 音量
// 事件监听
this.ttsUtterance.onstart = () => {
this.isSpeaking = true;
this.updateTTSStatus('正在朗读...');
};
this.ttsUtterance.onend = () => {
this.isSpeaking = false;
this.updateTTSStatus('朗读完成');
};
this.ttsUtterance.onerror = (event) => {
this.isSpeaking = false;
this.updateTTSStatus('朗读出错: ' + event.error);
};
this.ttsUtterance.onpause = () => {
this.updateTTSStatus('已暂停');
};
this.ttsUtterance.onresume = () => {
this.updateTTSStatus('继续朗读...');
};
// 开始朗读
window.speechSynthesis.speak(this.ttsUtterance);
} else {
this.updateTTSStatus('您的浏览器不支持语音朗读');
}
}
3.3.5 控制方法
javascript
ttsPauseText() {
if ('speechSynthesis' in window) {
window.speechSynthesis.pause();
this.updateTTSStatus('已暂停');
}
}
ttsStopText() {
if ('speechSynthesis' in window) {
window.speechSynthesis.cancel();
this.isSpeaking = false;
this.updateTTSStatus('已停止');
}
}
updateTTSStatus(message) {
this.ttsStatus.textContent = message;
if (message.includes('正在朗读') || message.includes('继续朗读')) {
this.ttsStatus.classList.add('speaking');
} else {
this.ttsStatus.classList.remove('speaking');
}
}
四、Web Speech API详解
4.1 API核心接口
| 接口 | 作用 | 关键方法/属性 |
|---|---|---|
SpeechSynthesis |
语音合成控制器 | speak(), pause(), resume(), cancel() |
SpeechSynthesisUtterance |
语音合成实例 | lang, rate, pitch, volume |
4.2 SpeechSynthesisUtterance属性
| 属性 | 类型 | 说明 | 默认值 |
|---|---|---|---|
lang |
string | 语言代码 | 浏览器默认语言 |
rate |
number | 语速(0.1-10) | 1 |
pitch |
number | 音调(0-2) | 1 |
volume |
number | 音量(0-1) | 1 |
text |
string | 要合成的文本 | 空字符串 |
4.3 事件回调
| 事件 | 触发时机 |
|---|---|
onstart |
开始合成时 |
onend |
合成结束时 |
onerror |
发生错误时 |
onpause |
暂停时 |
onresume |
恢复时 |
onboundary |
到达单词/句子边界时 |
五、鸿蒙PC Electron框架适配
5.1 框架架构
┌─────────────────────────────────────────────────────────────┐
│ HarmonyOS PC 应用层 │
│ Electron Web Engine │
├─────────────────────────────────────────────────────────────┤
│ Web 应用层 │
│ HTML + CSS + JavaScript + Web Speech API │
├─────────────────────────────────────────────────────────────┤
│ 系统层 │
│ 鸿蒙操作系统 + Chromium 渲染引擎 │
└─────────────────────────────────────────────────────────────┘
5.2 目录结构
electron-openharmony-vue3/
├── ohos_hap/
│ ├── web_engine/
│ │ ├── src/
│ │ │ └── main/
│ │ │ ├── ets/ # ArkTS 代码
│ │ │ └── resources/
│ │ │ └── resfile/
│ │ │ └── resources/
│ │ │ └── app/
│ │ │ ├── index.html # 主页面
│ │ │ ├── style.css # 样式文件
│ │ │ └── app.js # 核心逻辑
│ └── oh_modules/ # 依赖模块
└── docs/ # 文档目录
5.3 关键配置
在 module.json5 中确保Web能力正确配置:
json
{
"module": {
"name": "web_engine",
"type": "web",
"description": "Web Engine Module",
"mainElement": "Index",
"deviceTypes": [
"phone",
"tablet",
"pc"
],
"abilities": [
{
"name": "WebAbility",
"srcEntry": "./ets/ability/WebAbility.ets",
"description": "Web Ability",
"icon": "$media:icon",
"label": "甄嬛人物日志",
"launchType": "standard"
}
]
}
}
六、兼容性处理
6.1 浏览器兼容性检查
javascript
if ('speechSynthesis' in window) {
// 支持语音合成
console.log('浏览器支持Web Speech API');
} else {
// 不支持时的降级处理
console.log('浏览器不支持语音合成');
this.updateTTSStatus('您的浏览器不支持语音朗读');
}
6.2 支持的浏览器
| 浏览器 | 版本要求 | 支持情况 |
|---|---|---|
| Chrome | 33+ | ✅ 完全支持 |
| Edge | 12+ | ✅ 完全支持 |
| Safari | 7+ | ✅ 完全支持 |
| Firefox | 49+ | ✅ 部分支持 |
| Opera | 21+ | ✅ 完全支持 |
6.3 注意事项
- HTTPS要求:部分浏览器要求在HTTPS环境下才能使用语音合成
- 语言支持:需要确保系统安装了相应的语言包
- 网络依赖:某些浏览器的语音合成需要网络连接
七、测试与验证
7.1 测试用例
| 测试场景 | 预期结果 |
|---|---|
| 点击播放按钮 | 开始朗读当前人物简介,状态显示"正在朗读" |
| 点击暂停按钮 | 暂停朗读,状态显示"已暂停" |
| 点击停止按钮 | 停止朗读,状态显示"已停止" |
| 调整语速 | 朗读速度相应变化 |
| 切换人物后播放 | 朗读新人物的简介 |
| 朗读完成 | 状态自动变为"朗读完成" |
7.2 调试技巧
javascript
// 在控制台查看可用语音
window.speechSynthesis.getVoices().forEach(voice => {
console.log(`语音: ${voice.name}, 语言: ${voice.lang}`);
});
// 手动测试语音合成
const testUtterance = new SpeechSynthesisUtterance('测试语音合成');
testUtterance.lang = 'zh-CN';
window.speechSynthesis.speak(testUtterance);
八、性能优化
8.1 资源管理
javascript
// 页面卸载时清理资源
window.addEventListener('beforeunload', () => {
if ('speechSynthesis' in window) {
window.speechSynthesis.cancel();
}
});
8.2 状态管理优化
javascript
// 使用单一状态标志管理朗读状态
isSpeaking: false, // 避免多个状态变量导致不一致
// 事件回调中统一更新状态
this.ttsUtterance.onend = () => {
this.isSpeaking = false;
this.updateTTSStatus('朗读完成');
};
九、扩展功能建议
9.1 多语音选择
javascript
// 获取可用语音列表
const voices = window.speechSynthesis.getVoices();
// 创建语音选择下拉框
const voiceSelect = document.createElement('select');
voices.forEach(voice => {
const option = document.createElement('option');
option.value = voice.name;
option.textContent = voice.name;
voiceSelect.appendChild(option);
});
// 设置语音
this.ttsUtterance.voice = voices.find(v => v.lang === 'zh-CN');
9.2 文本分段朗读
javascript
// 长文本分段处理
function speakLongText(text) {
const chunks = text.split('。');
let currentIndex = 0;
function speakNext() {
if (currentIndex < chunks.length) {
const utterance = new SpeechSynthesisUtterance(chunks[currentIndex] + '。');
utterance.onend = () => {
currentIndex++;
speakNext();
};
window.speechSynthesis.speak(utterance);
}
}
speakNext();
}
9.3 进度显示
javascript
// 实时显示朗读进度
this.ttsUtterance.onboundary = (event) => {
const progress = (event.charIndex / text.length) * 100;
progressBar.style.width = `${progress}%`;
};
十、总结
10.1 技术成果
成功实现了基于Web Speech API的TTS功能,主要完成:
- 完整的播放控制:播放/暂停/停止/继续
- 语速调节:五档语速可选
- 状态反馈:实时显示朗读状态
- 错误处理:完善的异常捕获机制
- 鸿蒙适配:兼容鸿蒙PC Electron框架
10.2 技术价值
- 提升可访问性:为视觉障碍用户提供语音访问能力
- 丰富交互体验:多模态交互方式
- 技术先进性:使用浏览器原生API,轻量高效
10.3 未来展望
后续可扩展功能:
- 多语音选择
- 文本高亮跟随
- 朗读进度显示
- 自定义语音参数
附录:完整代码清单
A.1 入口文件
javascript
let app;
document.addEventListener('DOMContentLoaded', () => {
app = new ZhenHuanApp();
});
A.2 关键方法汇总
| 方法名 | 功能说明 |
|---|---|
ttsPlayText() |
开始/继续朗读 |
ttsPauseText() |
暂停朗读 |
ttsStopText() |
停止朗读 |
updateTTSStatus() |
更新状态显示 |