欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net

一、项目概述

运行效果图

image-20260410190407077

image-20260410190415208

image-20260410190424625

image-20260410190429721

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)
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 情绪分布示例
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 录音功能实现

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 后续版本规划

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 开发注意事项

  1. 隐私保护:音频数据需本地处理,保护用户隐私

  2. 情绪分析:AI模型需持续优化,提高准确性

  3. 数据安全:本地存储需加密,防止数据泄露

  4. 用户体验:录音流程需简洁,分析结果需易懂

  5. 电池优化:音频处理需优化功耗

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 设计规范,以柔和的紫色为主色调,象征内心的平静与探索。通过本应用,希望能够帮助用户建立健康的情绪管理习惯,提高心理健康水平,更好地应对生活中的各种挑战。

声音情绪日记——倾听内心的声音


Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐