欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net
一、项目概述
运行效果图




1.1 应用简介
声音情绪日记是一款创新的健康管理应用,通过声音记录用户的情绪状态。用户无需打字,只需通过语音记录日常心情,AI会分析语音中的情绪特征,生成情绪曲线和分析报告,帮助用户了解自己的内心变化。应用以柔和的紫色为主色调,象征内心的平静与探索,涵盖声音录制、情绪分析、数据统计、个人中心四大模块。
用户可以通过语音记录每日心情,系统会自动分析情绪类型和强度,生成可视化的情绪曲线,提供情绪变化趋势分析和心理健康建议。应用还支持情绪标签管理、心情回顾、数据导出等功能,帮助用户建立健康的情绪管理习惯。
1.2 核心功能
| 功能模块 | 功能描述 | 实现方式 |
|---|---|---|
| 声音录制 | 高质量语音录制 | 音频录制API |
| 情绪分析 | AI情绪识别与分析 | 机器学习模型 |
| 数据统计 | 情绪数据可视化 | 图表库 |
| 情绪曲线 | 情绪变化趋势图 | 时间序列分析 |
| 智能建议 | 基于情绪的健康建议 | 规则引擎 |
| 数据导出 | 情绪数据导出 | 数据导出功能 |
1.3 情绪类型定义
| 序号 | 情绪类型 | Emoji | 色值 | 描述 |
|---|---|---|---|---|
| 1 | 开心 | 😊 | #4CAF50 | 快乐、愉悦、满足 |
| 2 | 平静 | 😌 | #2196F3 | 平静、放松、安心 |
| 3 | 焦虑 | 😰 | #FF9800 | 焦虑、紧张、不安 |
| 4 | 悲伤 | 😢 | #9C27B0 | 悲伤、难过、失落 |
| 5 | 愤怒 | 😠 | #F44336 | 愤怒、烦躁、不满 |
| 6 | 困惑 | 😕 | #607D8B | 困惑、迷茫、不确定 |
1.4 情绪强度等级
| 序号 | 强度等级 | Emoji | 数值范围 | 描述 |
|---|---|---|---|---|
| 1 | 轻微 | 🌱 | 0.1-0.3 | 情绪较弱,影响小 |
| 2 | 中等 | 🌿 | 0.3-0.6 | 情绪明显,有一定影响 |
| 3 | 强烈 | 🌳 | 0.6-0.8 | 情绪强烈,影响较大 |
| 4 | 极端 | 🌲 | 0.8-1.0 | 情绪剧烈,影响严重 |
1.5 情绪标签定义
| 序号 | 标签名称 | Emoji | 相关情绪 | 描述 |
|---|---|---|---|---|
| 1 | 工作压力 | 💼 | 焦虑、愤怒 | 工作相关的压力 |
| 2 | 人际关系 | 🤝 | 悲伤、困惑 | 人际互动问题 |
| 3 | 健康问题 | 🩺 | 焦虑、悲伤 | 身体或心理健康 |
| 4 | 生活事件 | 🎉 | 开心、悲伤 | 生活中的重大事件 |
| 5 | 环境因素 | 🌍 | 平静、焦虑 | 环境变化影响 |
| 6 | 自我成长 | 📈 | 开心、困惑 | 个人发展相关 |
1.6 技术栈
| 技术领域 | 技术选型 | 版本要求 |
|---|---|---|
| 开发框架 | Flutter | >= 3.0.0 |
| 编程语言 | Dart | >= 2.17.0 |
| 音频录制 | record | >= 5.0.0 |
| 情绪分析 | 机器学习模型 | - |
| 数据可视化 | charts_flutter | >= 0.12.0 |
| 本地存储 | shared_preferences | >= 2.0.0 |
| 设计规范 | Material Design 3 | - |
| 目标平台 | 鸿蒙OS / iOS / Android | API 21+ |
1.7 项目结构
lib/
└── main_sound_emotion_diary.dart
├── SoundEmotionDiaryApp # 应用入口
├── EmotionType # 情绪类型枚举
├── EmotionIntensity # 情绪强度枚举
├── EmotionTag # 情绪标签枚举
├── EmotionEntry # 情绪记录模型
├── EmotionAnalysis # 情绪分析模型
├── SoundEmotionDiaryHomePage # 主页面(底部导航)
├── _buildRecordPage # 记录页面
├── _buildAnalysisPage # 分析页面
├── _buildStatisticsPage # 统计页面
├── _buildProfilePage # 个人页面
├── EmotionWavePainter # 情绪波形绘制器
└── EmotionChartWidget # 情绪图表组件
二、系统架构
2.1 整体架构图
Data Layer
Business Layer
Presentation Layer
主页面
SoundEmotionDiaryHomePage
记录页
分析页
统计页
个人页
录音界面
标签选择
保存记录
情绪曲线
分析报告
趋势分析
数据统计
情绪分布
导出数据
个人设置
隐私设置
关于应用
录音管理器
RecordManager
情绪分析器
EmotionAnalyzer
数据处理器
DataProcessor
建议引擎
SuggestionEngine
EmotionEntry
情绪记录
EmotionAnalysis
情绪分析
UserData
用户数据
SettingData
设置数据
2.2 类图设计
has
has
has
analyzes
SoundEmotionDiaryApp
+Widget build()
<<enumeration>>
EmotionType
+String label
+String emoji
+Color color
+happy()
+calm()
+anxious()
+sad()
+angry()
+confused()
<<enumeration>>
EmotionIntensity
+String label
+String emoji
+double minValue
+double maxValue
+mild()
+moderate()
+strong()
+extreme()
<<enumeration>>
EmotionTag
+String label
+String emoji
+List<EmotionType> relatedEmotions
+work()
+relationship()
+health()
+lifeEvent()
+environment()
+selfGrowth()
EmotionEntry
+String id
+String audioPath
+EmotionType emotion
+EmotionIntensity intensity
+List<EmotionTag> tags
+String notes
+DateTime timestamp
EmotionAnalysis
+String entryId
+Map<EmotionType, double> emotionScores
+EmotionType dominantEmotion
+double overallMood
+String suggestion
+DateTime analyzedAt
2.3 页面导航流程
记录
分析
统计
我的
应用启动
记录页
底部导航
录音界面
情绪曲线
数据统计
个人中心
开始录音
停止录音
AI分析
显示情绪
添加标签
保存记录
查看趋势
分析报告
健康建议
情绪分布
数据导出
个人设置
隐私管理
2.4 情绪记录与分析流程
分析页 数据处理器 情绪分析器 录音管理器 记录页 用户 分析页 数据处理器 情绪分析器 录音管理器 记录页 用户 点击录音按钮 开始录音 录音中... 停止录音 停止录音 返回音频文件 分析情绪 返回情绪分析结果 添加标签和备注 保存情绪记录 保存成功 查看情绪曲线 获取历史数据 返回情绪数据 显示情绪曲线
三、核心模块设计
3.1 数据模型设计
3.1.1 情绪类型枚举 (EmotionType)
dart
enum EmotionType {
happy(
label: '开心',
emoji: '😊',
color: Color(0xFF4CAF50),
description: '快乐、愉悦、满足',
),
calm(
label: '平静',
emoji: '😌',
color: Color(0xFF2196F3),
description: '平静、放松、安心',
),
anxious(
label: '焦虑',
emoji: '😰',
color: Color(0xFFFF9800),
description: '焦虑、紧张、不安',
),
sad(
label: '悲伤',
emoji: '😢',
color: Color(0xFF9C27B0),
description: '悲伤、难过、失落',
),
angry(
label: '愤怒',
emoji: '😠',
color: Color(0xFFF44336),
description: '愤怒、烦躁、不满',
),
confused(
label: '困惑',
emoji: '😕',
color: Color(0xFF607D8B),
description: '困惑、迷茫、不确定',
);
final String label;
final String emoji;
final Color color;
final String description;
}
3.1.2 情绪强度枚举 (EmotionIntensity)
dart
enum EmotionIntensity {
mild(label: '轻微', emoji: '🌱', minValue: 0.1, maxValue: 0.3),
moderate(label: '中等', emoji: '🌿', minValue: 0.3, maxValue: 0.6),
strong(label: '强烈', emoji: '🌳', minValue: 0.6, maxValue: 0.8),
extreme(label: '极端', emoji: '🌲', minValue: 0.8, maxValue: 1.0);
final String label;
final String emoji;
final double minValue;
final double maxValue;
}
3.1.3 情绪记录模型 (EmotionEntry)
dart
class EmotionEntry {
final String id; // 记录ID
final String audioPath; // 音频文件路径
final EmotionType emotion; // 主要情绪
final EmotionIntensity intensity; // 情绪强度
final List<EmotionTag> tags; // 情绪标签
final String notes; // 备注信息
final DateTime timestamp; // 记录时间
final double moodScore; // 情绪得分 (0-1)
}
3.1.4 情绪分析模型 (EmotionAnalysis)
dart
class EmotionAnalysis {
final String entryId; // 对应的记录ID
final Map<EmotionType, double> emotionScores; // 各情绪得分
final EmotionType dominantEmotion; // 主导情绪
final double overallMood; // 整体情绪得分
final String suggestion; // 健康建议
final DateTime analyzedAt; // 分析时间
final List<String> insights; // 情绪洞察
}
3.1.5 情绪分布示例
35% 25% 15% 10% 10% 5% 情绪分布示例 开心 平静 焦虑 悲伤 愤怒 困惑
3.2 页面结构设计
3.2.1 主页面布局
SoundEmotionDiaryHomePage
IndexedStack
记录页
分析页
统计页
个人页
NavigationBar
记录 Tab
分析 Tab
统计 Tab
我的 Tab
3.2.2 记录页结构
记录页
SliverAppBar
录音区域
分析结果
标签选择
备注输入
保存按钮
录音按钮
波形显示
录音时长
情绪类型
情绪强度
AI分析结果
常用标签
自定义标签
文本输入
语音转文字
3.2.3 分析页结构
分析页
SliverAppBar
情绪曲线
分析报告
趋势分析
健康建议
日视图
周视图
月视图
主导情绪
情绪变化
影响因素
趋势图表
同比分析
建议列表
行动指南
3.2.4 统计页结构
统计页
SliverAppBar
情绪分布
强度分析
标签统计
数据导出
饼图
占比分析
柱状图
强度趋势
热门标签
相关情绪
导出选项
数据格式
3.3 录音与分析流程
是
否
停止
取消
点击录音按钮
请求录音权限
权限 granted?
开始录音
提示授权
实时显示波形
显示录音时长
用户操作
保存音频文件
删除录音
AI情绪分析
显示情绪结果
用户确认
添加标签
输入备注
保存记录
3.4 情绪分析算法流程
音频输入
特征提取
情绪识别模型
情绪得分计算
主导情绪确定
强度评估
标签推荐
建议生成
分析结果输出
四、UI设计规范
4.1 配色方案
应用以柔和的紫色为主色调,象征内心的平静与探索:
| 颜色类型 | 色值 | 用途 |
|---|---|---|
| 主色 | #9C27B0 (Purple) | 导航、主题元素 |
| 辅助色 | #BA68C8 | 分析页面 |
| 第三色 | #CE93D8 | 统计页面 |
| 强调色 | #E1BEE7 | 个人页面 |
| 背景色 | #FAFAFA | 页面背景 |
| 卡片背景 | #FFFFFF | 功能卡片 |
| 情绪背景 | #F3E5F5 | 情绪分析区域 |
4.2 情绪类型颜色
| 情绪 | 色值 | 视觉效果 |
|---|---|---|
| 开心 | #4CAF50 | 清新绿色 |
| 平静 | #2196F3 | 平静蓝色 |
| 焦虑 | #FF9800 | 警示橙色 |
| 悲伤 | #9C27B0 | 忧郁紫色 |
| 愤怒 | #F44336 | 愤怒红色 |
| 困惑 | #607D8B | 迷茫灰色 |
4.3 字体规范
| 元素 | 字号 | 字重 | 颜色 |
|---|---|---|---|
| 页面标题 | 24px | Bold | 主色 |
| 情绪标签 | 18px | Bold | 情绪颜色 |
| 分析结果 | 16px | Medium | #000000 |
| 统计数据 | 20px | Bold | 主色 |
| 建议文本 | 14px | Regular | #666666 |
4.4 组件规范
4.4.1 录音界面
┌─────────────────────────────────────┐
│ 记录心情 │
│ │
│ ┌─────────────────────────────┐ │
│ │ [波形显示区域] │ │
│ │ ▓▓▓▓▓░░░▓▓▓▓░░░▓▓▓▓ │ │
│ └─────────────────────────────┘ │
│ 录音中... 00:45 │
│ │
│ [🔴 停止录音] [❌ 取消] │
│ │
│ 🎤 对着麦克风说出你的心情 │
└─────────────────────────────────────┘
4.4.2 情绪分析结果
┌─────────────────────────────────────┐
│ 情绪分析结果 │
│ │
│ ┌─────────────────────────────┐ │
│ │ │ │
│ │ 😊 │ │
│ │ 开心 (85%) │ │
│ │ │ │
│ └─────────────────────────────┘ │
│ 🌿 中等强度 │
│ 你现在的心情很不错,充满了积极能量! │
│ │
│ [添加标签] [保存记录] │
└─────────────────────────────────────┘
4.4.3 情绪曲线图表
┌─────────────────────────────────────┐
│ 情绪变化趋势 │
│ │
│ ┌─────────────────────────────┐ │
│ │ │ │
│ │ 😊 😌 😊 😰 😊 😌 │ │
│ │ ──────────────────────── │ │
│ │ 1 2 3 4 5 6 7 (天) │ │
│ └─────────────────────────────┘ │
│ 本周情绪整体积极,周五有轻微焦虑 │
│ │
│ [日] [周] [月] [年] │
└─────────────────────────────────────┘
4.4.4 标签选择界面
┌─────────────────────────────────────┐
│ 选择情绪标签 │
│ │
│ [💼 工作压力] [🤝 人际关系] │
│ [🩺 健康问题] [🎉 生活事件] │
│ [🌍 环境因素] [📈 自我成长] │
│ [+ 自定义标签] │
└─────────────────────────────────────┘
4.4.5 统计分析界面
┌─────────────────────────────────────┐
│ 情绪统计 │
│ │
│ ┌─────────────────────────────┐ │
│ │ [饼图:情绪分布] │ │
│ └─────────────────────────────┘ │
│ 开心: 35% 平静: 25% 焦虑: 15% │
│ 悲伤: 10% 愤怒: 10% 困惑: 5% │
│ │
│ [导出数据] [详细分析] │
└─────────────────────────────────────┘
五、核心功能实现
5.1 录音功能实现
dart
class RecordManager {
final Record _record = Record();
bool _isRecording = false;
Stream<Amplitude>? _amplitudeStream;
Future<void> startRecording(String path) async {
if (await _record.hasPermission()) {
await _record.start(
path: path,
encoder: AudioEncoder.aacLc,
bitRate: 128000,
samplingRate: 44100,
);
_isRecording = true;
_amplitudeStream = _record.onAmplitudeChanged(const Duration(milliseconds: 100));
}
}
Future<String?> stopRecording() async {
if (_isRecording) {
final path = await _record.stop();
_isRecording = false;
return path;
}
return null;
}
Stream<Amplitude>? get amplitudeStream => _amplitudeStream;
bool get isRecording => _isRecording;
}
5.2 情绪分析实现
dart
class EmotionAnalyzer {
Future<EmotionAnalysis> analyzeEmotion(String audioPath) async {
// 模拟AI情绪分析
await Future.delayed(const Duration(seconds: 2));
final emotionScores = {
EmotionType.happy: 0.85,
EmotionType.calm: 0.1,
EmotionType.anxious: 0.05,
EmotionType.sad: 0.0,
EmotionType.angry: 0.0,
EmotionType.confused: 0.0,
};
final dominantEmotion = emotionScores.entries
.reduce((a, b) => a.value > b.value ? a : b)
.key;
final intensity = _getIntensity(emotionScores[dominantEmotion]!);
return EmotionAnalysis(
entryId: 'entry_${DateTime.now().millisecondsSinceEpoch}',
emotionScores: emotionScores,
dominantEmotion: dominantEmotion,
overallMood: emotionScores[dominantEmotion]!,
suggestion: _generateSuggestion(dominantEmotion, intensity),
analyzedAt: DateTime.now(),
insights: _generateInsights(dominantEmotion),
);
}
EmotionIntensity _getIntensity(double score) {
if (score < 0.3) return EmotionIntensity.mild;
if (score < 0.6) return EmotionIntensity.moderate;
if (score < 0.8) return EmotionIntensity.strong;
return EmotionIntensity.extreme;
}
String _generateSuggestion(EmotionType emotion, EmotionIntensity intensity) {
// 根据情绪和强度生成建议
return '保持积极心态,继续享受美好的一天!';
}
}
5.3 情绪曲线实现
dart
class EmotionChartWidget extends StatelessWidget {
final List<EmotionEntry> entries;
final TimeRange timeRange;
@override
Widget build(BuildContext context) {
final data = _prepareChartData(entries, timeRange);
return LineChart(
LineChartData(
lineBarsData: [
LineChartBarData(
spots: data,
color: MaterialPalette.blue.shade500,
barWidth: 2,
isCurved: true,
dotData: FlDotData(show: false),
),
],
gridData: FlGridData(show: true),
titlesData: FlTitlesData(
bottomTitles: AxisTitles(
sideTitles: SideTitles(
showTitles: true,
getTitlesWidget: (value, meta) {
return Text(_getDateLabel(value));
},
),
),
),
),
);
}
}
5.4 数据统计实现
dart
class DataProcessor {
final Database _database;
Future<Map<String, dynamic>> getEmotionStatistics() async {
final entries = await _database.getEmotionEntries();
final emotionCount = <EmotionType, int>{};
for (final entry in entries) {
emotionCount[entry.emotion] = (emotionCount[entry.emotion] ?? 0) + 1;
}
final totalEntries = entries.length;
final emotionPercentages = emotionCount.map((emotion, count) {
return MapEntry(emotion, (count / totalEntries) * 100);
});
return {
'totalEntries': totalEntries,
'emotionPercentages': emotionPercentages,
'averageMood': entries.map((e) => e.moodScore).average,
'dominantEmotion': _getDominantEmotion(emotionCount),
};
}
Future<void> exportData(String format) async {
final entries = await _database.getEmotionEntries();
// 导出数据为指定格式
}
}
5.5 智能建议实现
dart
class SuggestionEngine {
String generateSuggestion(EmotionType emotion, EmotionIntensity intensity) {
switch (emotion) {
case EmotionType.happy:
return _happySuggestions(intensity);
case EmotionType.calm:
return _calmSuggestions(intensity);
case EmotionType.anxious:
return _anxiousSuggestions(intensity);
case EmotionType.sad:
return _sadSuggestions(intensity);
case EmotionType.angry:
return _angrySuggestions(intensity);
case EmotionType.confused:
return _confusedSuggestions(intensity);
}
}
String _anxiousSuggestions(EmotionIntensity intensity) {
switch (intensity) {
case EmotionIntensity.mild:
return '尝试深呼吸练习,放松身心';
case EmotionIntensity.moderate:
return '建议进行5-10分钟的冥想,缓解焦虑';
case EmotionIntensity.strong:
return '考虑进行轻度运动,如散步或瑜伽';
case EmotionIntensity.extreme:
return '建议寻求专业心理咨询师的帮助';
}
}
}
六、交互设计
6.1 录音流程
情绪分析器 录音管理器 记录页 用户 情绪分析器 录音管理器 记录页 用户 点击录音按钮 开始录音 录音中... 停止录音 停止录音 返回音频文件 分析情绪 返回情绪分析结果 查看分析结果 显示情绪类型和强度 添加标签和备注 点击保存 保存成功
6.2 分析流程
进入分析页
选择时间范围
加载情绪数据
显示情绪曲线
分析情绪变化
生成分析报告
提供健康建议
查看详细分析
6.3 统计流程
查看饼图
查看强度
查看标签
导出数据
统计页
情绪分布
强度分析
标签统计
数据导出
七、扩展功能规划
7.1 后续版本规划
2024-01-07 2024-01-14 2024-01-21 2024-01-28 2024-02-04 2024-02-11 2024-02-18 2024-02-25 2024-03-03 2024-03-10 2024-03-17 2024-03-24 2024-03-31 基础UI框架 录音功能 情绪分析 数据可视化 智能建议 数据导出 多语言支持 云同步 社区功能 V1.0 基础版本 V1.1 增强版本 V1.2 进阶版本 声音情绪日记应用开发计划
7.2 功能扩展建议
7.2.1 云同步功能
同步功能:
- 跨设备数据同步
- 云端备份与恢复
- 多设备登录
- 数据安全保障
7.2.2 社区功能
社区功能:
- 匿名情绪分享
- 情绪支持小组
- 专业心理咨询
- 情绪管理课程
7.2.3 高级分析
分析功能:
- 睡眠质量关联
- 生理数据整合
- 个性化建议
- 预测性分析
八、注意事项
8.1 开发注意事项
-
隐私保护:音频数据需本地处理,保护用户隐私
-
情绪分析:AI模型需持续优化,提高准确性
-
数据安全:本地存储需加密,防止数据泄露
-
用户体验:录音流程需简洁,分析结果需易懂
-
电池优化:音频处理需优化功耗
8.2 常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 录音失败 | 权限被拒 | 引导用户开启权限 |
| 分析不准确 | 模型精度 | 持续优化算法 |
| 数据丢失 | 存储问题 | 自动备份机制 |
| 电池消耗快 | 后台运行 | 优化后台处理 |
| 导出失败 | 格式错误 | 支持多种格式 |
8.3 使用技巧
🎤 声音情绪日记使用技巧 🎤
录音建议
- 找一个安静的环境,减少背景噪音
- 自然表达,不要刻意调整语气
- 记录真实的情绪状态
- 每次录音控制在1-3分钟
分析解读
- 关注情绪趋势,而非单次结果
- 结合标签分析情绪触发因素
- 定期回顾情绪曲线变化
- 参考AI建议,调整生活方式
健康管理
- 保持规律的记录习惯
- 注意情绪变化的周期性
- 建立情绪管理的正向循环
- 必要时寻求专业帮助
九、运行说明
9.1 环境要求
| 环境 | 版本要求 |
|---|---|
| Flutter SDK | >= 3.0.0 |
| Dart SDK | >= 2.17.0 |
| 音频录制 | 支持AAC编码 |
| 存储空间 | 建议100MB以上 |
| 鸿蒙OS | API 21+ |
9.2 运行命令
bash
# 查看可用设备
flutter devices
# 运行到iOS设备
flutter run -t lib/main_sound_emotion_diary.dart
# 运行到Android设备
flutter run -t lib/main_sound_emotion_diary.dart
# 运行到Web服务器
flutter run -d web-server -t lib/main_sound_emotion_diary.dart --web-port 8142
# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_sound_emotion_diary.dart
# 代码分析
flutter analyze lib/main_sound_emotion_diary.dart
十、总结
声音情绪日记应用通过记录、分析、统计、个人四大模块,为用户提供了一个全新的情绪管理工具。应用利用声音识别技术,无需打字即可记录心情,通过AI分析生成情绪曲线和健康建议,帮助用户更好地了解自己的内心世界。
核心功能涵盖声音录制、情绪分析、数据可视化、智能建议四大模块。情绪类型包括开心、平静、焦虑、悲伤、愤怒、困惑六种基本情绪;情绪强度分为轻微、中等、强烈、极端四个等级;情绪标签涵盖工作、人际关系、健康、生活事件、环境、自我成长等多个维度。
应用采用 Material Design 3 设计规范,以柔和的紫色为主色调,象征内心的平静与探索。通过本应用,希望能够帮助用户建立健康的情绪管理习惯,提高心理健康水平,更好地应对生活中的各种挑战。
声音情绪日记------倾听内心的声音