ChatVoice 0.3.2__tar.gz → 0.4.0__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.2 → chatvoice-0.4.0}/CHANGELOG.md +10 -0
- {chatvoice-0.3.2/src/ChatVoice.egg-info → chatvoice-0.4.0}/PKG-INFO +8 -2
- {chatvoice-0.3.2 → chatvoice-0.4.0}/README.en.md +4 -1
- {chatvoice-0.3.2 → chatvoice-0.4.0}/README.md +4 -1
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/api-access.en.md +17 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/api-access.md +17 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/configuration.en.md +13 -1
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/configuration.md +13 -1
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/deployment.en.md +1 -1
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/deployment.md +1 -1
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/quickstart.en.md +1 -1
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/quickstart.md +1 -1
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/web-guide.en.md +10 -1
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/web-guide.md +10 -1
- {chatvoice-0.3.2 → chatvoice-0.4.0}/pyproject.toml +3 -2
- {chatvoice-0.3.2 → chatvoice-0.4.0}/scripts/check_ui_contract.py +8 -4
- {chatvoice-0.3.2 → chatvoice-0.4.0/src/ChatVoice.egg-info}/PKG-INFO +8 -2
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/ChatVoice.egg-info/SOURCES.txt +9 -1
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/ChatVoice.egg-info/requires.txt +2 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/__init__.py +1 -1
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/config.py +18 -0
- chatvoice-0.4.0/src/chatvoice/copilot/__init__.py +3 -0
- chatvoice-0.4.0/src/chatvoice/copilot/context.py +133 -0
- chatvoice-0.4.0/src/chatvoice/copilot/materials.py +124 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/text_api.py +9 -4
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/web/legacy_app.py +247 -1
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/web/static/index.html +513 -3
- chatvoice-0.4.0/tests/copilot_frontend_flows.cjs +166 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/nonbrowser_flows.cjs +68 -0
- chatvoice-0.4.0/tests/test_copilot_backend_safety.py +179 -0
- chatvoice-0.4.0/tests/test_copilot_context.py +49 -0
- chatvoice-0.4.0/tests/test_copilot_routes.py +147 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_nonbrowser_flows.py +7 -1
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_version.py +1 -1
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_web_static_contract.py +9 -0
- chatvoice-0.4.0/third_party/Backchannel-COPILOT-NOTICE.md +43 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/.github/workflows/ci.yml +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/.github/workflows/deploy.yaml +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/.github/workflows/preview.yaml +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/.github/workflows/publish.yml +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/AGENTS.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/DEVELOP.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/LICENSE +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/MANIFEST.in +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/capability-map.en.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/capability-map.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/cli-tree.en.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/cli-tree.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/index.en.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/index.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/interface-tree.en.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/interface-tree.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/markdown-todo.en.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/markdown-todo.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/recording-storage.en.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/recording-storage.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/runtime-layout.en.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/runtime-layout.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/testing.en.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/testing.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/text-models.en.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/text-models.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/troubleshooting.en.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/troubleshooting.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/tts-models.en.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/tts-models.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/voice-cloning.en.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/docs/voice-cloning.md +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/mkdocs.yml +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/scripts/check_asr_contract.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/scripts/check_asr_gpu_contract.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/scripts/check_meeting_e2e.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/scripts/check_meeting_notes_canvas_contract.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/scripts/check_meeting_storage_contract.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/scripts/check_meeting_title_contract.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/scripts/check_transcript_extraction.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/scripts/funasr_worker.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/scripts/manage_accounts.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/scripts/probe_qwen_audio.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/scripts/probe_token_plan_tts_ws.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/scripts/smoke_asr_api.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/scripts/smoke_demo.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/scripts/verify_service.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/setup.cfg +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/ChatVoice.egg-info/dependency_links.txt +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/ChatVoice.egg-info/entry_points.txt +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/ChatVoice.egg-info/top_level.txt +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/accounts.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/asr.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/asr_chunks.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/backup.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/cli.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/client.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/doctor.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/health.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/paths.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/scripts/__init__.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/scripts/funasr_worker.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/service.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/todo_markdown.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/tts_api.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/tts_qwen.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/web/__init__.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/web/auth_adapter.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/web/login_ui.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/web/server.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/web/static/login-brand.css +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/web/static/transcript-state.js +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/src/chatvoice/web/upload_limits.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/conftest.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/nonbrowser_audio_import.cjs +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/nonbrowser_harness.cjs +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/nonbrowser_realtime_error.cjs +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/nonbrowser_shared_login.cjs +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/nonbrowser_todo_page.cjs +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_accounts_cli.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_api_tokens.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_chatlogin_auth.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_cli.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_cli_token_data.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_config.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_docs_standard.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_documented_interfaces.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_large_audio.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_live_acceptance_contract.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_live_exchanges.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_login_service.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_meeting_audio_edges.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_meeting_audio_import.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_meeting_audio_import_frontend.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_meeting_audio_storage.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_meeting_session_mode_lock.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_nonbrowser_routes.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_nonbrowser_runner_contract.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_one_way_recording_enable.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_public_docs_contract.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_realtime_provider_errors.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_recording_retention_frontend.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_runtime_cli.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_runtime_env.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_shared_login.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_text_api.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_text_web.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_todo_integration_edges.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_todo_markdown.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_todo_page.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_todo_routes.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_todo_storage.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_tts_api.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_tts_qwen.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_tts_web.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_web_app.py +0 -0
- {chatvoice-0.3.2 → chatvoice-0.4.0}/tests/test_workflow_contract.py +0 -0
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# 更新日志
|
|
2
2
|
|
|
3
|
+
## 0.4.0 - 2026-10-09
|
|
4
|
+
|
|
5
|
+
### 新增
|
|
6
|
+
|
|
7
|
+
- 增加预览版 **会中助手**:`CHATVOICE_COPILOT_ENABLED=1` 后开放 `/copilot`、导航入口和 `/api/copilot/*`。
|
|
8
|
+
- 支持按账号隔离的 TXT/Markdown/PDF/DOCX 材料上传、提取文本预览、删除和大小/数量/文本上限;扫描 PDF 明确提示不支持 OCR。
|
|
9
|
+
- 复用 `/ws/asr/stream` 与会议纪要文本模型生成 SSE 快速回答;证据标注为检索上下文,不伪装外部引用。
|
|
10
|
+
- 引入 `chatvoice.copilot` 纯 Python 上下文/检索/解析层,改写自 Backchannel 的有界 live context 思路,并添加第三方 NOTICE。
|
|
11
|
+
- 增加 `CHATVOICE_ENV_PROFILE`,允许服务加载指定 ChatEnv ChatVoice profile 而不修改全局 active profile。
|
|
12
|
+
|
|
3
13
|
## 0.3.2 - 2026-10-07
|
|
4
14
|
|
|
5
15
|
- 默认纯识别;开始前的“启用录音+识别”是单向按钮,点击生效后立即禁用变灰,不能关闭;直接开始纯识别也锁灰。服务端持久化该选择,清空、重开或刷新不解锁,已结束会议拒绝追加音频。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ChatVoice
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: ChatArch voice recording, transcription, and meeting-notes toolkit.
|
|
5
5
|
Author-email: ChatArch <rex@chatarch.org>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -13,6 +13,7 @@ Classifier: Operating System :: OS Independent
|
|
|
13
13
|
Requires-Python: >=3.10
|
|
14
14
|
Description-Content-Type: text/markdown
|
|
15
15
|
License-File: LICENSE
|
|
16
|
+
License-File: third_party/Backchannel-COPILOT-NOTICE.md
|
|
16
17
|
Requires-Dist: click<9.0,>=8.0
|
|
17
18
|
Requires-Dist: chatstyle<0.3.0,>=0.2.0
|
|
18
19
|
Requires-Dist: chatenv<0.3.0,>=0.2.11
|
|
@@ -26,6 +27,8 @@ Requires-Dist: pydantic<3.0,>=2.0; extra == "web"
|
|
|
26
27
|
Requires-Dist: websockets<16.0,>=12.0; extra == "web"
|
|
27
28
|
Requires-Dist: python-multipart<1.0,>=0.0.9; extra == "web"
|
|
28
29
|
Requires-Dist: jinja2<4.0,>=3.1; extra == "web"
|
|
30
|
+
Requires-Dist: pypdf<7.0,>=4.0; extra == "web"
|
|
31
|
+
Requires-Dist: python-docx<2.0,>=1.1; extra == "web"
|
|
29
32
|
Provides-Extra: dev
|
|
30
33
|
Requires-Dist: build; extra == "dev"
|
|
31
34
|
Requires-Dist: pytest; extra == "dev"
|
|
@@ -60,7 +63,7 @@ ChatVoice 是 ChatArch 的录音转写与会议工作区 Python 包,包含 Spe
|
|
|
60
63
|
要求 Python 3.10 或更高版本,建议安装到独立虚拟环境。
|
|
61
64
|
|
|
62
65
|
```bash
|
|
63
|
-
python -m pip install "ChatVoice[web]==0.
|
|
66
|
+
python -m pip install "ChatVoice[web]==0.4.0"
|
|
64
67
|
chatvoice --version
|
|
65
68
|
chatvoice --tree
|
|
66
69
|
chatvoice serve app --dry-run --json
|
|
@@ -76,10 +79,13 @@ chatvoice serve app --dry-run --json
|
|
|
76
79
|
- **Markdown Todo**:由用户点击“转为 Todo”,在独立页面继续编辑、对话完善、复制或下载 `.md`;不会自动转换或执行任务。
|
|
77
80
|
- **声音工作室**:配置系统音色与输出格式;通过独立声音复刻服务,以授权参考音频生成临时试听结果。
|
|
78
81
|
- **实时对话**:对接当前支持的 Qwen 实时语音模型,需服务端配置和有效使用权限。
|
|
82
|
+
- **会中助手(预览)**:启用 `CHATVOICE_COPILOT_ENABLED=1` 后提供 `/copilot` 和页面内“会中助手”,复用实时转写与会议纪要文本模型,上传材料仅按账号保存提取文本。
|
|
79
83
|
- **程序化访问**:命令行、Python 客户端、受限 API Token,以及单文件数据库备份与恢复。
|
|
80
84
|
|
|
81
85
|
模型配置保留在服务端。摘要和标题使用独立文本设置;Todo 复用摘要模型,不增加一套密钥。ASR HTTP 服务使用 `CHATVOICE_ASR_API_URL`,本地 FunASR 则需要另行准备模型依赖。
|
|
82
86
|
|
|
87
|
+
会中助手预览借鉴并改写 Backchannel 的有界 live context 与轻量文件解析思想,代码以 `chatvoice.copilot` 主机集成形式保存;没有导入 Backchannel 的数据库、音频、PII 或 agent 栈。第三方说明见 `third_party/Backchannel-COPILOT-NOTICE.md`。
|
|
88
|
+
|
|
83
89
|
## 数据与安全边界
|
|
84
90
|
|
|
85
91
|
账号记录保存到 `~/.chatarch/chatvoice` 下的 SQLite;访客记录仅存于当前浏览器。访客仅能使用纯识别;录音+识别及文件导入要求登录,并给出可见说明而不静默降级。私有文件的播放、下载和删除均校验所有权。密钥不进入浏览器。
|
|
@@ -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.
|
|
23
|
+
python -m pip install "ChatVoice[web]==0.4.0"
|
|
24
24
|
chatvoice --version
|
|
25
25
|
chatvoice --tree
|
|
26
26
|
chatvoice serve app --dry-run --json
|
|
@@ -36,10 +36,13 @@ Installation neither starts a service nor downloads GPU models. The quick start
|
|
|
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.
|
|
38
38
|
- Qwen realtime voice conversations when the configured backend grants access.
|
|
39
|
+
- Preview in-meeting Copilot at `/copilot` and in the app navigation when `CHATVOICE_COPILOT_ENABLED=1`. It reuses live ASR and the notes text model; uploaded materials store extracted text per account.
|
|
39
40
|
- CLI and Python clients, scoped API tokens and single-file SQLite backup/restore.
|
|
40
41
|
|
|
41
42
|
Model configuration is server-side. Independent text settings serve notes and titles; Todo reuses the notes model. HTTP ASR uses `CHATVOICE_ASR_API_URL`, while local FunASR requires additional model/runtime dependencies.
|
|
42
43
|
|
|
44
|
+
The Copilot preview adapts Backchannel's bounded live context and lightweight parsing ideas into `chatvoice.copilot`. It does not import Backchannel's database, audio, PII or agent stack. See `third_party/Backchannel-COPILOT-NOTICE.md`.
|
|
45
|
+
|
|
43
46
|
## Data and security
|
|
44
47
|
|
|
45
48
|
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.
|
|
@@ -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.
|
|
23
|
+
python -m pip install "ChatVoice[web]==0.4.0"
|
|
24
24
|
chatvoice --version
|
|
25
25
|
chatvoice --tree
|
|
26
26
|
chatvoice serve app --dry-run --json
|
|
@@ -36,10 +36,13 @@ chatvoice serve app --dry-run --json
|
|
|
36
36
|
- **Markdown Todo**:由用户点击“转为 Todo”,在独立页面继续编辑、对话完善、复制或下载 `.md`;不会自动转换或执行任务。
|
|
37
37
|
- **声音工作室**:配置系统音色与输出格式;通过独立声音复刻服务,以授权参考音频生成临时试听结果。
|
|
38
38
|
- **实时对话**:对接当前支持的 Qwen 实时语音模型,需服务端配置和有效使用权限。
|
|
39
|
+
- **会中助手(预览)**:启用 `CHATVOICE_COPILOT_ENABLED=1` 后提供 `/copilot` 和页面内“会中助手”,复用实时转写与会议纪要文本模型,上传材料仅按账号保存提取文本。
|
|
39
40
|
- **程序化访问**:命令行、Python 客户端、受限 API Token,以及单文件数据库备份与恢复。
|
|
40
41
|
|
|
41
42
|
模型配置保留在服务端。摘要和标题使用独立文本设置;Todo 复用摘要模型,不增加一套密钥。ASR HTTP 服务使用 `CHATVOICE_ASR_API_URL`,本地 FunASR 则需要另行准备模型依赖。
|
|
42
43
|
|
|
44
|
+
会中助手预览借鉴并改写 Backchannel 的有界 live context 与轻量文件解析思想,代码以 `chatvoice.copilot` 主机集成形式保存;没有导入 Backchannel 的数据库、音频、PII 或 agent 栈。第三方说明见 `third_party/Backchannel-COPILOT-NOTICE.md`。
|
|
45
|
+
|
|
43
46
|
## 数据与安全边界
|
|
44
47
|
|
|
45
48
|
账号记录保存到 `~/.chatarch/chatvoice` 下的 SQLite;访客记录仅存于当前浏览器。访客仅能使用纯识别;录音+识别及文件导入要求登录,并给出可见说明而不静默降级。私有文件的播放、下载和删除均校验所有权。密钥不进入浏览器。
|
|
@@ -9,6 +9,7 @@ Web sessions, stored records and model processing have distinct boundaries. All
|
|
|
9
9
|
| Data export | Bearer token with matching scope | Programmatic read-only export |
|
|
10
10
|
| Text/ASR/TTS processing | Currently callable by guests; model keys remain server-side | Process content, not automatically save records |
|
|
11
11
|
| Voice-cloning jobs | Account, job ownership and CSRF for create/delete | Authorized one-shot synthesis |
|
|
12
|
+
| Copilot | Account cookies and owner checks; CSRF for writes | Preview materials and fast answers |
|
|
12
13
|
|
|
13
14
|
!!! warning "Protect public processing endpoints"
|
|
14
15
|
Model-processing routes are not Bearer data-export routes. Operators must control abuse and upstream quota. Hiding credentials from the browser does not make unrestricted model access safe.
|
|
@@ -78,6 +79,22 @@ Import requires an account, never overwrites a meeting, and returns a locked, fi
|
|
|
78
79
|
|
|
79
80
|
Revision deltas use canvas/reply separator markers. Require explicit `done`; socket EOF is not completion. Keep the prior document when the stream fails.
|
|
80
81
|
|
|
82
|
+
## Copilot preview {#copilot}
|
|
83
|
+
|
|
84
|
+
When `CHATVOICE_COPILOT_ENABLED=1` is set:
|
|
85
|
+
|
|
86
|
+
| Method and path | Purpose |
|
|
87
|
+
| --- | --- |
|
|
88
|
+
| `GET /copilot` | Chinese-first in-meeting assistant page |
|
|
89
|
+
| `GET /api/copilot/status` | Enabled state, material limits and preparation policy |
|
|
90
|
+
| `GET /api/copilot/materials` | Current owner's materials |
|
|
91
|
+
| `POST /api/copilot/materials` | Multipart `file`; TXT/MD/PDF/DOCX, CSRF required |
|
|
92
|
+
| `DELETE /api/copilot/materials/{id}` | Delete your material, CSRF required |
|
|
93
|
+
| `POST /api/copilot/answer/stream` | SSE fast answer, CSRF required |
|
|
94
|
+
| `POST /api/copilot/prepare` | Optional speculative preparation; returns 409 when disabled |
|
|
95
|
+
|
|
96
|
+
Answer stream events are `meta`, `delta`, `done` or `error`. `meta.evidence` contains retrieved material snippets, not verified external citations; clients must wait for `done.completion_marker == "copilot.answer.done"`. Requests bind `request_id`, `transcript_revision` and `material_revision`; late or stale results should be discarded by the client.
|
|
97
|
+
|
|
81
98
|
## Markdown Todo {#todo}
|
|
82
99
|
|
|
83
100
|
Generation processes the supplied summary and does not create a meeting record:
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
| 数据导出 | Bearer Token 与对应 scope | 程序化只读导出 |
|
|
10
10
|
| 文本/ASR/TTS 处理 | 当前可供访客调用;服务端持有模型密钥 | 转换内容,不代表已保存记录 |
|
|
11
11
|
| 声音复刻任务 | 账号会话、任务所有权,创建/删除需 CSRF | 授权声音的一次性生成 |
|
|
12
|
+
| 会中助手 | 账号 Cookie + 所有权检查;写操作需 CSRF | 预览版材料与快速回答 |
|
|
12
13
|
|
|
13
14
|
!!! warning "公开入口需要访问与额度控制"
|
|
14
15
|
模型处理接口不是 Bearer 数据导出接口。部署者应限制滥用并核实上游额度,不要把“密钥未暴露给浏览器”误当成无限制开放模型调用。
|
|
@@ -78,6 +79,22 @@ app = create_app(login_ui=LoginUI(
|
|
|
78
79
|
|
|
79
80
|
纪要修改流的 `delta.text` 使用画布/回复分隔标记;消费者必须等待明确 `done`,不能把连接断开当成完成。失败时保留当前正文。
|
|
80
81
|
|
|
82
|
+
## 会中助手预览 {#copilot}
|
|
83
|
+
|
|
84
|
+
启用 `CHATVOICE_COPILOT_ENABLED=1` 后开放:
|
|
85
|
+
|
|
86
|
+
| 方法与路径 | 说明 |
|
|
87
|
+
| --- | --- |
|
|
88
|
+
| `GET /copilot` | 中文优先的会中助手页面 |
|
|
89
|
+
| `GET /api/copilot/status` | 启用状态、材料限制、后台准备策略 |
|
|
90
|
+
| `GET /api/copilot/materials` | 当前账号材料列表 |
|
|
91
|
+
| `POST /api/copilot/materials` | multipart `file`;支持 TXT/MD/PDF/DOCX,需 CSRF |
|
|
92
|
+
| `DELETE /api/copilot/materials/{id}` | 删除自己的材料,需 CSRF |
|
|
93
|
+
| `POST /api/copilot/answer/stream` | SSE 快速回答,需 CSRF |
|
|
94
|
+
| `POST /api/copilot/prepare` | 可选后台准备;未启用自动准备时返回 409 |
|
|
95
|
+
|
|
96
|
+
回答流事件为 `meta`、`delta`、`done` 或 `error`。`meta.evidence` 是检索到的材料片段,不是外部验证引用;调用方必须等待 `done.completion_marker == "copilot.answer.done"`。请求绑定 `request_id`、`transcript_revision`、`material_revision`,迟到或失效结果应由客户端丢弃。
|
|
97
|
+
|
|
81
98
|
## Markdown Todo {#todo}
|
|
82
99
|
|
|
83
100
|
生成只处理传入摘要;不会自动创建会议记录。
|
|
@@ -10,6 +10,7 @@ Enable only the capabilities you need. This reference follows the released `Chat
|
|
|
10
10
|
| System speech | TTS protocol, endpoint, key, model and voices | [TTS](tts-models.md) |
|
|
11
11
|
| Voice cloning | VoiceClone URL | [Voice cloning](voice-cloning.md) |
|
|
12
12
|
| Realtime | Legacy audio credentials and valid model entitlement | [Web guide](web-guide.md#realtime) |
|
|
13
|
+
| Copilot preview | Feature flag, notes text model and ASR | [Web guide](web-guide.md#copilot) |
|
|
13
14
|
|
|
14
15
|
## Use ChatEnv {#chatenv}
|
|
15
16
|
|
|
@@ -41,7 +42,7 @@ The probe makes real text/TTS requests and can consume quota. Reload the service
|
|
|
41
42
|
| `CHATVOICE_MEETING_TITLE_API_KEY` | Sensitive title credential |
|
|
42
43
|
| `CHATVOICE_MEETING_TITLE_MODEL` | Title model identifier |
|
|
43
44
|
|
|
44
|
-
Setting an independent base or key requires the complete base/key/model triple for that purpose. You may explicitly configure equal values for both purposes, but missing values are never borrowed. Todo needs no additional model setting.
|
|
45
|
+
Setting an independent base or key requires the complete base/key/model triple for that purpose. You may explicitly configure equal values for both purposes, but missing values are never borrowed. Todo needs no additional model setting. The in-meeting Copilot fast answer path also reuses the notes model; missing notes configuration returns HTTP 503 and never borrows voice, title or browser-supplied arbitrary model settings.
|
|
45
46
|
|
|
46
47
|
```dotenv
|
|
47
48
|
CHATVOICE_MEETING_NOTES_API_BASE=https://model.example.com/v1
|
|
@@ -54,6 +55,17 @@ CHATVOICE_MEETING_TITLE_MODEL=title-model
|
|
|
54
55
|
|
|
55
56
|
All example addresses, keys and model names are placeholders.
|
|
56
57
|
|
|
58
|
+
## Copilot preview {#copilot}
|
|
59
|
+
|
|
60
|
+
| Field | Default | Meaning |
|
|
61
|
+
| --- | --- | --- |
|
|
62
|
+
| `CHATVOICE_COPILOT_ENABLED` | `0` | Enables `/copilot`, app navigation and `/api/copilot/*` |
|
|
63
|
+
| `CHATVOICE_COPILOT_AUTO_PREPARE` | `0` | Allows speculative draft preparation; off by default, manual Submit remains available |
|
|
64
|
+
| `CHATVOICE_COPILOT_THINKING_MODE` | `provider-default` | Fast-answer thinking policy: `provider-default` adds no vendor field; `ark-disabled` sends Volcengine Ark `thinking.type=disabled` only for the Copilot request; other values fail closed |
|
|
65
|
+
| `CHATVOICE_ENV_PROFILE` | Empty | Load a named ChatEnv ChatVoice profile without changing the global active profile; missing names do not fall back to active |
|
|
66
|
+
|
|
67
|
+
Uploads accept TXT, Markdown, PDF and DOCX; URL fetch is not supported. PDFs with no extractable text return an OCR-not-supported error. Material text, pre-meeting instructions and answer state are isolated by logged-in owner; writes use the existing cookie and CSRF boundary.
|
|
68
|
+
|
|
57
69
|
## ASR {#asr}
|
|
58
70
|
|
|
59
71
|
| Field | Default | Meaning |
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
| 系统音色 | TTS 协议、地址、密钥、模型、音色 | [语音合成](tts-models.md) |
|
|
11
11
|
| 我的复刻声音 | VoiceClone 地址 | [声音复刻](voice-cloning.md) |
|
|
12
12
|
| 实时对话 | 兼容语音配置与有效模型权限 | [网页使用](web-guide.md#realtime) |
|
|
13
|
+
| 会中助手预览 | 功能开关、纪要文本模型、ASR | [网页使用](web-guide.md#copilot) |
|
|
13
14
|
|
|
14
15
|
## 使用 ChatEnv {#chatenv}
|
|
15
16
|
|
|
@@ -41,7 +42,7 @@ chatenv test -t chatvoice -I
|
|
|
41
42
|
| `CHATVOICE_MEETING_TITLE_API_KEY` | 标题专用密钥,敏感 |
|
|
42
43
|
| `CHATVOICE_MEETING_TITLE_MODEL` | 标题模型标识 |
|
|
43
44
|
|
|
44
|
-
填写某用途的独立地址或密钥时,该用途的地址、密钥、模型必须齐全。两用途可以显式填写相同的服务值,但不会互相借用缺失字段。Todo
|
|
45
|
+
填写某用途的独立地址或密钥时,该用途的地址、密钥、模型必须齐全。两用途可以显式填写相同的服务值,但不会互相借用缺失字段。Todo 不需要新增模型配置。会中助手快速回答也复用纪要模型;缺失时返回 503,不借用语音、标题或浏览器提供的任意模型设置。
|
|
45
46
|
|
|
46
47
|
```dotenv
|
|
47
48
|
CHATVOICE_MEETING_NOTES_API_BASE=https://model.example.com/v1
|
|
@@ -54,6 +55,17 @@ CHATVOICE_MEETING_TITLE_MODEL=title-model
|
|
|
54
55
|
|
|
55
56
|
示例地址、密钥与模型名都是占位值,应替换为已获授权服务的真实设置。
|
|
56
57
|
|
|
58
|
+
## 会中助手预览 {#copilot}
|
|
59
|
+
|
|
60
|
+
| 字段 | 默认值 | 用途 |
|
|
61
|
+
| --- | --- | --- |
|
|
62
|
+
| `CHATVOICE_COPILOT_ENABLED` | `0` | 启用 `/copilot`、页面导航和 `/api/copilot/*` |
|
|
63
|
+
| `CHATVOICE_COPILOT_AUTO_PREPARE` | `0` | 允许后台准备草稿;默认关闭,手动 Submit 始终可用 |
|
|
64
|
+
| `CHATVOICE_COPILOT_THINKING_MODE` | `provider-default` | 快答思考策略:`provider-default` 不增加厂家字段;`ark-disabled` 仅对本次 Copilot 请求发送火山方舟 `thinking.type=disabled`;其他值拒绝启动请求 |
|
|
65
|
+
| `CHATVOICE_ENV_PROFILE` | 空 | 加载指定 ChatEnv ChatVoice profile,不修改全局 active profile;缺失不会回退 active profile |
|
|
66
|
+
|
|
67
|
+
材料上传支持 TXT、Markdown、PDF、DOCX;不支持 URL 抓取。PDF 没有可提取文字时返回 OCR 不支持。材料文本、会前说明和快速回答状态按登录账号隔离,写操作继续使用既有 Cookie + CSRF 边界。
|
|
68
|
+
|
|
57
69
|
## ASR {#asr}
|
|
58
70
|
|
|
59
71
|
| 字段 | 默认值 | 用途 |
|
|
@@ -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.
|
|
15
|
+
python -m pip install "ChatVoice[web]==0.4.0"
|
|
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.
|
|
39
|
+
python -m pip install "ChatVoice[web]==0.4.0"
|
|
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.
|
|
39
|
+
python -m pip install "ChatVoice[web]==0.4.0"
|
|
40
40
|
chatvoice --version
|
|
41
41
|
chatvoice --tree
|
|
42
42
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Web Guide
|
|
2
2
|
|
|
3
|
-
Speakr has three top-level modes: **meeting recording, voice studio and realtime conversation**. Transcript, summary, note refinement and Todo are views of the same meeting.
|
|
3
|
+
Speakr has three top-level modes: **meeting recording, voice studio and realtime conversation**; preview deployments can also enable **Copilot**. Transcript, summary, note refinement and Todo are views of the same meeting.
|
|
4
4
|
|
|
5
5
|
| Goal | Entry | Stored content |
|
|
6
6
|
| --- | --- | --- |
|
|
@@ -10,6 +10,7 @@ Speakr has three top-level modes: **meeting recording, voice studio and realtime
|
|
|
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 |
|
|
12
12
|
| Talk to an audio model | Realtime conversation | Conversation text |
|
|
13
|
+
| Answer during a meeting | Copilot | Extracted material text and answer state |
|
|
13
14
|
|
|
14
15
|
## Choose storage
|
|
15
16
|
|
|
@@ -60,3 +61,11 @@ System TTS and voice cloning use different backends. One failing does not establ
|
|
|
60
61
|
Choose an allowed model and voice, then start the conversation. Saved text can be reviewed and exported. The current realtime proxy targets Qwen audio interfaces, not arbitrary text models.
|
|
61
62
|
|
|
62
63
|
A listed model, a successful socket connection or a session-created event does not prove generation entitlement. Resolve quota/subscription errors explicitly; there is no implicit usage-billed fallback.
|
|
64
|
+
|
|
65
|
+
## Copilot preview {#copilot}
|
|
66
|
+
|
|
67
|
+
When enabled, **Copilot** appears in navigation and `/copilot` is available. The left column holds materials and pre-meeting instructions, the middle column reuses `/ws/asr/stream` for live transcript/current question state, and the right column shows fast answers, preparation state and evidence.
|
|
68
|
+
|
|
69
|
+
Materials are local TXT, Markdown, PDF or DOCX files only; URL fetch is not supported. Scanned PDFs report OCR-not-supported. If the user selects "mic + browser tab" and the browser returns no tab audio track, the page reports an error and stops instead of silently recording only the user's mic. Stop, page teardown, reset and logout close mic tracks, audio graphs, WebSockets, timers and pending UI work.
|
|
70
|
+
|
|
71
|
+
Answers use the existing meeting-notes text model settings. Evidence is retrieved context, not verified external citation; a human should still judge live answers. Background preparation is off by default. When enabled, drafts bind transcript revision, material revision, instructions and request ID; stale drafts do not overwrite newer questions.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 网页使用
|
|
2
2
|
|
|
3
|
-
Speakr 的顶层入口是
|
|
3
|
+
Speakr 的顶层入口是 **会议记录、声音工作室、实时对话**;预览实例可启用 **会中助手**。会议内的 **文字记录、实时摘要、完善纪要、Todo** 是同一条记录的不同视图。
|
|
4
4
|
|
|
5
5
|
| 目标 | 入口 | 保存对象 |
|
|
6
6
|
| --- | --- | --- |
|
|
@@ -10,6 +10,7 @@ Speakr 的顶层入口是 **会议记录、声音工作室、实时对话**。
|
|
|
10
10
|
| 整理可执行计划 | 摘要下方“转为 Todo” | Markdown Todo 与完善对话 |
|
|
11
11
|
| 让文字变成声音 | 声音工作室 | 本次试听/下载结果,不建立生成历史 |
|
|
12
12
|
| 与语音模型交流 | 实时对话 | 对话文字记录 |
|
|
13
|
+
| 会中快速答复 | 会中助手 | 材料提取文本和回答状态 |
|
|
13
14
|
|
|
14
15
|
## 选择存储方式
|
|
15
16
|
|
|
@@ -63,3 +64,11 @@ Todo 的正文和对话不与原摘要混写。它支持复制、`.md` 下载,
|
|
|
63
64
|
选择服务端允许的实时模型和音色后开始对话。完成后可查看、保存和导出对话文字。当前实时代理面向 Qwen 实时音频接口,并非任意文本模型都能替换。
|
|
64
65
|
|
|
65
66
|
模型出现在列表中、连接成功或收到会话开始事件,都不代表账户有生成权限。遇到额度/未购买错误,应修正账户权限或套餐,不自动切换按量服务。
|
|
67
|
+
|
|
68
|
+
## 会中助手预览 {#copilot}
|
|
69
|
+
|
|
70
|
+
启用后,导航会出现 **会中助手**,也可直接访问 `/copilot`。左侧上传材料和填写会前说明,中间复用 `/ws/asr/stream` 做实时转写并维护当前问题,右侧显示快速回答、准备状态和材料证据。
|
|
71
|
+
|
|
72
|
+
材料只支持本地 TXT、Markdown、PDF、DOCX 文件;不抓取 URL。扫描版 PDF 会提示当前不支持 OCR。选择“麦克风 + 浏览器标签页”时,如果浏览器没有返回标签页音轨,页面会报错并停止,不会静默只录自己的麦克风。离开页面、停止、重置或退出时会关闭麦克风、音频图、WebSocket、计时器和待处理请求。
|
|
73
|
+
|
|
74
|
+
回答使用既有会议纪要文本模型配置。证据区展示的是检索上下文,不是外部验证引用;会中回答仍需人工判断。后台准备默认关闭,开启后也会绑定转写 revision、材料 revision、指令和请求 ID,过期草稿不会覆盖新的问题。
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
[build-system]
|
|
2
|
-
requires = ["setuptools>=
|
|
2
|
+
requires = ["setuptools>=77.0.3", "wheel"]
|
|
3
3
|
build-backend = "setuptools.build_meta"
|
|
4
4
|
|
|
5
5
|
[project]
|
|
@@ -9,6 +9,7 @@ description = "ChatArch voice recording, transcription, and meeting-notes toolki
|
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
11
11
|
license = "MIT"
|
|
12
|
+
license-files = ["LICENSE", "third_party/Backchannel-COPILOT-NOTICE.md"]
|
|
12
13
|
dependencies = ["click>=8.0,<9.0", "chatstyle>=0.2.0,<0.3.0", "chatenv>=0.2.11,<0.3.0", "ChatLogin>=0.1.2,<0.2.0", "websocket-client>=1.9,<2.0"]
|
|
13
14
|
authors = [{name = "ChatArch", email = "rex@chatarch.org"}]
|
|
14
15
|
keywords = ["chatvoice", "chatarch", "cli"]
|
|
@@ -29,7 +30,7 @@ chatvoice = "chatvoice.cli:main"
|
|
|
29
30
|
chatvoice = "chatvoice.config"
|
|
30
31
|
|
|
31
32
|
[project.optional-dependencies]
|
|
32
|
-
web = ["dashscope>=1.20.0,<2.0", "fastapi>=0.110.0,<1.0", "uvicorn[standard]>=0.27.0,<1.0", "pydantic>=2.0,<3.0", "websockets>=12.0,<16.0", "python-multipart>=0.0.9,<1.0", "jinja2>=3.1,<4.0"]
|
|
33
|
+
web = ["dashscope>=1.20.0,<2.0", "fastapi>=0.110.0,<1.0", "uvicorn[standard]>=0.27.0,<1.0", "pydantic>=2.0,<3.0", "websockets>=12.0,<16.0", "python-multipart>=0.0.9,<1.0", "jinja2>=3.1,<4.0", "pypdf>=4.0,<7.0", "python-docx>=1.1,<2.0"]
|
|
33
34
|
dev = ["build", "pytest", "twine", "httpx>=0.27,<1.0"]
|
|
34
35
|
docs = ["mkdocs>=1.6,<2.0", "mkdocs-material>=9.5,<10.0", "mkdocs-static-i18n>=1.2,<2.0", "mike>=2.0,<3.0"]
|
|
35
36
|
|
|
@@ -19,22 +19,26 @@ checks["meeting_recorder_is_primary_surface"] = all(
|
|
|
19
19
|
)
|
|
20
20
|
)
|
|
21
21
|
checks["exact_product_tabs"] = (
|
|
22
|
-
text.count('<button class="content-tab') ==
|
|
22
|
+
text.count('<button class="content-tab') == 4
|
|
23
23
|
and 'id="transcript-tab"' in text
|
|
24
24
|
and 'id="summary-tab"' in text
|
|
25
25
|
and 'id="summary-chat-tab"' in text
|
|
26
|
+
and 'id="todo-tab"' in text
|
|
26
27
|
and "文字记录" in text
|
|
27
28
|
and "实时摘要" in text
|
|
28
29
|
and "完善纪要" in text
|
|
30
|
+
and "Todo" in text
|
|
29
31
|
)
|
|
30
32
|
checks["top_level_workspaces_exist"] = (
|
|
31
|
-
text.count('<button class="product-tab') ==
|
|
33
|
+
text.count('<button class="product-tab') == 4
|
|
32
34
|
and 'id="meeting-product-tab"' in text
|
|
33
35
|
and 'id="studio-product-tab"' in text
|
|
34
36
|
and 'id="conversation-product-tab"' in text
|
|
37
|
+
and 'id="copilot-product-tab"' in text
|
|
35
38
|
and 'data-product-view="meeting"' in text
|
|
36
39
|
and 'data-product-view="studio"' in text
|
|
37
40
|
and 'data-product-view="conversation"' in text
|
|
41
|
+
and 'data-product-view="copilot"' in text
|
|
38
42
|
)
|
|
39
43
|
checks["voice_studio_tts_is_wired"] = all(
|
|
40
44
|
marker in text
|
|
@@ -133,9 +137,9 @@ checks["permission_error_is_handled"] = "NotAllowedError" in text and "未获得
|
|
|
133
137
|
checks["navigation_guard_exists"] = "beforeunload" in text
|
|
134
138
|
checks["meeting_sidebar_exists"] = all(marker in text for marker in ('id="meeting-sidebar"', 'id="new-meeting"', 'id="meeting-search"', 'id="meeting-groups"'))
|
|
135
139
|
checks["guest_storage_is_browser_only"] = "indexedDB.open" in text and "GUEST_STORE" in text and "X-Client-Id" not in text
|
|
136
|
-
checks["account_mode_is_available"] = all(marker in text for marker in ('id="entry-dialog"', "
|
|
140
|
+
checks["account_mode_is_available"] = all(marker in text for marker in ('id="entry-dialog"', "/login?next=", "/api/auth/session", "/api/auth/logout"))
|
|
137
141
|
checks["self_registration_is_not_offered"] = all(
|
|
138
|
-
marker in text for marker in ("仅限受邀账号使用", "
|
|
142
|
+
marker in text for marker in ("仅限受邀账号使用", "如需账号请联系管理员", "/login?next=")
|
|
139
143
|
) and all(marker not in text for marker in ('data-auth-mode="register"', "创建账号并同步", "/api/auth/${authMode}"))
|
|
140
144
|
checks["summary_reset_cancels_stale_request"] = all(marker in text for marker in ("summaryAbortController.abort()", "requestEpoch !== contentEpoch", "persist = true"))
|
|
141
145
|
checks["transcript_has_three_stable_zones"] = all(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ChatVoice
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: ChatArch voice recording, transcription, and meeting-notes toolkit.
|
|
5
5
|
Author-email: ChatArch <rex@chatarch.org>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -13,6 +13,7 @@ Classifier: Operating System :: OS Independent
|
|
|
13
13
|
Requires-Python: >=3.10
|
|
14
14
|
Description-Content-Type: text/markdown
|
|
15
15
|
License-File: LICENSE
|
|
16
|
+
License-File: third_party/Backchannel-COPILOT-NOTICE.md
|
|
16
17
|
Requires-Dist: click<9.0,>=8.0
|
|
17
18
|
Requires-Dist: chatstyle<0.3.0,>=0.2.0
|
|
18
19
|
Requires-Dist: chatenv<0.3.0,>=0.2.11
|
|
@@ -26,6 +27,8 @@ Requires-Dist: pydantic<3.0,>=2.0; extra == "web"
|
|
|
26
27
|
Requires-Dist: websockets<16.0,>=12.0; extra == "web"
|
|
27
28
|
Requires-Dist: python-multipart<1.0,>=0.0.9; extra == "web"
|
|
28
29
|
Requires-Dist: jinja2<4.0,>=3.1; extra == "web"
|
|
30
|
+
Requires-Dist: pypdf<7.0,>=4.0; extra == "web"
|
|
31
|
+
Requires-Dist: python-docx<2.0,>=1.1; extra == "web"
|
|
29
32
|
Provides-Extra: dev
|
|
30
33
|
Requires-Dist: build; extra == "dev"
|
|
31
34
|
Requires-Dist: pytest; extra == "dev"
|
|
@@ -60,7 +63,7 @@ ChatVoice 是 ChatArch 的录音转写与会议工作区 Python 包,包含 Spe
|
|
|
60
63
|
要求 Python 3.10 或更高版本,建议安装到独立虚拟环境。
|
|
61
64
|
|
|
62
65
|
```bash
|
|
63
|
-
python -m pip install "ChatVoice[web]==0.
|
|
66
|
+
python -m pip install "ChatVoice[web]==0.4.0"
|
|
64
67
|
chatvoice --version
|
|
65
68
|
chatvoice --tree
|
|
66
69
|
chatvoice serve app --dry-run --json
|
|
@@ -76,10 +79,13 @@ chatvoice serve app --dry-run --json
|
|
|
76
79
|
- **Markdown Todo**:由用户点击“转为 Todo”,在独立页面继续编辑、对话完善、复制或下载 `.md`;不会自动转换或执行任务。
|
|
77
80
|
- **声音工作室**:配置系统音色与输出格式;通过独立声音复刻服务,以授权参考音频生成临时试听结果。
|
|
78
81
|
- **实时对话**:对接当前支持的 Qwen 实时语音模型,需服务端配置和有效使用权限。
|
|
82
|
+
- **会中助手(预览)**:启用 `CHATVOICE_COPILOT_ENABLED=1` 后提供 `/copilot` 和页面内“会中助手”,复用实时转写与会议纪要文本模型,上传材料仅按账号保存提取文本。
|
|
79
83
|
- **程序化访问**:命令行、Python 客户端、受限 API Token,以及单文件数据库备份与恢复。
|
|
80
84
|
|
|
81
85
|
模型配置保留在服务端。摘要和标题使用独立文本设置;Todo 复用摘要模型,不增加一套密钥。ASR HTTP 服务使用 `CHATVOICE_ASR_API_URL`,本地 FunASR 则需要另行准备模型依赖。
|
|
82
86
|
|
|
87
|
+
会中助手预览借鉴并改写 Backchannel 的有界 live context 与轻量文件解析思想,代码以 `chatvoice.copilot` 主机集成形式保存;没有导入 Backchannel 的数据库、音频、PII 或 agent 栈。第三方说明见 `third_party/Backchannel-COPILOT-NOTICE.md`。
|
|
88
|
+
|
|
83
89
|
## 数据与安全边界
|
|
84
90
|
|
|
85
91
|
账号记录保存到 `~/.chatarch/chatvoice` 下的 SQLite;访客记录仅存于当前浏览器。访客仅能使用纯识别;录音+识别及文件导入要求登录,并给出可见说明而不静默降级。私有文件的播放、下载和删除均校验所有权。密钥不进入浏览器。
|
|
@@ -82,6 +82,9 @@ src/chatvoice/text_api.py
|
|
|
82
82
|
src/chatvoice/todo_markdown.py
|
|
83
83
|
src/chatvoice/tts_api.py
|
|
84
84
|
src/chatvoice/tts_qwen.py
|
|
85
|
+
src/chatvoice/copilot/__init__.py
|
|
86
|
+
src/chatvoice/copilot/context.py
|
|
87
|
+
src/chatvoice/copilot/materials.py
|
|
85
88
|
src/chatvoice/scripts/__init__.py
|
|
86
89
|
src/chatvoice/scripts/funasr_worker.py
|
|
87
90
|
src/chatvoice/web/__init__.py
|
|
@@ -94,6 +97,7 @@ src/chatvoice/web/static/index.html
|
|
|
94
97
|
src/chatvoice/web/static/login-brand.css
|
|
95
98
|
src/chatvoice/web/static/transcript-state.js
|
|
96
99
|
tests/conftest.py
|
|
100
|
+
tests/copilot_frontend_flows.cjs
|
|
97
101
|
tests/nonbrowser_audio_import.cjs
|
|
98
102
|
tests/nonbrowser_flows.cjs
|
|
99
103
|
tests/nonbrowser_harness.cjs
|
|
@@ -106,6 +110,9 @@ tests/test_chatlogin_auth.py
|
|
|
106
110
|
tests/test_cli.py
|
|
107
111
|
tests/test_cli_token_data.py
|
|
108
112
|
tests/test_config.py
|
|
113
|
+
tests/test_copilot_backend_safety.py
|
|
114
|
+
tests/test_copilot_context.py
|
|
115
|
+
tests/test_copilot_routes.py
|
|
109
116
|
tests/test_docs_standard.py
|
|
110
117
|
tests/test_documented_interfaces.py
|
|
111
118
|
tests/test_large_audio.py
|
|
@@ -140,4 +147,5 @@ tests/test_tts_web.py
|
|
|
140
147
|
tests/test_version.py
|
|
141
148
|
tests/test_web_app.py
|
|
142
149
|
tests/test_web_static_contract.py
|
|
143
|
-
tests/test_workflow_contract.py
|
|
150
|
+
tests/test_workflow_contract.py
|
|
151
|
+
third_party/Backchannel-COPILOT-NOTICE.md
|
|
@@ -79,6 +79,10 @@ class ChatVoiceConfig(BaseEnvConfig):
|
|
|
79
79
|
"CHATVOICE_HOME",
|
|
80
80
|
desc="Override ChatVoice runtime root. Defaults to $CHATARCH_HOME/chatvoice or ~/.chatarch/chatvoice.",
|
|
81
81
|
)
|
|
82
|
+
CHATVOICE_ENV_PROFILE = EnvField(
|
|
83
|
+
"CHATVOICE_ENV_PROFILE",
|
|
84
|
+
desc="Optional named ChatEnv ChatVoice profile to load for this service without changing the global active profile.",
|
|
85
|
+
)
|
|
82
86
|
CHATVOICE_SQLITE_PATH = EnvField(
|
|
83
87
|
"CHATVOICE_SQLITE_PATH",
|
|
84
88
|
desc="Optional explicit SQLite database path under the ChatVoice runtime root.",
|
|
@@ -155,6 +159,20 @@ class ChatVoiceConfig(BaseEnvConfig):
|
|
|
155
159
|
default="qwen3.7-plus",
|
|
156
160
|
desc="Default ChatVoice-scoped OpenAI-compatible model for text/model-backed tasks.",
|
|
157
161
|
)
|
|
162
|
+
CHATVOICE_COPILOT_ENABLED = EnvField(
|
|
163
|
+
"CHATVOICE_COPILOT_ENABLED",
|
|
164
|
+
default="0",
|
|
165
|
+
desc="Enable the preview-only Speakr Copilot page and APIs.",
|
|
166
|
+
)
|
|
167
|
+
CHATVOICE_COPILOT_AUTO_PREPARE = EnvField(
|
|
168
|
+
"CHATVOICE_COPILOT_AUTO_PREPARE",
|
|
169
|
+
default="0",
|
|
170
|
+
desc="Opt-in background preparation for live Copilot answers.",
|
|
171
|
+
)
|
|
172
|
+
CHATVOICE_COPILOT_THINKING_MODE = EnvField(
|
|
173
|
+
"CHATVOICE_COPILOT_THINKING_MODE",
|
|
174
|
+
desc="Copilot-only thinking policy: provider-default or ark-disabled (sends thinking.type=disabled). Unknown modes fail closed.",
|
|
175
|
+
)
|
|
158
176
|
|
|
159
177
|
|
|
160
178
|
# Backwards-compatible class name for imports/tests from earlier releases.
|