xinli/语音读题功能优化说明.md
2025-12-02 15:12:55 +08:00

259 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 语音读题功能优化说明
## 问题修复
### 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.**交互优化** - 更好的视觉反馈和用户体验
语音读题功能现在更加实用和流畅,用户可以根据需要选择不同的朗读方式!