开源鸿蒙跨平台Flutter开发:声音情绪日记应用
摘要: 声音情绪日记是一款基于开源鸿蒙的跨平台健康管理应用,通过语音记录分析用户情绪。应用采用Flutter开发,支持iOS、Android和鸿蒙OS,主要功能包括语音录制、AI情绪分析(识别6种情绪类型和4种强度等级)、数据可视化统计(生成情绪曲线和报告)以及个性化建议。技术栈包含Dart语言、音频录制API和机器学习模型,架构分为表现层(4个主页面)、业务层(录音/分析模块)和数据层(情绪记录
欢迎加入开源鸿蒙跨平台社区:
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 整体架构图
2.2 类图设计
2.3 页面导航流程
2.4 情绪记录与分析流程
三、核心模块设计
3.1 数据模型设计
3.1.1 情绪类型枚举 (EmotionType)
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)
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)
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)
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 情绪分布示例
3.2 页面结构设计
3.2.1 主页面布局
3.2.2 记录页结构
3.2.3 分析页结构
3.2.4 统计页结构
3.3 录音与分析流程
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 录音功能实现
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 情绪分析实现
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 情绪曲线实现
class EmotionChartWidget extends StatelessWidget {
final List<EmotionEntry> entries;
final TimeRange timeRange;
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 数据统计实现
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 智能建议实现
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 后续版本规划
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 运行命令
# 查看可用设备
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 设计规范,以柔和的紫色为主色调,象征内心的平静与探索。通过本应用,希望能够帮助用户建立健康的情绪管理习惯,提高心理健康水平,更好地应对生活中的各种挑战。
声音情绪日记——倾听内心的声音
更多推荐




所有评论(0)