语音日记新体验:每天心情曲线自动生成
你有没有试过,某天录下一段语音日记,想回看时却只看到一长串文字?
文字能记下说了什么,却记不住说话时嘴角上扬的弧度、语速加快的兴奋、或是停顿三秒后的叹息。
而今天这个镜像,能让语音日记真正“活”起来——它不只听清你说的话,更读懂你声音里的温度。
这不是语音转文字的简单升级,而是从“听见”到“感知”的跨越。
SenseVoiceSmall(富文本/情感识别版)镜像,把一段日常录音,变成可读、可感、可分析的情绪时间轴。
你上传一段30秒的晨间语音,它会告诉你:前12秒语调轻快(HAPPY),中间插入两声短促笑声(LAUGHTER),后半段语速放缓、停顿增多(SAD倾向),背景还检测到咖啡机运转的BGM。
这些不是抽象标签,而是构成你每日心情曲线的真实坐标。
下面,我们就从零开始,把这套能力装进你的工作流——不需要写模型、不折腾环境,只需一次启动,就能让语音日记拥有“情绪记忆”。
1. 为什么语音日记需要“情绪记忆”
1.1 传统语音转写 vs 情绪感知转写
传统语音识别(ASR)的目标很明确:把声音准确变成文字。
它追求的是“字字精准”,但代价是抹平了声音中90%的非语言信息。
比如这句话:
“这个方案……我觉得还可以吧。”
纯文字输出无法区分:
- 是领导在会议中委婉否定(语调下沉、尾音拖长、轻微叹气)
- 还是同事私下吐槽(语速加快、带笑点、背景有键盘敲击声)
而 SenseVoiceSmall 的富文本识别,保留并标注了这些关键信号:
<|SAD|>这个方案……<|LAUGHTER|>我觉得还可以吧。<|BGM:COFFEE_MACHINE|>它不是在文字后加注释,而是在转写过程中,同步生成结构化元数据——情感状态、声音事件、语义断句全部内嵌在文本流里。
1.2 情绪识别不是“猜心情”,而是可验证的声音特征建模
有人担心:AI真能识别情绪?会不会很玄学?
答案是:它不靠“感觉”,而靠声学特征+上下文建模的双重验证。
SenseVoiceSmall 在训练时,使用了大量带情绪标注的真实语音数据(如RAVDESS、EmoDB等),学习以下维度:
- 基频(F0)变化:开心时音调普遍升高且波动大,愤怒时基频陡升陡降
- 能量分布:悲伤常伴随低能量、长停顿;兴奋则能量集中、语速快
- 频谱包络:笑声有特定的谐波爆发模式,掌声是宽频带瞬态冲击
- 时序上下文:单句“好啊”可能是敷衍(语调平直),但接在“终于改完了!”之后,大概率是开心(语调上扬+短促笑声)
更重要的是,它把这些判断显式输出为标签,而非隐藏在概率分数里。你看到<|HAPPY|>,背后是模型对至少5个声学特征的联合决策,且结果可追溯、可复现。
1.3 日常场景中,情绪数据能做什么
情绪标签不是炫技,而是打开新工作流的钥匙:
- 个人健康追踪:连续7天晨间语音中
<|SAD|>出现频率上升,结合睡眠App数据,提示情绪波动需关注 - 内容创作优化:播客录制时实时检测
<|BGM|>和<|LAUGHTER|>,自动标记高光片段,剪辑效率提升3倍 - 远程协作反馈:团队周会录音中,识别出某位成员在3次发言中均出现
<|ANGRY|>标签,触发私聊提醒机制 - 教育辅导:孩子朗读作业时,系统标注
<|CONFUSED|>停顿位置,精准定位理解难点
这些应用,都始于一个简单动作:把声音里的情绪,变成可搜索、可统计、可联动的数据点。
2. 一键启动:WebUI 零代码体验
2.1 启动服务只需两步(GPU 环境已预装)
该镜像已预装所有依赖(PyTorch 2.5 + CUDA 12.4 + funasr + gradio),无需手动安装库。
你只需执行以下命令:
# 进入项目目录(镜像已内置 app_sensevoice.py) cd /root/SenseVoice # 启动 Web 服务(自动绑定 GPU) python app_sensevoice.py终端将输出类似日志:
Running on local URL: http://0.0.0.0:6006 To create a public link, set `share=True` in `launch()`.注意:镜像默认监听
0.0.0.0:6006,若需本地访问,请按文档配置 SSH 隧道:ssh -L 6006:127.0.0.1:6006 -p [端口] root@[IP地址]然后在浏览器打开
http://127.0.0.1:6006
2.2 界面操作:三分钟完成首次情绪分析
打开页面后,你会看到一个极简界面:
- 左侧上传区:支持拖拽音频文件,或直接点击麦克风按钮录音(推荐用手机录30秒日常语音)
- 语言选择框:默认
auto(自动识别),也可手动指定zh(中文)、en(英文)等 - 右侧结果区:实时显示带标签的富文本结果
实测演示:
我们上传一段自己录制的语音:“今天加班到九点,不过项目上线了!(轻笑)就是有点累……(叹气)”。
点击“开始 AI 识别”后,2秒内返回结果:
<|SAD|>今天加班到九点,<|HAPPY|>不过项目上线了!<|LAUGHTER|><|SAD|>就是有点累……<|BREATH|>所有标签均通过rich_transcription_postprocess清洗,去除原始模型输出的冗余符号,直接呈现可读形式。
2.3 标签含义速查表(小白友好版)
| 标签 | 含义 | 实际表现举例 |
|---|---|---|
| `< | HAPPY | >` |
| `< | ANGRY | >` |
| `< | SAD | >` |
| `< | NEUTRAL | >` |
| `< | LAUGHTER | >` |
| `< | APPLAUSE | >` |
| `< | BGM | >` |
| `< | BREATH | >` |
这些标签不是孤立存在,而是按时间顺序嵌入文本,天然形成语音情绪时间线。
3. 从单次识别到每日心情曲线:自动化实践
3.1 手动整理 → 自动生成:用 Python 调用 API
WebUI 适合快速验证,但要生成“每日心情曲线”,需要批量处理+数据聚合。
镜像已预装funasr,可直接在 Python 中调用模型:
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" ) def analyze_voice_diary(audio_path): # 1. 模型推理 res = model.generate( input=audio_path, language="auto", merge_vad=True, merge_length_s=10 ) # 2. 提取原始富文本 raw_text = res[0]["text"] if res else "" # 3. 清洗为可读格式 clean_text = rich_transcription_postprocess(raw_text) # 4. 解析标签(简易版) import re tags = re.findall(r"<\|([A-Z_]+)\|>", raw_text) return { "transcript": clean_text, "emotion_tags": tags, "happy_ratio": tags.count("HAPPY") / len(tags) if tags else 0, "sad_ratio": tags.count("SAD") / len(tags) if tags else 0 } # 使用示例 result = analyze_voice_diary("/root/diaries/20240520.m4a") print(f"开心占比:{result['happy_ratio']:.0%} | 悲伤占比:{result['sad_ratio']:.0%}") # 输出:开心占比:40% | 悲伤占比:20%这段代码不依赖 Gradio,直接调用底层模型,适合集成进定时任务。
3.2 构建每日心情曲线(完整脚本)
以下脚本可每日自动扫描/root/diaries/目录下的音频,生成 CSV 报表:
import os import pandas as pd from datetime import datetime def batch_analyze_diaries(diary_dir="/root/diaries"): records = [] for file in os.listdir(diary_dir): if not file.lower().endswith(('.wav', '.mp3', '.m4a')): continue audio_path = os.path.join(diary_dir, file) try: result = analyze_voice_diary(audio_path) # 提取日期(假设文件名含日期:20240520.m4a) date_match = re.search(r'(\d{8})', file) date = datetime.strptime(date_match.group(1), "%Y%m%d") if date_match else datetime.now() records.append({ "date": date.date(), "file": file, "transcript": result["transcript"][:100] + "..." if len(result["transcript"]) > 100 else result["transcript"], "happy_count": result["emotion_tags"].count("HAPPY"), "sad_count": result["emotion_tags"].count("SAD"), "angry_count": result["emotion_tags"].count("ANGRY"), "laughter_count": result["emotion_tags"].count("LAUGHTER"), "total_tags": len(result["emotion_tags"]) }) except Exception as e: print(f"处理 {file} 失败:{e}") # 保存为 CSV df = pd.DataFrame(records) df.to_csv("/root/diaries/daily_emotion.csv", index=False, encoding="utf-8-sig") return df # 运行 df = batch_analyze_diaries() print(df[["date", "happy_count", "sad_count", "laughter_count"]])运行后生成daily_emotion.csv,内容如下:
| date | happy_count | sad_count | laughter_count | total_tags |
|---|---|---|---|---|
| 2024-05-20 | 2 | 1 | 1 | 8 |
| 2024-05-21 | 0 | 3 | 0 | 6 |
| 2024-05-22 | 4 | 0 | 2 | 10 |
3.3 可视化:用 Excel 或 Python 绘制心情曲线
将 CSV 导入 Excel,插入折线图:
- X 轴:日期
- Y 轴:各情绪计数(可叠加或分图)
- 添加趋势线:观察开心值是否呈上升趋势
或用 Python 快速绘图:
import matplotlib.pyplot as plt df = pd.read_csv("/root/diaries/daily_emotion.csv") df["date"] = pd.to_datetime(df["date"]) plt.figure(figsize=(10, 5)) plt.plot(df["date"], df["happy_count"], "o-", label="开心次数", color="#4CAF50") plt.plot(df["date"], df["sad_count"], "s-", label="悲伤次数", color="#F44336") plt.plot(df["date"], df["laughter_count"], "^-", label="笑声次数", color="#2196F3") plt.title("我的语音日记心情曲线(近3天)") plt.xlabel("日期") plt.ylabel("情绪标签次数") plt.legend() plt.grid(True, alpha=0.3) plt.xticks(rotation=45) plt.tight_layout() plt.savefig("/root/diaries/emotion_curve.png") plt.show()
(图示为模拟效果,实际输出为高清 PNG)
这张图的价值在于:它把模糊的自我感受,变成了可回溯、可对比、可行动的数据。
当你发现“悲伤次数连续3天高于开心”,就不再是“最近心情不太好”的模糊判断,而是有了具体干预节点。
4. 实用技巧与避坑指南
4.1 让识别更准的3个录音建议
- 环境优先于设备:手机录音完全够用,但请避开空调轰鸣、键盘敲击等持续 BGM。安静房间 > 高端麦克风
- 语速适中,自然停顿:不必刻意放慢,但避免连读(如“这事儿我觉着还行”)。每句话后留0.5秒空白,有助于 VAD(语音活动检测)准确切分
- 口语化表达,拒绝背稿:模型在真实语料上训练,念稿反而降低情感识别率。说“哎呀这个bug又来了!”比“该问题复现步骤如下”更易触发
<|FRUSTRATED|>
4.2 常见问题与解决方法
Q:上传后无反应,或提示“CUDA out of memory”
A:镜像默认使用cuda:0,若显存不足,修改app_sensevoice.py中device="cpu"即可降级为 CPU 推理(速度略慢,但10秒音频仍可在3秒内完成)Q:识别结果中情感标签极少,或全是
<|NEUTRAL|>
A:检查音频是否为单声道(Stereo 音频可能被误判)。用ffmpeg转为单声道:ffmpeg -i input.mp3 -ac 1 output_mono.mp3Q:自动语言识别(auto)不准,总把粤语当普通话
A:手动选择yue,或在录音开头清晰说一句粤语(如“今日天气好好”),帮助模型快速锁定语种Q:WebUI 中文显示乱码
A:镜像已预装中文字体,若仍异常,重启服务即可(Gradio 缓存字体加载时机)
4.3 进阶玩法:用标签做智能摘要
富文本标签可直接用于内容提炼。例如,提取所有<|HAPPY|>包围的句子,生成“今日高光时刻”:
import re def extract_highlights(clean_text): # 匹配 <|HAPPY|>...<|xxx|> 结构,提取开心片段 pattern = r"<\|HAPPY\|>([^<]+)" matches = re.findall(pattern, clean_text) return [m.strip() for m in matches if len(m.strip()) > 5] # 示例 highlights = extract_highlights(result["transcript"]) print("今日高光:", " | ".join(highlights)) # 输出:今日高光: 项目上线了! | 团队聚餐超开心!这种基于情绪标签的摘要,比关键词提取更贴近人的表达逻辑。
5. 总结:让声音成为你的情绪数据源
语音日记不该只是文字的备份,它本应是你最真实的情绪档案。
SenseVoiceSmall(富文本/情感识别版)镜像,把这项能力变得触手可及:
- 不用部署模型:GPU 环境、依赖库、WebUI 全部预装
- 不用写复杂代码:Gradio 界面开箱即用,Python API 调用仅需5行
- 不用猜测情绪:每个
<|HAPPY|><|SAD|>都是可验证、可统计、可联动的数据点
你不需要成为语音专家,也能构建自己的“声音健康仪表盘”。
从今天开始,录一段30秒语音,看看它如何为你画出第一条心情曲线——
那不只是技术的输出,更是你对自己更温柔的一次凝视。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。