338 lines
6.7 KiB
Markdown
338 lines
6.7 KiB
Markdown
# 纯前端 TTS 功能使用说明
|
||
|
||
## 📋 方案概述
|
||
|
||
基于浏览器 **Web Speech API** 实现的纯前端文字转语音功能,**无需后端服务**,适合局域网环境使用。
|
||
|
||
### ✅ 优势
|
||
|
||
1. **零后端依赖**:完全在浏览器中运行,不需要服务器支持
|
||
2. **即开即用**:直接打开 HTML 文件即可使用
|
||
3. **跨平台**:支持 Windows、Linux、Mac
|
||
4. **响应式设计**:适配桌面和移动设备
|
||
5. **功能完整**:支持音量、语速、音调调节
|
||
|
||
---
|
||
|
||
## 🎯 使用方式
|
||
|
||
### 方式一:独立工具(推荐用于测试)
|
||
|
||
直接打开 `局域网TTS工具.html` 文件:
|
||
|
||
1. 双击打开 `局域网TTS工具.html`
|
||
2. 在文本框中输入要朗读的文字
|
||
3. 调整音量、语速、音调参数
|
||
4. 点击"开始朗读"按钮
|
||
|
||
**特点**:
|
||
- 无需任何配置
|
||
- 适合快速测试和演示
|
||
- 可以放在局域网服务器上供多人使用
|
||
|
||
### 方式二:Vue 组件集成(用于项目)
|
||
|
||
在 Vue 项目中使用 `TtsPlayer` 组件:
|
||
|
||
```vue
|
||
<template>
|
||
<div>
|
||
<!-- 题目内容 -->
|
||
<div class="question-content">{{ questionText }}</div>
|
||
|
||
<!-- TTS 播放器 -->
|
||
<TtsPlayer
|
||
:text="questionText"
|
||
lang="zh-CN"
|
||
@start="onTtsStart"
|
||
@end="onTtsEnd"
|
||
@stop="onTtsStop"
|
||
/>
|
||
</div>
|
||
</template>
|
||
|
||
<script>
|
||
import TtsPlayer from '@/components/Psychology/TtsPlayer.vue'
|
||
|
||
export default {
|
||
components: {
|
||
TtsPlayer
|
||
},
|
||
data() {
|
||
return {
|
||
questionText: '请根据您的实际情况,选择最符合的选项。'
|
||
}
|
||
},
|
||
methods: {
|
||
onTtsStart() {
|
||
console.log('开始朗读')
|
||
},
|
||
onTtsEnd() {
|
||
console.log('朗读完成')
|
||
},
|
||
onTtsStop() {
|
||
console.log('停止朗读')
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
```
|
||
|
||
---
|
||
|
||
## 📦 文件说明
|
||
|
||
### 1. `局域网TTS工具.html`
|
||
|
||
**位置**:项目根目录
|
||
**用途**:独立的 TTS 工具,可直接在浏览器中打开使用
|
||
|
||
**功能**:
|
||
- ✅ 文本输入和朗读
|
||
- ✅ 音量、语速、音调调节
|
||
- ✅ 预设文本快速填充
|
||
- ✅ 响应式设计,支持移动端
|
||
|
||
### 2. `xinli-ui/src/components/Psychology/TtsPlayer.vue`
|
||
|
||
**位置**:Vue 项目组件目录
|
||
**用途**:可复用的 TTS 组件,集成到 Vue 项目中
|
||
|
||
**Props**:
|
||
- `text` (String): 要朗读的文本
|
||
- `lang` (String): 语言设置,默认 `zh-CN`
|
||
|
||
**Events**:
|
||
- `@start`: 开始朗读时触发
|
||
- `@end`: 朗读完成时触发
|
||
- `@stop`: 停止朗读时触发
|
||
- `@error`: 朗读出错时触发
|
||
|
||
---
|
||
|
||
## 🔧 在问卷答题页面中集成
|
||
|
||
### 步骤 1:导入组件
|
||
|
||
在 `xinli-ui/src/views/psychology/questionnaire/taking.vue` 中:
|
||
|
||
```vue
|
||
<script>
|
||
import TtsPlayer from '@/components/Psychology/TtsPlayer.vue'
|
||
|
||
export default {
|
||
components: {
|
||
TtsPlayer
|
||
},
|
||
// ...
|
||
}
|
||
</script>
|
||
```
|
||
|
||
### 步骤 2:添加 TTS 播放器
|
||
|
||
在题目显示区域添加 TTS 组件:
|
||
|
||
```vue
|
||
<template>
|
||
<el-card shadow="never" class="question-card" v-if="currentItem">
|
||
<div class="question-number">第 {{ currentIndex + 1 }} 题</div>
|
||
<div class="question-content">{{ currentItem.itemContent }}</div>
|
||
|
||
<!-- 添加 TTS 播放器 -->
|
||
<div style="margin: 15px 0;">
|
||
<TtsPlayer :text="currentItem.itemContent" />
|
||
</div>
|
||
|
||
<!-- 其他内容... -->
|
||
</el-card>
|
||
</template>
|
||
```
|
||
|
||
### 步骤 3:可选 - 自动朗读
|
||
|
||
如果需要自动朗读题目,可以在切换题目时触发:
|
||
|
||
```vue
|
||
<script>
|
||
export default {
|
||
watch: {
|
||
currentItem(newItem) {
|
||
if (newItem && this.autoRead) {
|
||
// 延迟一下,确保组件已渲染
|
||
this.$nextTick(() => {
|
||
this.$refs.ttsPlayer?.speakText()
|
||
})
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
```
|
||
|
||
---
|
||
|
||
## 🌐 浏览器兼容性
|
||
|
||
### ✅ 完全支持
|
||
|
||
- **Chrome** 33+(推荐)
|
||
- **Edge** 14+
|
||
- **Safari** 7+
|
||
- **Opera** 20+
|
||
|
||
### ⚠️ 部分支持
|
||
|
||
- **Firefox**:需要手动启用 `media.webspeech.synth.enabled`
|
||
|
||
### ❌ 不支持
|
||
|
||
- **IE** 11 及以下版本
|
||
|
||
---
|
||
|
||
## 🎨 自定义配置
|
||
|
||
### 修改默认参数
|
||
|
||
在 `TtsPlayer.vue` 组件中:
|
||
|
||
```javascript
|
||
data() {
|
||
return {
|
||
volume: 1.0, // 默认音量(0-1)
|
||
rate: 1.0, // 默认语速(0.5-2)
|
||
pitch: 1.0, // 默认音调(0.5-2)
|
||
}
|
||
}
|
||
```
|
||
|
||
### 选择语音
|
||
|
||
```javascript
|
||
// 获取可用语音列表
|
||
const voices = this.synth.getVoices()
|
||
console.log(voices)
|
||
|
||
// 选择特定语音
|
||
const chineseVoice = voices.find(voice =>
|
||
voice.name.includes('Chinese') ||
|
||
voice.lang === 'zh-CN'
|
||
)
|
||
if (chineseVoice) {
|
||
this.utterance.voice = chineseVoice
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 📝 使用示例
|
||
|
||
### 示例 1:基本使用
|
||
|
||
```vue
|
||
<TtsPlayer text="欢迎使用AI心理健康测评系统" />
|
||
```
|
||
|
||
### 示例 2:监听事件
|
||
|
||
```vue
|
||
<TtsPlayer
|
||
:text="questionText"
|
||
@start="handleTtsStart"
|
||
@end="handleTtsEnd"
|
||
/>
|
||
```
|
||
|
||
### 示例 3:动态文本
|
||
|
||
```vue
|
||
<TtsPlayer :text="currentQuestion.content" />
|
||
```
|
||
|
||
---
|
||
|
||
## ⚠️ 注意事项
|
||
|
||
1. **浏览器限制**:
|
||
- 某些浏览器需要用户交互后才能播放语音
|
||
- 建议在用户点击按钮后触发朗读
|
||
|
||
2. **语音质量**:
|
||
- 不同浏览器的语音质量可能不同
|
||
- Chrome 的中文语音质量通常较好
|
||
|
||
3. **网络环境**:
|
||
- 完全离线可用,不需要网络连接
|
||
- 适合局域网环境
|
||
|
||
4. **性能考虑**:
|
||
- 长文本建议分段朗读
|
||
- 避免同时播放多个语音
|
||
|
||
---
|
||
|
||
## 🐛 常见问题
|
||
|
||
### Q: 为什么没有声音?
|
||
|
||
**A**: 检查以下几点:
|
||
1. 浏览器是否支持 Web Speech API
|
||
2. 系统音量是否开启
|
||
3. 浏览器是否允许自动播放音频
|
||
4. 是否在用户交互后触发(某些浏览器要求)
|
||
|
||
### Q: 语音质量不好?
|
||
|
||
**A**:
|
||
1. 使用 Chrome 浏览器(语音质量最好)
|
||
2. 调整语速和音调参数
|
||
3. 检查系统语音设置
|
||
|
||
### Q: 如何切换语音?
|
||
|
||
**A**:
|
||
```javascript
|
||
const voices = speechSynthesis.getVoices()
|
||
const voice = voices.find(v => v.name.includes('Microsoft'))
|
||
utterance.voice = voice
|
||
```
|
||
|
||
---
|
||
|
||
## 📚 技术文档
|
||
|
||
### Web Speech API 参考
|
||
|
||
- [MDN - SpeechSynthesis](https://developer.mozilla.org/zh-CN/docs/Web/API/SpeechSynthesis)
|
||
- [MDN - SpeechSynthesisUtterance](https://developer.mozilla.org/zh-CN/docs/Web/API/SpeechSynthesisUtterance)
|
||
|
||
### API 参数说明
|
||
|
||
| 参数 | 类型 | 范围 | 说明 |
|
||
|------|------|------|------|
|
||
| `lang` | String | - | 语言代码,如 `zh-CN` |
|
||
| `volume` | Number | 0-1 | 音量大小 |
|
||
| `rate` | Number | 0.5-2 | 语速倍数 |
|
||
| `pitch` | Number | 0.5-2 | 音调高低 |
|
||
| `voice` | SpeechSynthesisVoice | - | 语音对象 |
|
||
|
||
---
|
||
|
||
## ✨ 功能特性
|
||
|
||
- ✅ 纯前端实现,无需后端
|
||
- ✅ 支持中文语音合成
|
||
- ✅ 可调节音量、语速、音调
|
||
- ✅ 响应式设计,支持移动端
|
||
- ✅ 预设文本快速填充
|
||
- ✅ 事件监听支持
|
||
- ✅ 错误处理机制
|
||
|
||
---
|
||
|
||
**创建时间**:2025-01-27
|
||
**版本**:1.0.0
|
||
**状态**:✅ 可用
|
||
|