ChatVoice 0.3.0__tar.gz → 0.3.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {chatvoice-0.3.0 → chatvoice-0.3.2}/.github/workflows/ci.yml +5 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/CHANGELOG.md +13 -0
- {chatvoice-0.3.0/src/ChatVoice.egg-info → chatvoice-0.3.2}/PKG-INFO +6 -6
- {chatvoice-0.3.0 → chatvoice-0.3.2}/README.en.md +3 -3
- {chatvoice-0.3.0 → chatvoice-0.3.2}/README.md +5 -5
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/api-access.en.md +6 -4
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/api-access.md +6 -4
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/capability-map.en.md +2 -2
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/capability-map.md +2 -2
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/deployment.en.md +1 -1
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/deployment.md +1 -1
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/quickstart.en.md +1 -1
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/quickstart.md +1 -1
- chatvoice-0.3.2/docs/recording-storage.en.md +50 -0
- chatvoice-0.3.2/docs/recording-storage.md +50 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/web-guide.en.md +8 -8
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/web-guide.md +8 -8
- {chatvoice-0.3.0 → chatvoice-0.3.2/src/ChatVoice.egg-info}/PKG-INFO +6 -6
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/ChatVoice.egg-info/SOURCES.txt +4 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/__init__.py +1 -1
- chatvoice-0.3.2/src/chatvoice/asr_chunks.py +110 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/web/legacy_app.py +250 -40
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/web/static/index.html +130 -56
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/nonbrowser_audio_import.cjs +13 -9
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/nonbrowser_flows.cjs +124 -8
- chatvoice-0.3.2/tests/test_large_audio.py +175 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_meeting_audio_edges.py +7 -4
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_meeting_audio_import.py +14 -10
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_meeting_audio_import_frontend.py +11 -1
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_meeting_audio_storage.py +38 -8
- chatvoice-0.3.2/tests/test_meeting_session_mode_lock.py +186 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_nonbrowser_flows.py +2 -0
- chatvoice-0.3.2/tests/test_one_way_recording_enable.py +27 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_recording_retention_frontend.py +14 -8
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_version.py +1 -1
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_web_static_contract.py +3 -3
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_workflow_contract.py +7 -0
- chatvoice-0.3.0/docs/recording-storage.en.md +0 -48
- chatvoice-0.3.0/docs/recording-storage.md +0 -48
- {chatvoice-0.3.0 → chatvoice-0.3.2}/.github/workflows/deploy.yaml +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/.github/workflows/preview.yaml +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/.github/workflows/publish.yml +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/AGENTS.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/DEVELOP.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/LICENSE +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/MANIFEST.in +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/cli-tree.en.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/cli-tree.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/configuration.en.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/configuration.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/index.en.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/index.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/interface-tree.en.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/interface-tree.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/markdown-todo.en.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/markdown-todo.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/runtime-layout.en.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/runtime-layout.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/testing.en.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/testing.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/text-models.en.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/text-models.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/troubleshooting.en.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/troubleshooting.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/tts-models.en.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/tts-models.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/voice-cloning.en.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/docs/voice-cloning.md +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/mkdocs.yml +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/pyproject.toml +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/scripts/check_asr_contract.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/scripts/check_asr_gpu_contract.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/scripts/check_meeting_e2e.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/scripts/check_meeting_notes_canvas_contract.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/scripts/check_meeting_storage_contract.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/scripts/check_meeting_title_contract.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/scripts/check_transcript_extraction.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/scripts/check_ui_contract.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/scripts/funasr_worker.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/scripts/manage_accounts.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/scripts/probe_qwen_audio.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/scripts/probe_token_plan_tts_ws.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/scripts/smoke_asr_api.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/scripts/smoke_demo.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/scripts/verify_service.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/setup.cfg +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/ChatVoice.egg-info/dependency_links.txt +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/ChatVoice.egg-info/entry_points.txt +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/ChatVoice.egg-info/requires.txt +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/ChatVoice.egg-info/top_level.txt +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/accounts.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/asr.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/backup.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/cli.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/client.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/config.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/doctor.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/health.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/paths.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/scripts/__init__.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/scripts/funasr_worker.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/service.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/text_api.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/todo_markdown.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/tts_api.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/tts_qwen.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/web/__init__.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/web/auth_adapter.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/web/login_ui.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/web/server.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/web/static/login-brand.css +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/web/static/transcript-state.js +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/src/chatvoice/web/upload_limits.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/conftest.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/nonbrowser_harness.cjs +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/nonbrowser_realtime_error.cjs +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/nonbrowser_shared_login.cjs +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/nonbrowser_todo_page.cjs +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_accounts_cli.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_api_tokens.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_chatlogin_auth.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_cli.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_cli_token_data.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_config.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_docs_standard.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_documented_interfaces.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_live_acceptance_contract.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_live_exchanges.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_login_service.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_nonbrowser_routes.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_nonbrowser_runner_contract.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_public_docs_contract.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_realtime_provider_errors.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_runtime_cli.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_runtime_env.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_shared_login.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_text_api.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_text_web.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_todo_integration_edges.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_todo_markdown.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_todo_page.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_todo_routes.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_todo_storage.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_tts_api.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_tts_qwen.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_tts_web.py +0 -0
- {chatvoice-0.3.0 → chatvoice-0.3.2}/tests/test_web_app.py +0 -0
|
@@ -29,6 +29,11 @@ jobs:
|
|
|
29
29
|
- uses: actions/setup-node@v4
|
|
30
30
|
with:
|
|
31
31
|
node-version: "22"
|
|
32
|
+
- name: Install audio decoding prerequisite
|
|
33
|
+
run: |
|
|
34
|
+
sudo apt-get update
|
|
35
|
+
sudo apt-get install -y --no-install-recommends ffmpeg
|
|
36
|
+
ffmpeg -version
|
|
32
37
|
- run: python -m pip install --upgrade pip
|
|
33
38
|
- run: python -m pip install -e ".[dev,docs,web]"
|
|
34
39
|
- run: python -m pytest -q
|
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# 更新日志
|
|
2
2
|
|
|
3
|
+
## 0.3.2 - 2026-10-07
|
|
4
|
+
|
|
5
|
+
- 默认纯识别;开始前的“启用录音+识别”是单向按钮,点击生效后立即禁用变灰,不能关闭;直接开始纯识别也锁灰。服务端持久化该选择,清空、重开或刷新不解锁,已结束会议拒绝追加音频。
|
|
6
|
+
- 音频导入固定为需登录的录音+识别路线,始终私有保留原文件并支持回放;访客入口显示登录要求,不再静默降级为仅文字导入。
|
|
7
|
+
- 新增录音归属 token 与开始/收尾状态,保留尾部上传幂等、清空代次、128 MiB、私有权限、取消回滚和 GPU ASR 分发;旧记录与已有混合音频保守迁移且不删除。
|
|
8
|
+
|
|
9
|
+
## 0.3.1 - 2026-10-06
|
|
10
|
+
|
|
11
|
+
- 将音频导入上限提高到 128 MiB,前后端和上传大小检查保持一致。
|
|
12
|
+
- 大于 12 MiB 的文件通过 FFmpeg 按 30 秒、16 kHz 单声道 PCM 窗口顺序处理,复用既有 ASR dispatcher 与持久 GPU 模型,不另起模型 worker。
|
|
13
|
+
- 服务端识别预算提高到 15 分钟,网页上传与识别总预算为 30 分钟;块间检查取消,失败不提交部分转写或残留会议。
|
|
14
|
+
- 同步中文与英文上限/FFmpeg/等待时间说明,保留默认不归档和账号私有保留策略。
|
|
15
|
+
|
|
3
16
|
## 0.3.0 - 2026-10-06
|
|
4
17
|
|
|
5
18
|
### 新增
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ChatVoice
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.2
|
|
4
4
|
Summary: ChatArch voice recording, transcription, and meeting-notes toolkit.
|
|
5
5
|
Author-email: ChatArch <rex@chatarch.org>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -60,7 +60,7 @@ ChatVoice 是 ChatArch 的录音转写与会议工作区 Python 包,包含 Spe
|
|
|
60
60
|
要求 Python 3.10 或更高版本,建议安装到独立虚拟环境。
|
|
61
61
|
|
|
62
62
|
```bash
|
|
63
|
-
python -m pip install "ChatVoice[web]==0.3.
|
|
63
|
+
python -m pip install "ChatVoice[web]==0.3.2"
|
|
64
64
|
chatvoice --version
|
|
65
65
|
chatvoice --tree
|
|
66
66
|
chatvoice serve app --dry-run --json
|
|
@@ -70,8 +70,8 @@ chatvoice serve app --dry-run --json
|
|
|
70
70
|
|
|
71
71
|
## 当前能力
|
|
72
72
|
|
|
73
|
-
-
|
|
74
|
-
-
|
|
73
|
+
- **会议记录**:空白会议开始前用按钮二选一:“纯识别”用后即弃原始音频且无回放;登录账号可选“录音+识别”,私有保留本次会议录音并回放。首次开始即永久锁定,结束后追加音频必须新建会议。
|
|
74
|
+
- **录音导入**:登录后导入不超过 128 MiB 的已有音频;导入固定属于“录音+识别”,保留原文件并支持回放。超过 12 MiB 时顺序解码为 30 秒语音块复用当前 ASR 通道。
|
|
75
75
|
- **摘要与纪要**:生成摘要,手动编辑纪要,或通过对话修改并撤销。
|
|
76
76
|
- **Markdown Todo**:由用户点击“转为 Todo”,在独立页面继续编辑、对话完善、复制或下载 `.md`;不会自动转换或执行任务。
|
|
77
77
|
- **声音工作室**:配置系统音色与输出格式;通过独立声音复刻服务,以授权参考音频生成临时试听结果。
|
|
@@ -82,9 +82,9 @@ chatvoice serve app --dry-run --json
|
|
|
82
82
|
|
|
83
83
|
## 数据与安全边界
|
|
84
84
|
|
|
85
|
-
账号记录保存到 `~/.chatarch/chatvoice` 下的 SQLite
|
|
85
|
+
账号记录保存到 `~/.chatarch/chatvoice` 下的 SQLite;访客记录仅存于当前浏览器。访客仅能使用纯识别;录音+识别及文件导入要求登录,并给出可见说明而不静默降级。私有文件的播放、下载和删除均校验所有权。密钥不进入浏览器。
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
清空会议不会解除模式锁;显式清空或删除仍按既有规则清理关联录音。迁移保守保留旧音频,不因模式归类删除历史数据。数据库备份不包含录音文件,使用录音+识别时须同时备份私有音频目录。
|
|
88
88
|
|
|
89
89
|
自助注册关闭,由部署者创建受邀账号。ChatVoice 直接依赖 ChatLogin 0.1.2 的内建 `ChatVoiceAuth`,复用既有账号、会话和 CSRF;`/login` 使用可定制的共享 `LoginUI`。会议所有权和 Token 权限仍由 ChatVoice 控制,访客草稿等待 IndexedDB 事务提交后才跳转登录。详见[数据保留边界](https://arch.gh.wzhecnu.cn/ChatVoice/recording-storage/)。
|
|
90
90
|
|
|
@@ -20,7 +20,7 @@ ChatVoice is the ChatArch Python package behind the Speakr recording and meeting
|
|
|
20
20
|
Python 3.10+ is required. Use a dedicated virtual environment.
|
|
21
21
|
|
|
22
22
|
```bash
|
|
23
|
-
python -m pip install "ChatVoice[web]==0.3.
|
|
23
|
+
python -m pip install "ChatVoice[web]==0.3.2"
|
|
24
24
|
chatvoice --version
|
|
25
25
|
chatvoice --tree
|
|
26
26
|
chatvoice serve app --dry-run --json
|
|
@@ -31,7 +31,7 @@ Installation neither starts a service nor downloads GPU models. The quick start
|
|
|
31
31
|
## Capabilities
|
|
32
32
|
|
|
33
33
|
- Meeting recording, live transcription, pause/resume, titles, tags and history. Audio is discarded by default; account users may explicitly retain recordings for owner-protected playback and download.
|
|
34
|
-
-
|
|
34
|
+
- A blank meeting has exactly two routes: recognition-only discards source audio with no replay; signed-in users may choose recording + recognition to retain and replay this meeting. First start locks the route permanently. Import requires login, always retains the source for replay, and supports files up to 128 MiB (over 12 MiB uses sequential 30-second ASR windows).
|
|
35
35
|
- Summary generation, direct editing, conversation-based refinement and undo.
|
|
36
36
|
- Explicit summary-to-Todo conversion, a separate Markdown editor and refinement conversation, copy and `.md` export. No automatic conversion or task execution.
|
|
37
37
|
- Configurable system TTS and an independent one-shot voice-cloning service.
|
|
@@ -44,7 +44,7 @@ Model configuration is server-side. Independent text settings serve notes and ti
|
|
|
44
44
|
|
|
45
45
|
Account records use SQLite below `~/.chatarch/chatvoice`. Guest records remain in the browser. Original audio is discarded by default; explicit account opt-in stores private files associated with the meeting. Playback, download and deletion check ownership. Guests cannot retain server recordings. Provider keys never reach the browser.
|
|
46
46
|
|
|
47
|
-
Clearing
|
|
47
|
+
Clearing does not unlock a meeting route; a finished meeting needs a new meeting for more audio. Explicit clear/delete keeps existing cleanup semantics, while migration never deletes legacy audio. A database backup does not include recording bytes; back up the private audio directory together with the database when retention is used.
|
|
48
48
|
|
|
49
49
|
Self-registration is disabled; operators provision invited accounts. ChatVoice uses the built-in `ChatVoiceAuth` backend from ChatLogin 0.1.2 and a customizable shared `LoginUI` at `/login`. Existing accounts, sessions and CSRF remain compatible; ChatVoice retains owner and token policy. Guest drafts must commit their IndexedDB transaction before login navigation.
|
|
50
50
|
|
|
@@ -20,7 +20,7 @@ ChatVoice 是 ChatArch 的录音转写与会议工作区 Python 包,包含 Spe
|
|
|
20
20
|
要求 Python 3.10 或更高版本,建议安装到独立虚拟环境。
|
|
21
21
|
|
|
22
22
|
```bash
|
|
23
|
-
python -m pip install "ChatVoice[web]==0.3.
|
|
23
|
+
python -m pip install "ChatVoice[web]==0.3.2"
|
|
24
24
|
chatvoice --version
|
|
25
25
|
chatvoice --tree
|
|
26
26
|
chatvoice serve app --dry-run --json
|
|
@@ -30,8 +30,8 @@ chatvoice serve app --dry-run --json
|
|
|
30
30
|
|
|
31
31
|
## 当前能力
|
|
32
32
|
|
|
33
|
-
-
|
|
34
|
-
-
|
|
33
|
+
- **会议记录**:空白会议开始前用按钮二选一:“纯识别”用后即弃原始音频且无回放;登录账号可选“录音+识别”,私有保留本次会议录音并回放。首次开始即永久锁定,结束后追加音频必须新建会议。
|
|
34
|
+
- **录音导入**:登录后导入不超过 128 MiB 的已有音频;导入固定属于“录音+识别”,保留原文件并支持回放。超过 12 MiB 时顺序解码为 30 秒语音块复用当前 ASR 通道。
|
|
35
35
|
- **摘要与纪要**:生成摘要,手动编辑纪要,或通过对话修改并撤销。
|
|
36
36
|
- **Markdown Todo**:由用户点击“转为 Todo”,在独立页面继续编辑、对话完善、复制或下载 `.md`;不会自动转换或执行任务。
|
|
37
37
|
- **声音工作室**:配置系统音色与输出格式;通过独立声音复刻服务,以授权参考音频生成临时试听结果。
|
|
@@ -42,9 +42,9 @@ chatvoice serve app --dry-run --json
|
|
|
42
42
|
|
|
43
43
|
## 数据与安全边界
|
|
44
44
|
|
|
45
|
-
账号记录保存到 `~/.chatarch/chatvoice` 下的 SQLite
|
|
45
|
+
账号记录保存到 `~/.chatarch/chatvoice` 下的 SQLite;访客记录仅存于当前浏览器。访客仅能使用纯识别;录音+识别及文件导入要求登录,并给出可见说明而不静默降级。私有文件的播放、下载和删除均校验所有权。密钥不进入浏览器。
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
清空会议不会解除模式锁;显式清空或删除仍按既有规则清理关联录音。迁移保守保留旧音频,不因模式归类删除历史数据。数据库备份不包含录音文件,使用录音+识别时须同时备份私有音频目录。
|
|
48
48
|
|
|
49
49
|
自助注册关闭,由部署者创建受邀账号。ChatVoice 直接依赖 ChatLogin 0.1.2 的内建 `ChatVoiceAuth`,复用既有账号、会话和 CSRF;`/login` 使用可定制的共享 `LoginUI`。会议所有权和 Token 权限仍由 ChatVoice 控制,访客草稿等待 IndexedDB 事务提交后才跳转登录。详见[数据保留边界](https://arch.gh.wzhecnu.cn/ChatVoice/recording-storage/)。
|
|
50
50
|
|
|
@@ -55,16 +55,18 @@ These endpoints require account cookies and ownership, with CSRF for writes. Rea
|
|
|
55
55
|
|
|
56
56
|
| Method and path | Input and result |
|
|
57
57
|
| --- | --- |
|
|
58
|
-
| `POST /api/meetings/{id}/
|
|
58
|
+
| `POST /api/meetings/{id}/capture/start` | JSON `meeting_mode`, `capture_token`; atomically lock a blank meeting and own its capture |
|
|
59
|
+
| `POST /api/meetings/{id}/capture/finish` | JSON `capture_token`; mark the matching started capture finished, idempotently |
|
|
60
|
+
| `POST /api/meetings/{id}/audio` | Multipart `file`, `upload_token`, `capture_token`, `generation`; normal recording-route tail, up to 128 MiB |
|
|
59
61
|
| `GET /api/meetings/{id}/audio/{audio_id}` | Private playback with controlled audio MIME and no caching |
|
|
60
62
|
| `GET /api/meetings/{id}/audio/{audio_id}/download` | Attachment download of the same private file |
|
|
61
63
|
| `DELETE /api/meetings/{id}/audio` | Delete all associated audio and increment recording generation |
|
|
62
|
-
| `POST /api/meetings/{id}/import` | Multipart `file`, `import_token`, optional `
|
|
64
|
+
| `POST /api/meetings/{id}/import` | Multipart `file`, `import_token`, optional `channel`, `correct`; always retains source, up to 128 MiB |
|
|
63
65
|
| `DELETE /api/meeting-imports/{import_token}` | Cancel an owned import, also removing a just-committed meeting in a completion race |
|
|
64
66
|
|
|
65
|
-
Meeting writes
|
|
67
|
+
Meeting writes return `meeting_mode`, `mode_locked` and `capture_state`; legacy `audio_retention` still maps to the two modes, and omitted mode fields preserve the current choice. Explicit reverse mutation after lock returns 409. Details also include `audio_assets` and read-only `audio_generation`. Recognition-only has no audio asset/replay. Recording uploads validate both capture ownership and generation; stale uploads after clear return 409.
|
|
66
68
|
|
|
67
|
-
Import
|
|
69
|
+
Import requires an account, never overwrites a meeting, and returns a locked, finished recording + recognition meeting with replayable source. Even legacy `retain_audio=false` cannot downgrade it. Repeating a completed token returns the existing result; cancelled/failed tokens cannot silently recognize again. Empty files return 400, size limits 413, invalid container/MIME 415, conflicts/cancellation 409, invalid model output 502, storage failure 503, and ASR timeout 504. Failures create no half-finished meeting.
|
|
68
70
|
|
|
69
71
|
## Text processing {#text}
|
|
70
72
|
|
|
@@ -55,16 +55,18 @@ app = create_app(login_ui=LoginUI(
|
|
|
55
55
|
|
|
56
56
|
| 方法与路径 | 请求与结果 |
|
|
57
57
|
| --- | --- |
|
|
58
|
-
| `POST /api/meetings/{id}/
|
|
58
|
+
| `POST /api/meetings/{id}/capture/start` | JSON:`meeting_mode`、`capture_token`;仅空白会议,原子锁定路线与本次采集 |
|
|
59
|
+
| `POST /api/meetings/{id}/capture/finish` | JSON:`capture_token`;把匹配的已开始采集标记为完成,可幂等重试 |
|
|
60
|
+
| `POST /api/meetings/{id}/audio` | multipart:`file`、`upload_token`、`capture_token`、`generation`;录音+识别的正常尾部,最大 128 MiB |
|
|
59
61
|
| `GET /api/meetings/{id}/audio/{audio_id}` | 私有音频播放;受控音频 MIME 与禁止缓存 |
|
|
60
62
|
| `GET /api/meetings/{id}/audio/{audio_id}/download` | 同一私有文件的附件下载 |
|
|
61
63
|
| `DELETE /api/meetings/{id}/audio` | 清理会议所有音频并递增录音代次 |
|
|
62
|
-
| `POST /api/meetings/{id}/import` | multipart:`file`、`import_token`,可选 `
|
|
64
|
+
| `POST /api/meetings/{id}/import` | multipart:`file`、`import_token`,可选 `channel`、`correct`;固定保留原文件,最大 128 MiB |
|
|
63
65
|
| `DELETE /api/meeting-imports/{import_token}` | 取消自己的导入;完成与取消交错时也清理刚建立的会议 |
|
|
64
66
|
|
|
65
|
-
|
|
67
|
+
会议保存返回 `meeting_mode`、`mode_locked`、`capture_state`;旧 `audio_retention` 字段继续映射两种模式,省略模式字段会保留既有选择。锁定后显式反向修改返回 409。详情还返回 `audio_assets` 和只读 `audio_generation`。纯识别无音频资产/回放;录音上传同时校验采集身份与代次,清空后的旧上传返回 409。
|
|
66
68
|
|
|
67
|
-
|
|
69
|
+
导入要求账号且不覆盖已有会议,固定返回已锁定、已完成的录音+识别 `meeting` 并保留可回放原文件;旧客户端提交 `retain_audio=false` 也不会降级。相同完成 token 返回既有结果。取消或失败 token 不能静默重复识别。空文件 400、超限 413、容器/MIME 错误 415、冲突/取消 409、无效模型结果 502、存储失败 503、识别超时 504;失败时不留下半成品会议。
|
|
68
70
|
|
|
69
71
|
## 文本处理 {#text}
|
|
70
72
|
|
|
@@ -5,8 +5,8 @@ This map explains what ChatVoice owns. Invocation details live in the [CLI tree]
|
|
|
5
5
|
| Capability | Entry | Dependency/boundary |
|
|
6
6
|
| --- | --- | --- |
|
|
7
7
|
| Recording and transcription | Web, ASR HTTP/WebSocket | Microphone permission and configured ASR; stub is only a fixture |
|
|
8
|
-
|
|
|
9
|
-
| Existing audio import | Web and meeting-import APIs |
|
|
8
|
+
| Two meeting routes and lock | Web and meeting-audio APIs | Choose recognition-only or recording + recognition while blank; first start persists the lock and finished meetings reject append |
|
|
9
|
+
| Existing audio import | Web and meeting-import APIs | Login required, always retained and replayable; configured ASR, 128 MiB, cancellation/rollback |
|
|
10
10
|
| Summaries and refinement | Web, notes API | Independent text model; transcript is retained |
|
|
11
11
|
| Markdown Todo | Web, Todo API, Python callback module | Explicit conversion/edit/refinement/undo/export; no task execution |
|
|
12
12
|
| Meeting and conversation storage | Web and account APIs | Account SQLite or guest IndexedDB |
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
| 能力 | 当前入口 | 依赖与边界 |
|
|
6
6
|
| --- | --- | --- |
|
|
7
7
|
| 录音转写 | 网页、ASR HTTP/WebSocket | 麦克风权限与已配置 ASR;stub 仅供验证 |
|
|
8
|
-
|
|
|
9
|
-
| 已有录音导入 | 网页、会议导入接口 |
|
|
8
|
+
| 会议双路线与锁定 | 网页、会议音频接口 | 默认纯识别;单向启用录音+识别后立即锁灰,首次开始纯识别也锁;完成后不得追加 |
|
|
9
|
+
| 已有录音导入 | 网页、会议导入接口 | 需登录,固定保留并可回放;当前 ASR 通道、128 MiB、取消与失败回滚 |
|
|
10
10
|
| 摘要与完善 | 网页、纪要接口 | 独立文本模型;保留转写 |
|
|
11
11
|
| Markdown Todo | 网页、Todo 接口、Python 回调模块 | 手动触发、可编辑/对话/撤销/导出,不执行任务 |
|
|
12
12
|
| 会议与实时对话存储 | 网页、账号数据接口 | 账号 SQLite;访客 IndexedDB |
|
|
@@ -12,7 +12,7 @@ Choose a service shape first. ChatVoice ships a web server, not a system-service
|
|
|
12
12
|
## Install and inspect
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
|
-
python -m pip install "ChatVoice[web]==0.3.
|
|
15
|
+
python -m pip install "ChatVoice[web]==0.3.2"
|
|
16
16
|
chatvoice paths --json
|
|
17
17
|
chatvoice doctor --json
|
|
18
18
|
chatvoice service plan --ensure-dirs --json
|
|
@@ -36,7 +36,7 @@ Python 3.10+ is required. This POSIX example uses a virtual environment under Ch
|
|
|
36
36
|
```bash
|
|
37
37
|
python3 -m venv "$HOME/.chatarch/chatvoice/.venv"
|
|
38
38
|
. "$HOME/.chatarch/chatvoice/.venv/bin/activate"
|
|
39
|
-
python -m pip install "ChatVoice[web]==0.3.
|
|
39
|
+
python -m pip install "ChatVoice[web]==0.3.2"
|
|
40
40
|
chatvoice --version
|
|
41
41
|
chatvoice --tree
|
|
42
42
|
```
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
```bash
|
|
37
37
|
python3 -m venv "$HOME/.chatarch/chatvoice/.venv"
|
|
38
38
|
. "$HOME/.chatarch/chatvoice/.venv/bin/activate"
|
|
39
|
-
python -m pip install "ChatVoice[web]==0.3.
|
|
39
|
+
python -m pip install "ChatVoice[web]==0.3.2"
|
|
40
40
|
chatvoice --version
|
|
41
41
|
chatvoice --tree
|
|
42
42
|
```
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Data Retention Boundary
|
|
2
|
+
|
|
3
|
+
Every blank meeting defaults to **recognition-only**, discarding source audio without replay. Before starting, a signed-in user may click **Enable recording + recognition** once to retain and replay this meeting; successful activation immediately greys and disables the button. It is not a reversible mode selector.
|
|
4
|
+
|
|
5
|
+
| Data | Account mode | Guest mode |
|
|
6
|
+
| --- | --- | --- |
|
|
7
|
+
| Title, tags and transcript | Owner-isolated server SQLite | Current-browser IndexedDB |
|
|
8
|
+
| Summary, note refinement, Markdown Todo and conversations | Stored with the meeting | Stored with the local meeting |
|
|
9
|
+
| Original meeting recording | Recognition-only discards it; recording + recognition retains it privately | Recognition-only; no recording archive |
|
|
10
|
+
| Imported original file | Always privately retained and replayable | Import is unavailable with a visible login explanation |
|
|
11
|
+
| Realtime conversation text | Stored with the conversation | Browser-local record |
|
|
12
|
+
| Provider credentials | Server-side only | Never sent to the browser |
|
|
13
|
+
|
|
14
|
+
## Choose a recording mode
|
|
15
|
+
|
|
16
|
+
| Mode | Behavior | Available to |
|
|
17
|
+
| --- | --- | --- |
|
|
18
|
+
| Recognition-only | Discard all source audio after processing and expose no replay | Default for accounts and guests |
|
|
19
|
+
| Recording + recognition | Capture from recording start, associate it with this meeting after normal completion, and allow replay | Logged-in accounts |
|
|
20
|
+
|
|
21
|
+
Enabling recording locks that choice immediately but still permits the first capture. Starting recognition-only without activation also greys the button and locks the route before text arrives. Pause/resume and normal tail finalization remain part of that capture. After finish, create a new meeting for more audio. Clear, reopen and reload do not unlock, and started meetings reject another recording or import. Recording archives remain limited to 128 MiB.
|
|
22
|
+
|
|
23
|
+
The backend stores lock, start/final state and owned capture identity, rejecting later changes in either direction. Legacy records and mixed retained assets migrate conservatively as finished and are never deleted by classification.
|
|
24
|
+
|
|
25
|
+
## Import existing audio
|
|
26
|
+
|
|
27
|
+
Use the audio-import control in the meeting recorder. WAV, MP3, WebM, Ogg, M4A/MP4 and FLAC containers are accepted up to 128 MiB per file; actual decoding depends on the selected ASR channel. Successful import opens a normal meeting for titles, summaries and note refinement, not a separate audio library.
|
|
28
|
+
|
|
29
|
+
Import always creates a locked, finished recording + recognition meeting and retains the original for replay; retention is not optional. Import requires login, while guests receive a visible explanation rather than a silent text-only downgrade. Recognition failures, empty results, cancellation and storage failures create no half-finished meeting. Cancellation prevents result commit but cannot promise immediate upstream interruption.
|
|
30
|
+
|
|
31
|
+
Files over 12 MiB require FFmpeg on the main-service host. Decoding produces sequential 30-second, 16-kHz mono WAV windows through the selected ASR channel and reuses the existing persistent GPU model. Server recognition has a 15-minute budget with cancellation checks between windows. The browser has a 30-minute total upload-and-recognition budget; a long upload consumes that total. Allow 128 MiB plus multipart overhead at the reverse proxy and an ASR request wait of at least 1020 seconds. Smaller files retain the original ASR path.
|
|
32
|
+
|
|
33
|
+
## Private files and deletion
|
|
34
|
+
|
|
35
|
+
- Retained files live in runtime `data/meeting-audio/`, using server-generated names, `0700` directories and `0600` files.
|
|
36
|
+
- Playback and download require a valid account session and meeting ownership. They are not anonymous links; read-only data tokens do not automatically grant audio-file access.
|
|
37
|
+
- Clearing a meeting deletes associated audio and invalidates old uploads; deleting a meeting also cleans its audio. Cleanup failures are reported rather than counted as successful deletion.
|
|
38
|
+
- Downloaded, exported, backed-up or third-party copies have independent lifecycles. Confirm authorization before retaining or using recordings.
|
|
39
|
+
|
|
40
|
+
## Processing is not archiving
|
|
41
|
+
|
|
42
|
+
Microphone and imported audio pass through the browser, ChatVoice and the selected ASR provider. Temporary files under `temp/asr` or `temp/audio-uploads` may be used for decoding, recognition or validation and are removed during normal cleanup. External services have their own policies. Discarding recordings does not mean audio never crosses the network or disk, nor that guest transcription works offline.
|
|
43
|
+
|
|
44
|
+
Voice-studio TTS/cloning output remains temporary task preview/download audio. Cloning requires an authorized reference and creates neither a permanent voice library nor generation history. The meeting retention mode does not retain raw realtime-conversation audio.
|
|
45
|
+
|
|
46
|
+
## Backups
|
|
47
|
+
|
|
48
|
+
`chatvoice data dump` backs up SQLite only, not recording bytes. When retaining audio, stop the service normally and back up or restore the consistent database snapshot together with `data/meeting-audio/`. Restoring only the database cannot recover missing recordings. Code rollback must not overwrite newer records with a stale database.
|
|
49
|
+
|
|
50
|
+
[Runtime and backup](runtime-layout.md) · [Access and API](api-access.md) · [Web guide](web-guide.md)
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# 数据保留边界
|
|
2
|
+
|
|
3
|
+
每条空白会议默认**纯识别**:原始音频用后即弃,不提供回放。账号用户可在开始前点击一次**启用录音+识别**按钮,保留并回放本次录音;按钮点击生效后立即灰掉,不能再关闭,也不是可反复选择的选项。
|
|
4
|
+
|
|
5
|
+
| 数据 | 账号模式 | 访客模式 |
|
|
6
|
+
| --- | --- | --- |
|
|
7
|
+
| 标题、标签、转写 | 服务器 SQLite,按账号隔离 | 当前浏览器 IndexedDB |
|
|
8
|
+
| 摘要、纪要完善、Markdown Todo 与对话 | 随会议保存 | 随本地会议保存 |
|
|
9
|
+
| 会议原始录音 | 纯识别丢弃;录音+识别私有保留 | 仅纯识别,不建立录音档案 |
|
|
10
|
+
| 导入的原始文件 | 固定私有保留并支持回放 | 不允许导入,提示登录 |
|
|
11
|
+
| 实时对话文字 | 随对话记录保存 | 当前浏览器保存 |
|
|
12
|
+
| 模型服务密钥 | 仅服务端配置 | 不发送到浏览器 |
|
|
13
|
+
|
|
14
|
+
## 选择录音模式
|
|
15
|
+
|
|
16
|
+
| 模式 | 行为 | 适用范围 |
|
|
17
|
+
| --- | --- | --- |
|
|
18
|
+
| 纯识别 | 处理后丢弃全部原始音频,不显示回放 | 默认;账号和访客 |
|
|
19
|
+
| 录音+识别 | 从开始录音时采集浏览器编码的音频,正常结束后与本次会议关联并可回放 | 已登录账号 |
|
|
20
|
+
|
|
21
|
+
点击启用后即持久锁定录音+识别,仍允许首次开始录音。未启用而直接开始纯识别,也会在文字到达前灰掉按钮并锁定路线。暂停与继续、正常尾部收尾仍属于同一次录音;结束后必须新建会议才能增加音频。清空、重开或刷新不会解锁,也不能向已开始的会议导入或挂接另一段录音。录音归档最大 128 MiB;超限或浏览器录音失败会显示具体原因。
|
|
22
|
+
|
|
23
|
+
服务端保存锁定、开始/完成状态及本次采集身份,两方向的后续模式切换都会被拒绝。旧记录和已有混合音频按最保守方式归类为已完成,不因迁移删除文件。
|
|
24
|
+
|
|
25
|
+
## 导入已有音频
|
|
26
|
+
|
|
27
|
+
在会议录音控制区点击 **导入录音**。接受 WAV、MP3、WebM、Ogg、M4A/MP4、FLAC 容器,单个文件最大 128 MiB,实际解码能力取决于所选 ASR 通道。成功后打开普通会议,继续生成标题、摘要和完善纪要;不会建立独立的音频文件库。
|
|
28
|
+
|
|
29
|
+
导入始终建立已锁定、已完成的“录音+识别”会议并保留原始文件;不是可选保存。导入要求登录,访客会看到说明且不会静默降级。识别失败、空结果、取消或存储失败不会建立半成品会议。取消阻止结果提交,不代表可以立即中断第三方或正在执行的模型计算;取消未确认时应检查会议历史,勿重复提交。
|
|
30
|
+
|
|
31
|
+
超过 12 MiB 的文件需要主服务宿主安装 FFmpeg:服务顺序解码为 30 秒、16 kHz 单声道 WAV 块,每块走所选 ASR 通道,继续复用已有的持久 GPU 模型。服务端识别预算为 15 分钟,取消在块间检查;网页上传与识别合计预算为 30 分钟,长上传会占用该总预算。反向代理需允许 128 MiB 文件及 multipart 开销,并将识别请求等待设为至少 1020 秒。小文件仍使用原 ASR 路径。
|
|
32
|
+
|
|
33
|
+
## 私有文件与清理
|
|
34
|
+
|
|
35
|
+
- 保留文件位于运行目录的 `data/meeting-audio/`,目录权限为 `0700`、文件为 `0600`,文件名由服务端生成。
|
|
36
|
+
- 播放和下载需要有效账号会话与会议所有权,不是匿名直链;只读数据 Token 不自动获得音频文件访问权。
|
|
37
|
+
- 清空会议会删除关联音频并使旧上传失效;删除会议也清理音频。清理失败会报告错误,不把残留当成删除成功。
|
|
38
|
+
- 已下载、导出、备份或第三方保存的副本需要分别管理。保存和使用录音前应确认使用授权。
|
|
39
|
+
|
|
40
|
+
## 处理不等于归档
|
|
41
|
+
|
|
42
|
+
麦克风或导入音频会经过浏览器、ChatVoice 和所选 ASR 服务。服务端可能使用 `temp/asr` 或 `temp/audio-uploads` 的临时文件解码、识别或上传校验,正常处理后清理。外部服务有自己的数据政策。“不保存录音”不代表音频不经过网络或磁盘,也不代表访客转写可离线运行。
|
|
43
|
+
|
|
44
|
+
声音工作室的 TTS/复刻输出仍是当前任务的临时试听/下载结果;复刻参考需本人授权,不建立永久音色库或生成历史。实时对话的原始音频保留不属于会议保存模式。
|
|
45
|
+
|
|
46
|
+
## 备份
|
|
47
|
+
|
|
48
|
+
`chatvoice data dump` 只备份 SQLite,不包含原始音频文件。使用保留模式时,先正常停止服务,再把数据库一致性快照与 `data/meeting-audio/` 一起备份和恢复;只恢复数据库不能恢复丢失的录音。代码回滚不得用旧数据库覆盖新记录。
|
|
49
|
+
|
|
50
|
+
[运行目录与备份](runtime-layout.md) · [权限与接口](api-access.md) · [网页使用](web-guide.md)
|
|
@@ -5,7 +5,7 @@ Speakr has three top-level modes: **meeting recording, voice studio and realtime
|
|
|
5
5
|
| Goal | Entry | Stored content |
|
|
6
6
|
| --- | --- | --- |
|
|
7
7
|
| Capture ideas or a meeting | Recording / transcript | Text, title and tags |
|
|
8
|
-
| Import existing audio or retain a recording |
|
|
8
|
+
| Import existing audio or retain a recording | New-meeting mode button and import control | Recognition-only stores text; recording-and-transcription stores playable audio |
|
|
9
9
|
| Summarize and refine wording | Summary / note refinement | Summary and refinement conversation |
|
|
10
10
|
| Build an action plan | Convert to Todo below the summary | Markdown Todo and its conversation |
|
|
11
11
|
| Synthesize speech | Voice studio | Temporary preview/download, not generation history |
|
|
@@ -21,21 +21,21 @@ Account and guest data do not automatically migrate between modes. Sending audio
|
|
|
21
21
|
## Record and transcribe {#recording}
|
|
22
22
|
|
|
23
23
|
1. Create a meeting and check the ASR channel in settings.
|
|
24
|
-
2.
|
|
24
|
+
2. A blank meeting defaults to **recognition-only**, discarding source audio without replay. Signed-in users may click **Enable recording + recognition** once before start; activation immediately greys and disables the button and retains this meeting's audio. Starting recognition-only without activation also disables it. Guests are recognition-only. Grant microphone access over HTTPS remotely.
|
|
25
25
|
3. Pause and let the current recognition window commit; resuming continues the same meeting.
|
|
26
|
-
4. Finish and wait for the last recognition result
|
|
26
|
+
4. Starting locks the mode permanently for this meeting. Finish and wait for the last recognition result; in recording-and-transcription, also wait for the audio-save confirmation before replay/download.
|
|
27
27
|
|
|
28
28
|
Edit or refresh the title, add tags, and open saved history. Copying a transcript does not export raw audio. Clearing, creating or deleting an active meeting interrupts recording resources; confirm that you intend to discard the active state.
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
The mode cannot switch after starting or finishing. Recognition-only cannot gain audio later, and a recording-and-transcription meeting cannot become recognition-only. A further recording requires a new meeting; pause/resume stays in the same capture. Clearing audio does not unlock the mode; deleting a meeting removes its associated files. Only the owner can replay/download audio. Archives are limited to 128 MiB.
|
|
31
31
|
|
|
32
32
|
## Import existing audio {#audio-import}
|
|
33
33
|
|
|
34
|
-
1.
|
|
35
|
-
2. WAV, MP3, WebM, Ogg, M4A/MP4 and FLAC are accepted up to
|
|
36
|
-
3. The page shows upload/recognition status and a cancel control.
|
|
34
|
+
1. Sign in, then use **Import audio** to select a local file. Guests see a login explanation rather than an import that silently drops the audio.
|
|
35
|
+
2. WAV, MP3, WebM, Ogg, M4A/MP4 and FLAC are accepted up to 128 MiB per file; the configured ASR channel must support decoding the selected format.
|
|
36
|
+
3. The page shows upload/recognition status and a cancel control. Import always creates a recording-and-transcription meeting with retained, replayable original audio; continue with titles, summaries, note refinement and Todo.
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
An imported meeting is locked and cannot gain a second recording; an existing recognition-only meeting cannot be converted by import. Empty, invalid, oversized, failed or cancelled imports create no new meeting. Check history instead of resubmitting if cancellation was not confirmed; model computation may still need to finish normally. See [retention and backup](recording-storage.md).
|
|
39
39
|
|
|
40
40
|
## Summarize and refine {#summary}
|
|
41
41
|
|
|
@@ -5,7 +5,7 @@ Speakr 的顶层入口是 **会议记录、声音工作室、实时对话**。
|
|
|
5
5
|
| 目标 | 入口 | 保存对象 |
|
|
6
6
|
| --- | --- | --- |
|
|
7
7
|
| 留下语音想法或会议内容 | 会议记录 → 文字记录 | 转写文字、标题、标签 |
|
|
8
|
-
| 导入已有录音或保留会议音频 |
|
|
8
|
+
| 导入已有录音或保留会议音频 | 新会话的模式按钮与导入控件 | 纯识别仅保存文字;录音+识别保存音频并回放 |
|
|
9
9
|
| 总结与修改表达 | 实时摘要 / 完善纪要 | 摘要正文与完善对话 |
|
|
10
10
|
| 整理可执行计划 | 摘要下方“转为 Todo” | Markdown Todo 与完善对话 |
|
|
11
11
|
| 让文字变成声音 | 声音工作室 | 本次试听/下载结果,不建立生成历史 |
|
|
@@ -21,21 +21,21 @@ Speakr 的顶层入口是 **会议记录、声音工作室、实时对话**。
|
|
|
21
21
|
## 录音与转写 {#recording}
|
|
22
22
|
|
|
23
23
|
1. 新建会议,确认设置中的识别通道可用。
|
|
24
|
-
2.
|
|
24
|
+
2. 空白会话默认 **纯识别**,音频用后即弃、不提供回放。登录后可在开始前点击一次 **启用录音+识别**:生效后按钮立即灰掉,不能关闭;保存本次原始录音并支持回放。未点而直接开始纯识别,也会灰掉按钮。访客仅能使用纯识别。远程麦克风访问使用 HTTPS。
|
|
25
25
|
3. 暂停时等待当前识别片段提交;继续录音后文字仍归入本条会议。
|
|
26
|
-
4.
|
|
26
|
+
4. 开始时模式即锁定,不能在会话中或结束后切换。结束后等待最后一段识别完成;录音+识别还需等原始录音保存确认,再检查回放/下载。
|
|
27
27
|
|
|
28
28
|
可修改会议标题、手动刷新标题、添加标签,并从历史列表打开记录。复制文字只复制转写,不导出原始音频。清空、新建或删除活动会议会中断当前录音资源,应先确认内容是否需要保留。
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
模式随会话锁定,不能在纯识别会话事后添加录音,也不能在录音+识别会话转回纯识别。再次录音须新建会议;暂停/继续仍是同一次录音。清空录音不解锁模式,删除会议才清理关联内容。音频只有所属账号可播放或下载;归档上限 128 MiB,失败或超限会显示原因。
|
|
31
31
|
|
|
32
32
|
## 导入已有录音 {#audio-import}
|
|
33
33
|
|
|
34
|
-
1.
|
|
35
|
-
2. 支持 WAV、MP3、WebM、Ogg、M4A/MP4、FLAC,单文件最大
|
|
36
|
-
3. 页面显示上传和识别状态,可点击
|
|
34
|
+
1. 登录账号后点击 **导入录音** 选择本地文件;访客不能导入,页面会提示登录。
|
|
35
|
+
2. 支持 WAV、MP3、WebM、Ogg、M4A/MP4、FLAC,单文件最大 128 MiB;所选 ASR 通道必须具备对应解码能力。
|
|
36
|
+
3. 页面显示上传和识别状态,可点击 **取消导入**。导入始终建立“录音+识别”会议,保留原文件并支持回放;成功后继续使用标题、摘要、完善纪要和 Todo。
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
导入后模式已锁定,不能给已有纯识别会话补音频,也不能在导入会议再加录音。空文件、错误、超限、取消或存储失败不留下新会议。取消未确认时检查历史,不重复提交;模型计算可能仍需正常结束。详见[保留边界与备份](recording-storage.md)。
|
|
39
39
|
|
|
40
40
|
## 摘要与完善纪要 {#summary}
|
|
41
41
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ChatVoice
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.2
|
|
4
4
|
Summary: ChatArch voice recording, transcription, and meeting-notes toolkit.
|
|
5
5
|
Author-email: ChatArch <rex@chatarch.org>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -60,7 +60,7 @@ ChatVoice 是 ChatArch 的录音转写与会议工作区 Python 包,包含 Spe
|
|
|
60
60
|
要求 Python 3.10 或更高版本,建议安装到独立虚拟环境。
|
|
61
61
|
|
|
62
62
|
```bash
|
|
63
|
-
python -m pip install "ChatVoice[web]==0.3.
|
|
63
|
+
python -m pip install "ChatVoice[web]==0.3.2"
|
|
64
64
|
chatvoice --version
|
|
65
65
|
chatvoice --tree
|
|
66
66
|
chatvoice serve app --dry-run --json
|
|
@@ -70,8 +70,8 @@ chatvoice serve app --dry-run --json
|
|
|
70
70
|
|
|
71
71
|
## 当前能力
|
|
72
72
|
|
|
73
|
-
-
|
|
74
|
-
-
|
|
73
|
+
- **会议记录**:空白会议开始前用按钮二选一:“纯识别”用后即弃原始音频且无回放;登录账号可选“录音+识别”,私有保留本次会议录音并回放。首次开始即永久锁定,结束后追加音频必须新建会议。
|
|
74
|
+
- **录音导入**:登录后导入不超过 128 MiB 的已有音频;导入固定属于“录音+识别”,保留原文件并支持回放。超过 12 MiB 时顺序解码为 30 秒语音块复用当前 ASR 通道。
|
|
75
75
|
- **摘要与纪要**:生成摘要,手动编辑纪要,或通过对话修改并撤销。
|
|
76
76
|
- **Markdown Todo**:由用户点击“转为 Todo”,在独立页面继续编辑、对话完善、复制或下载 `.md`;不会自动转换或执行任务。
|
|
77
77
|
- **声音工作室**:配置系统音色与输出格式;通过独立声音复刻服务,以授权参考音频生成临时试听结果。
|
|
@@ -82,9 +82,9 @@ chatvoice serve app --dry-run --json
|
|
|
82
82
|
|
|
83
83
|
## 数据与安全边界
|
|
84
84
|
|
|
85
|
-
账号记录保存到 `~/.chatarch/chatvoice` 下的 SQLite
|
|
85
|
+
账号记录保存到 `~/.chatarch/chatvoice` 下的 SQLite;访客记录仅存于当前浏览器。访客仅能使用纯识别;录音+识别及文件导入要求登录,并给出可见说明而不静默降级。私有文件的播放、下载和删除均校验所有权。密钥不进入浏览器。
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
清空会议不会解除模式锁;显式清空或删除仍按既有规则清理关联录音。迁移保守保留旧音频,不因模式归类删除历史数据。数据库备份不包含录音文件,使用录音+识别时须同时备份私有音频目录。
|
|
88
88
|
|
|
89
89
|
自助注册关闭,由部署者创建受邀账号。ChatVoice 直接依赖 ChatLogin 0.1.2 的内建 `ChatVoiceAuth`,复用既有账号、会话和 CSRF;`/login` 使用可定制的共享 `LoginUI`。会议所有权和 Token 权限仍由 ChatVoice 控制,访客草稿等待 IndexedDB 事务提交后才跳转登录。详见[数据保留边界](https://arch.gh.wzhecnu.cn/ChatVoice/recording-storage/)。
|
|
90
90
|
|
|
@@ -69,6 +69,7 @@ src/ChatVoice.egg-info/top_level.txt
|
|
|
69
69
|
src/chatvoice/__init__.py
|
|
70
70
|
src/chatvoice/accounts.py
|
|
71
71
|
src/chatvoice/asr.py
|
|
72
|
+
src/chatvoice/asr_chunks.py
|
|
72
73
|
src/chatvoice/backup.py
|
|
73
74
|
src/chatvoice/cli.py
|
|
74
75
|
src/chatvoice/client.py
|
|
@@ -107,6 +108,7 @@ tests/test_cli_token_data.py
|
|
|
107
108
|
tests/test_config.py
|
|
108
109
|
tests/test_docs_standard.py
|
|
109
110
|
tests/test_documented_interfaces.py
|
|
111
|
+
tests/test_large_audio.py
|
|
110
112
|
tests/test_live_acceptance_contract.py
|
|
111
113
|
tests/test_live_exchanges.py
|
|
112
114
|
tests/test_login_service.py
|
|
@@ -114,9 +116,11 @@ tests/test_meeting_audio_edges.py
|
|
|
114
116
|
tests/test_meeting_audio_import.py
|
|
115
117
|
tests/test_meeting_audio_import_frontend.py
|
|
116
118
|
tests/test_meeting_audio_storage.py
|
|
119
|
+
tests/test_meeting_session_mode_lock.py
|
|
117
120
|
tests/test_nonbrowser_flows.py
|
|
118
121
|
tests/test_nonbrowser_routes.py
|
|
119
122
|
tests/test_nonbrowser_runner_contract.py
|
|
123
|
+
tests/test_one_way_recording_enable.py
|
|
120
124
|
tests/test_public_docs_contract.py
|
|
121
125
|
tests/test_realtime_provider_errors.py
|
|
122
126
|
tests/test_recording_retention_frontend.py
|