Releases: oddmeta/oddminutes
Release list
OddMinutes v0.1.4 Windows独立免安装运行包
自己用下来还算顺手了。周末把最近的修改打个包。
commit 7e96e872f9b42aacee20cbe835e6179a733ce46a (HEAD -> main, origin/main, origin/HEAD)
Author: Catherine catherine@oddmeta.com
Date: Sat Jul 25 14:23:51 2026 +0800
feat: 在编辑模式按钮旁边加一个修复音字对齐的按钮,点击后自动将当前会议的音频文件做一个静音裁剪处理,并更新会议音频时长,然后通知前端用户,需要用户自己手动做重新转录,再来看音
字是否已经对齐
commit 2861fa705cc72a07831e1594d410369668dc8ec2
Author: Catherine catherine@oddmeta.com
Date: Fri Jul 24 23:53:00 2026 +0800
opt: 静音裁剪功能现在由 AUDIO_ENABLE_SILENCE_TRIM 环境变量控制。
commit f85f0d5eceb24b411efd4153e59854ec141eeaed
Author: Catherine catherine@oddmeta.com
Date: Fri Jul 24 23:17:19 2026 +0800
fix: 修复导入音频时长显示为0的问题。
根因 :导入音频时没有设置 audio_duration 字段,而录音功能是通过计算开始到结束的时间差来设置时长的。
## 修复内容
### 1. 添加获取音频时长函数
在 audio_utils.py 中添加了 get_audio_duration() 函数,使用 ffmpeg 获取音频文件的实际时长。
### 2. 在导入逻辑中设置时长
在 transcription/views.py 的 upload_and_transcribe 视图中:
- 音频转换为 MP3 后,获取并设置 audio_duration
- 静音裁剪完成后,重新获取并更新时长(因为裁剪可能改变了实际时长)
现在导入音频文件时,系统会自动检测并设置正确的音频时长,左侧列表和详情页都会正确显示时长信息。
commit 5bc174d4d32aca0dd14a0fa1e8a62a68c58d8b03
Author: Catherine catherine@oddmeta.com
Date: Fri Jul 24 18:02:50 2026 +0800
在音频入库后、ASR 转录前,增加了头尾静音裁剪预处理,自动删除音频开头和结尾能量过低、无法被实际转录的内容。
commit 38cfc10f695b8e8d44217efeeee4bed42598236f (opencode/kind-nebula)
Author: Catherine catherine@oddmeta.com
Date: Thu Jul 23 09:53:08 2026 +0800
开始转录/重新转录功能交互优化:
- 前端立即反馈:在 retranscribe() 中,发送 fetch 之前就调用 showTranscribingState() 并禁用按钮,不要等后端响应
- 后端异步删除:把 meeting.transcripts.all().delete() 移到后台线程 do_retranscription 里执行,让 API 立即返回
- 补全 WebSocket 事件:转录成功后发送 push_meeting_event(..., 'transcription_done'),前端可直接响应并刷新
commit 33893ffc7b8c9ae7cd7359eca6b7f16c2a4df53b
Author: Catherine catherine@oddmeta.com
Date: Tue Jul 21 22:39:51 2026 +0800
feat: 长音频转写超时优化。在 oddminutes_config.py 中添加配置项ODDASR_TIMEOUT :默认 600 秒(10分钟),可通过环境变量调整
commit 7a38abeee620bd3cef496cd56c3b7172d6e12067
Author: Catherine catherine@oddmeta.com
Date: Tue Jul 21 14:34:08 2026 +0800
将录音和引入音频所保存的音频文件路径统一为“年”+“月”的目录结构。
commit 184df9b09d2fe143143e56437c2d6f4e110e6ec4
Author: Catherine catherine@oddmeta.com
Date: Mon Jul 20 17:59:01 2026 +0800
feat: 所有运行模式(源码、pip install、PyInstaller)默认均使用用户数据目录
fix: 修复浏览器里开始录音,然后切换会议导致音频无法正确上传到后端问题
fix: 修复浏览器里开始录音,然后刷新页面,浏览器的录音器已经被重置但是界面上状态还是录音中的问题
commit b412e419d1bb375178f874bdf813dff70178368d
Author: Catherine catherine@oddmeta.com
Date: Mon Jul 20 13:09:57 2026 +0800
style: 前端显示的每个文字片段之间貌似多出来一个空格,css style样式导致。
commit a85f38c3b64e3e696f590e742bcfb1635073c06b
Author: Catherine catherine@oddmeta.com
Date: Mon Jul 20 13:08:55 2026 +0800
fix: 修复编辑片段内容文字,然后点保存报错:transcriptEditDirtyMap is not defined问题
commit 921e97ab14b7a04138997144816063292f2c8317
Author: Catherine catherine@oddmeta.com
Date: Mon Jul 20 00:58:41 2026 +0800
修复发言人识别错误(json字段名变更,从 speaker 改为 spk)
commit 1ce47915a630f4e58e06d84f8f36b4b77de1c8ee
Author: Catherine catherine@oddmeta.com
Date: Mon Jul 20 00:30:26 2026 +0800
test
commit 852947b565f1c3a35b5455825afb6b7f4a5e5387
Author: Catherine catherine@oddmeta.com
Date: Sun Jul 19 23:51:46 2026 +0800
修复linux下代码部署,静态文件(sqlite数据库文件)路径不统一问题
commit abd98abbc226f7b583647c9005fd8f6b91a164ef
Author: Catherine catherine@oddmeta.com
Date: Sun Jul 19 23:38:25 2026 +0800
ai摘要模板数据库迁移
commit 891a45508b57b3c549142c7f2fc5af45d63eac2d
Author: Catherine catherine@oddmeta.com
Date: Sun Jul 19 23:33:09 2026 +0800
补充遗漏的代码文件:初始化AI摘要模板和小奥录音的logo。
commit 7c86bafb4c6034edcfbce0a40838e0adb4acf8a8
Author: Catherine catherine@oddmeta.com
Date: Sun Jul 19 18:26:00 2026 +0800
已修复静态文件路径问题。问题在于 urls.py 中静态文件服务使用的是 settings.STATIC_ROOT (用户数据目录),但实际的静态文件在打包后的 _internal/static/ 目录中。
commit 21ab4381e8ea42701126506b4232a915693c41bd
Author: Catherine catherine@oddmeta.com
Date: Sun Jul 19 01:24:27 2026 +0800
v0.1.2 备份。
commit 4244082779ff5a57e1daad8879af3971f5c2ce9a
Author: Catherine catherine@oddmeta.com
Date: Sat Jul 18 21:33:16 2026 +0800
fix: 修复通知历史详细页面点关闭,无法关闭的问题。
commit f1d89da742f738095383fc59d6235da1ce72031c (opencode/lucky-meadow)
Author: Catherine catherine@oddmeta.com
Date: Fri Jul 17 18:01:59 2026 +0800
系统托盘同步会议、录音状态改成点开菜单时进行,而非一直在后台同步。
新增通知历史记录的本地化存储,点击左下角按钮可查看通知历史列表。
修复触发暂停后,录音状态同步异常问题。
commit febc0248768557e31426e8b61e03a9f2a8aa4761
Author: Catherine catherine@oddmeta.com
Date: Fri Jul 17 09:40:34 2026 +0800
前后端状态同步优化:将前端定时轮循改成subscribe(websocket)
commit d73b3b9ddd8f8ec6d3823b1bd0cd42c21ff7cea8
Author: Catherine catherine@oddmeta.com
Date: Thu Jul 16 23:07:09 2026 +0800
opt: 停止录音流程优化
- 前端点击停止录音后,告诉后端停止录音
- 后端返回前端已停止录音,并通知前端正在处理音频中
- 后端开始将音频转换成mp3
- 后端转mp3完成后,通知前端“音频处理完成将开始转文字”,并将mp3文件的路径告诉前端
- 前端再将这个mp3路径更新到 audio 里
- 后端开始调用asr接口进行转写
- 后端转写完成后再将转写的结果返回给前端
commit aeb06d6d66b0606e7a5765df6fdbe5a99fad20e7
Author: Catherine catherine@oddmeta.com
Date: Thu Jul 16 20:27:34 2026 +0800
在设置-》音频设备那里,加checkbox:自动调节麦克风音频的设置,取值区间为0到100,默认值为100(音量最大),然后在实际采集的时候,实际将麦克风音量值调到这个值,如果是播放出来的远
端的音频的话,也根据这个值来自动调节。
commit 356162344707efffb5723be92d19d719205a0147
Author: Catherine catherine@oddmeta.com
Date: Thu Jul 16 20:05:57 2026 +0800
feat: 支持远端播放音频采集,在Web里必须弹框提示允许共享(electron可以不弹框)。
commit bf65116237ac34191455f584c03c36627e47eee7
Author: Catherine catherine@oddmeta.com
Date: Thu Jul 16 17:06:13 2026 +0800
fix: [修复问题]开始录音后,没有将浏览器中播放着的远端的音频给录下来
## 问题原因:
之前的代码只使用了 navigator.mediaDevices.getUserMedia() 来获取麦克风音频,而浏览器中播放的远端音频属于系统音频输出,getUserMedia 无法捕获。设置里的"启用系统音频"开关实际上没
有真正生效。修复内容:
- 新增系统音频捕获:当设置中启用了系统音频时,现在会调用 navigator.mediaDevices.getDisplayMedia({ video: true, audio: true }) 来获取系统音频流。
- 音频混合:使用 Web Audio API 的 AudioContext 将麦克风流和系统音频流混合到一个新的 MediaStreamDestinationNode 中。
- 混合录制:MediaRecorder 现在录制的是混合后的音频流,因此能同时录下本地说话声和浏览器中播放的远端声音。
- 电平监测同步更新:音频电平监测现在会分别计算麦克风、系统音频和混合音频的电平,并在 UI 上正确显示。
## 使用时需要注意:
点击"开始录音"后,如果启用了系统音频,浏览器会弹出一个窗口让你选择要共享的屏幕/窗口。请选择"整个屏幕"或对应的浏览器标签页,并确保勾选了"共享音频"选项,这样才能把远端声音录下来。如果选择"窗口",通常无法捕获到音频。
commit 3d39fbdcc39be6de449c2a2c040b2a44f7124b14
Author: Catherine catherine@oddmeta.com
Date: Thu Jul 16 17:04:07 2026 +0800
fix: 修复系统托盘菜单点击退出,但实际没有退出的问题。
commit df3cb2b17799aafa371ddcdf2541e6b7a8fc8862
Author: Catherine catherine@oddmeta.com
Date: Thu Jul 16 16:29:31 2026 +0800
问题 1:停止录音后 upload-chunk 返回 400 Bad Request
根因:前端 stopRecording() 中先调用 mediaRecorder.stop(),然后立即调用 /api/recording/stop/ API,但 MediaRecorder.ondataavailable 中最后一个音频块的异步上传尚未完成。当该上传
请求到达后端时,session 已被标记为 stopped,导致报错。修复(app.js):
添加 pendingChunkUploads 计数器跟踪正在上传的音频块
在 stopRecording() 中调用 mediaRecorder.stop() 后,等待所有 pending 的音频块上传完成(最多 5 秒),再调用 /api/recording/stop/
问题 2:ASR 转写 504 Gateway Time-out
根因:https://asr.oddmeta.net 网关层超时时间(约 120 秒)短于代码设置的超时(300 秒),长音频触发网关 504。
commit c1c62b6e10ed0998ede41f506375bfb3fa779461
Author: Catherine catherine@oddmeta.com
Date: Thu Jul 16 16:27:17 2026 +0800
pyinstaller 打包配置文件调整。
commit 1f21d64b1f902c190e03a6b9db045c7c6e99aed7
Author: Catherine catherine@oddmeta.com
Date: Thu Jul 16 16:22:07 2026 +0800
加入一个 toast 提示窗口,当用户在小奥录音界面上的时候在小奥录音里提示状态,录用户不在小奥录音界面时在操作系统提示窗口里提示用户。
commit d57dab62cddb2c9739db4735c52734498733107e
Author: Catherine catherine@oddmeta.com
Date: Thu Jul 16 16:04:44 2026 +0800
pyinstaller 安装包运行的时候,先检查当前目录是否存在 .env,若没有则从 _internal/.env 复制,并默认配置。
commit 69118407575411d6dd908ceb8b171b6d5f52e667
Author: Catherine catherine@oddmeta.com
Date: Thu Jul 16 12:38:43 2026 +0800
在前端点击开始录音自动创建一个新会议后,左侧的导航栏那边没有同步到新创建的会议;右侧删除一个会议,导航栏那边也没有同步删除。根因 loadMeetings() 函数里有一行保护逻辑:当搜索框
有内容时直接 return,避免覆盖搜索结果。
- loadMeetings 增加 force 参数,允许强制跳过搜索保护
- createNewMeeting 创建成功后清空搜索框,再 await loadMeetings()
- deleteMeeting 删除成功后清空搜索框,并改为 await loadMeetings()
- importAudio 导入成功后清空搜索框,再 await loadMeetings()
删除会议的时候同时删除一下该会议所对应的音频文件
Full Changelog: https://github.com/oddmeta/oddminutes/commits/v0.1.4
OddMinutes v0.1.2 Windows独立免安装运行包
小奥录音 OddMinutes v0.1.2: Windows绿色免安装,一键运行包。
介绍
上个周末台风天,在家手搓了一个录音工具,取名:OddMinutes,中文名称:小奥录音。今天,我决定发布一个Windows绿色免安装的版本。让不懂代码的程序员也可以下载后一键运行。
demo地址: https://minutes.oddmeta.net 十年前老笔记本,请温柔对待,不要动测超过5分钟的音频。
下载
运行
- 双击
oddminutes-standalone.7z解压到任意目录。 - 双击
OddMinutes\create_shortcut.bat创建桌面快捷方式。 - 双击
OddMinutes\OddMinutes.exe运行。
第一次运行时,会自动初始化数据库、创建数据库迁移文件、执行数据库迁移、创建超级用户、创建默认环境变量。
功能
- 录音
- 播放
- 转写
- 生成
注意
本项目本身不提供ASR和LLM的模型及推理。需要你自己安装部署一下 ASR 模型和 LLM 模型。
- ASR 模型: 推荐使用 OddASR 本地化部署。如果不想自己本地安装ASR模型,也可以购买 阿里云百炼、小米MiMo、阶跃星辰、火山引擎等的ASR模型API。
- LLM 模型: 推荐自行 llama.cpp/Ollama本地化部署。如果不想自己本地安装部署LLM模型,同样也可以选择购买任意支持 OpenAI 兼容接口的LLM模型(市面上所有LLM服务商都支持)。