xinli/语音读题功能优化说明.md

259 lines
6.2 KiB
Markdown
Raw Normal View History

2025-12-02 15:12:55 +08:00
# 语音读题功能优化说明
## 问题修复
### 1. 编译错误修复 ✅
**文件**: `ry-xinli-system/src/main/java/com/ddnai/system/service/impl/SysUserServiceImpl.java`
**问题**: 缺少 `Map` 类的导入
**修复**:
```java
import java.util.Map;
```
## 功能优化
### 2. 语音播放参数优化 ✅
**问题描述**:
- 声音很小
- 朗读速度过慢
**优化方案**:
#### 音量提升
```javascript
// 优化前
this.currentUtterance.volume = 1.0; // 已经是最大值
// 优化后 - 确保使用最大音量
this.currentUtterance.volume = 1.0; // 最大音量
```
#### 语速优化
```javascript
// 优化前
this.currentUtterance.rate = 0.9; // 太慢
// 优化后
this.currentUtterance.rate = 1.2; // 正常语速,稍快
```
### 3. 新增"朗读全部"功能 ✅
**功能描述**:
点击后一次性朗读题目和所有选项
**实现文件**:
- `xinli-ui/src/views/psychology/assessment/taking.vue` (量表测评)
- `xinli-ui/src/views/psychology/questionnaire/taking.vue` (问卷答题)
**UI设计**:
```
题目旁边两个按钮:
┌────────────┬────────────┐
│ 🎤 朗读全部 │ 🔊 朗读题干 │
└────────────┴────────────┘
```
**按钮说明**:
- **朗读全部** (绿色图标): 朗读题目 + 所有选项
- **朗读题干** (蓝色图标): 只朗读题目内容
**代码实现**:
```javascript
/** 朗读当前题目和所有选项 */
speakCurrentQuestion() {
if (!this.isTtsSupported || !this.currentItem) {
this.$message.warning('浏览器不支持语音播放功能');
return;
}
// 如果正在播放,则停止
if (this.isSpeaking) {
this.stopSpeaking();
return;
}
// 构建完整文本:题目 + 所有选项
let fullText = this.currentItem.itemContent.trim();
if (this.currentOptions && this.currentOptions.length > 0) {
fullText += '。选项:';
this.currentOptions.forEach((option, index) => {
const optionCode = option.optionCode || String.fromCharCode(65 + index);
fullText += `${optionCode}、${option.optionContent}。`;
});
}
// 调用朗读
this.speakText(fullText);
}
```
### 4. 选项独立朗读按钮 ✅
**功能**: 每个选项旁边都有独立的朗读按钮
**特点**:
- 点击选项旁边的按钮,只朗读该选项内容
- 支持单选、多选、判断题等所有题型
- 播放时按钮显示暂停图标
### 5. UI交互优化 ✅
#### 播放状态指示
```css
/* 播放时的脉冲动画 */
.tts-btn-all.speaking, .tts-btn.speaking {
animation: pulse 1.5s ease-in-out infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.6; }
}
```
#### 悬停效果
```css
.tts-btn-all:hover:not(:disabled),
.tts-btn:hover:not(:disabled) {
background-color: #f5f7fa;
transform: scale(1.05);
}
```
#### 禁用状态
```css
.tts-btn:disabled, .tts-btn-all:disabled {
color: #c0c4cc;
cursor: not-allowed;
opacity: 0.5;
}
```
## 修改文件清单
### 后端
1. `ry-xinli-system/src/main/java/com/ddnai/system/service/impl/SysUserServiceImpl.java`
- 添加 `Map` 导入
### 前端 - 量表测评
2. `xinli-ui/src/views/psychology/assessment/taking.vue`
- 添加"朗读全部"按钮
- 优化语速参数0.9 → 1.2
- 新增 `speakCurrentQuestion()` 方法
- 添加播放状态标识 `isSpeaking`
- 优化样式布局
### 前端 - 问卷答题
3. `xinli-ui/src/views/psychology/questionnaire/taking.vue`
- 添加"朗读全部"按钮
- 优化语速参数1.0 → 1.2
- 新增 `speakCurrentQuestion()` 方法
- 添加播放状态标识 `isSpeaking`
- 优化样式布局
## 功能特性
### ✅ 音量优化
- 使用最大音量 (1.0)
- 确保声音清晰可听
### ✅ 语速优化
- 从 0.9/1.0 提升到 1.2
- 更自然流畅的阅读速度
- 避免拖沓感
### ✅ 智能朗读
- **朗读全部**: 题目 + 所有选项(完整体验)
- **朗读题干**: 只朗读题目(快速浏览)
- **选项朗读**: 独立朗读每个选项(精准控制)
### ✅ 交互友好
- 播放时显示暂停图标
- 点击暂停按钮停止播放
- 悬停时按钮放大动画
- 播放时脉冲动画提示
### ✅ 浏览器兼容
- 自动检测浏览器支持
- 优先选择中文语音引擎
- 不支持时禁用按钮
## 使用说明
### 量表测评/问卷答题
#### 方式1: 朗读全部
1. 点击题目旁的 **"🎤 朗读全部"** 按钮
2. 系统依次朗读:题目内容 → 选项A → 选项B → ...
3. 再次点击可停止播放
#### 方式2: 朗读题干
1. 点击题目旁的 **"🔊 朗读题干"** 按钮
2. 系统只朗读题目内容
3. 再次点击可停止播放
#### 方式3: 朗读单个选项
1. 点击选项旁边的 **🔊** 图标
2. 系统只朗读该选项内容
3. 适合需要反复听某个选项的场景
## 技术说明
### 语音引擎
使用浏览器内置的 **Web Speech API**
### 支持的浏览器
- Chrome 33+
- Edge 14+
- Safari 7+
- Firefox 49+
### 语音参数
```javascript
{
lang: 'zh-CN', // 中文
volume: 1.0, // 最大音量
rate: 1.2, // 语速稍快
pitch: 1.0 // 正常音调
}
```
## 性能优化
### 停止机制
- 切换题目时自动停止当前播放
- 点击播放按钮时先停止再播放
- 组件销毁时自动停止
### 错误处理
- 浏览器不支持时禁用功能
- 播放失败时静默处理
- 已开始播放后忽略非致命错误
## 未来优化方向
1. **语速调节**: 允许用户自定义语速0.5-2.0
2. **音量调节**: 添加音量滑块
3. **语音选择**: 支持多种语音引擎切换
4. **快捷键**: 支持键盘快捷键控制(如空格键播放/暂停)
5. **进度显示**: 显示当前朗读进度
6. **自动播放**: 支持切换题目时自动朗读
7. **离线语音**: 集成离线TTS引擎
## 总结
本次优化主要解决了:
1.**编译错误** - 添加缺失的导入
2.**音量问题** - 确保使用最大音量
3.**语速问题** - 优化语速从慢速提升到正常偏快
4.**功能增强** - 新增"朗读全部"功能
5.**交互优化** - 更好的视觉反馈和用户体验
语音读题功能现在更加实用和流畅,用户可以根据需要选择不同的朗读方式!