Skip to main content

ChatVoice / Speakr Voice Workspace

ChatVoice is the ChatArch repository and Python package shell for the Speakr voice workspace: a FastAPI + browser product with realtime meeting transcription, local audio capture, AI notes, TTS, and full-duplex voice conversation. The deployed product uses Speakr as its canonical public service, while ChatVoice is the package, CLI, and repository name.

Public site: https://speakr.public.wzhecnu.cn/

Repository: https://github.com/ChatArch/ChatVoice

PyPI package: https://pypi.org/project/ChatVoice/

Documentation: https://arch.gh.wzhecnu.cn/ChatVoice/

The former qwen-audio-demo.public.wzhecnu.cn entry is retired and returns HTTP 410.

Features

  • 语音合成 (TTS): server-side proxy for qwen-audio-3.0-tts-plus, returning playable MP3/WAV audio.
  • 声音克隆: server-side DashScope TTS v2 voice enrollment (VoiceEnrollmentService) creates reusable voice_id values; the browser never sees provider credentials.
  • 实时对话: 独立的豆包式语音对话页;browser WebSocket -> FastAPI proxy -> Qwen Realtime,支持服务端模型列表、VAD、流式文字、24 kHz PCM 播放、自然打断、对话历史和 Markdown 导出。
  • 会议录音首页: mobile-first recording surface with live transcript, waveform, pause/resume, finish, and local audio download.
  • Bounded local archive: MediaRecorder emits one-second chunks into browser-only IndexedDB; the full Blob is assembled only when the user requests a download.
  • 语音转写: the recorder streams microphone PCM16 to the ASR WebSocket and appends normalized final segments to the timeline.
  • API-first ASR: production ASR is designed around api-server, where the ChatVoice backend calls either a managed ASR API or a self-hosted GPU ASR server. stub-local remains available for contract smoke, and funasr-gpu / funasr-cpu remain compatibility channels.
  • Realtime ASR WebSocket: WS /ws/asr/stream accepts continuous PCM16 microphone frames and returns cumulative revision events. Long recordings transparently roll a bounded context window while confirmed text continues to grow.
  • 会议纪要: final transcript segments can be sent to a server-side Qwen-compatible model for summary, action items, risks, and open questions.
  • 双模式会议历史: guests keep meeting text and summaries only in browser IndexedDB; signed-in accounts sync records through authenticated server storage.
  • 0.1 API 访问: signed-in users can generate one-time-visible API tokens from the web settings panel; chatvoice data ... can then read meetings, summaries, and realtime conversations from a running service.
  • 受邀账号登录: public registration is disabled. Accounts are provisioned by chatvoice accounts add; passwords use salted PBKDF2 hashes, sessions use HttpOnly cookies, and record writes require CSRF tokens.

Security model

  • The browser never receives or stores provider credentials.
  • Set provider credentials only in server-side environment/config storage; never expose them to the browser.
  • Do not commit real env files, model caches, probe output, audio files, runtime logs, or generated API token values.
  • Guest meeting and conversation records never enter the server database. Audio/transcript data still passes through ASR/summary or Realtime services while a request is processed.
  • Raw recording blobs are not uploaded by the meeting-history feature; the current page keeps them only for local download.
  • Realtime history stores text, model, and voice only; raw conversation audio is never written to history storage.
  • API tokens are stored server-side as hashes. Token values are displayed only once on creation.

Quick start from the released package

python -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install "ChatVoice[web]==0.1.3"

chatvoice --tree
chatvoice service plan --ensure-dirs --json
chatvoice serve app --host 127.0.0.1 --port 18087

Open:

http://127.0.0.1:18087/

For a credential-free wiring smoke, use:

export CHATVOICE_ASR_CHANNEL=stub-local
chatvoice serve app --host 127.0.0.1 --port 18087

For a real ASR backend, keep credentials server-side and call an API provider:

export CHATVOICE_ASR_CHANNEL=api-server
export CHATVOICE_ASR_API_URL="https://<asr-service>/v1/transcribe"
# Configure the optional ASR bearer token in server-side config/env storage; do not put it in argv.
chatvoice serve app --host 127.0.0.1 --port 18087

Meeting summary generation is also a server-side model boundary: configure the notes model/provider in server-side environment or config storage, and let the browser/API read only the saved summary text.

Fresh account, browser, token, and data flow

Create one invited account in the same local runtime database used by the service:

read -r -s CHATVOICE_ACCOUNT_LOGIN
export CHATVOICE_ACCOUNT_LOGIN
chatvoice accounts add person@example.com --display-name "Person" --password-env CHATVOICE_ACCOUNT_LOGIN --json
chatvoice accounts list --json

Then:

  1. open the web service;
  2. log in with the invited account;
  3. create or open a meeting and generate its summary;
  4. open 识别设置 → API Token → 生成 Token;
  5. copy the token immediately; it is only shown once.

The same token lifecycle is available from CLI after the service is running:

chatvoice tokens create --url http://127.0.0.1:18087 --account person@example.com --password-env CHATVOICE_ACCOUNT_LOGIN --name automation --json
chatvoice tokens list --url http://127.0.0.1:18087 --account person@example.com --password-env CHATVOICE_ACCOUNT_LOGIN --json

Use the token with the data API/CLI:

read -r -s CHATVOICE_DATA_READ
export CHATVOICE_DATA_READ
chatvoice data meetings --url http://127.0.0.1:18087 --token-env CHATVOICE_DATA_READ --json
chatvoice data conversations --url http://127.0.0.1:18087 --token-env CHATVOICE_DATA_READ --json

Database and concurrency

The packaged v0.1.3 web app defaults to SQLite WAL at:

<chatarch-home>/chatvoice/data/meetings.sqlite3

Use one service process (--workers 1) with SQLite. For high-concurrency production, migrate the storage layer to Postgres/MySQL before scaling workers or nodes. An external database URL setting is detected by chatvoice doctor / chatvoice service plan, but the v0.1.3 packaged legacy storage layer still supports SQLite only.

运行目录与数据结构

pip install 后代码安装在当前 Python 环境的 site-packages/chatvoice/,CLI 在对应环境的 bin/chatvoice;生产建议使用独立 venv。运行数据不写入源码目录,默认 root 解析顺序是 CHATVOICE_RUNTIME_ROOTCHATVOICE_HOMECHATARCH_HOME/chatvoice~/.chatarch/chatvoice。默认结构:

~/.chatarch/chatvoice/
├── data/meetings.sqlite3
├── logs/
├── run/
├── temp/asr/
└── model-cache/

后端 SQLite meetings.sqlite3 目前包含 accountsauth_sessionsapi_tokensmeeting_recordsconversation_records。转写、summary、实时对话消息以 JSON 字符串保存;原始音频不进后端数据库。访客模式仍使用浏览器 IndexedDB 保存本地会议和录音分片。高并发 Postgres/MySQL 迁移列入 TODO,当前 0.1.3 仍只支持 SQLite WAL + 单服务进程。详见 运行目录与数据结构

API surface

GET /api/heartbeat 是轻量服务心跳,用来判断 Web 服务、SQLite 只读探测和 ASR 状态是否正常;asr.status 会返回 readyprocessingdegraded,并包含 FunASR 模型是否已热、最近一次识别成功/失败、耗时和输出长度。录音 WebSocket 也会发 asr.stream.processing / asr.stream.heartbeat,前端会显示“模型加载中/识别处理中/失败原因”,不再静默录音无文字。

  • GET /api/status: redacted backend status, models, ASR channels, and route shapes.
  • GET /api/heartbeat: lightweight service/database/ASR heartbeat with model warm-up, processing, and recent error/success state.
  • POST /api/tts: JSON {text, voice, format} -> audio/mpeg or audio/wav.
  • POST /api/voice-cloning/create: JSON {audio_url, prefix, target_model, language_hints} -> server-created voice_id.
  • GET /api/voice-cloning/list: list server-side voice enrollment ids by prefix.
  • GET /api/asr/channels: available ASR channels.
  • POST /api/asr: programmatic/smoke multipart upload endpoint with channel=api-server|funasr-gpu|funasr-cpu|stub-local.
  • WS /ws/asr/stream: bounded PCM16 stream used by the recorder.
  • GET /api/realtime/models: Realtime models currently exposed by the configured account.
  • WS /ws/realtime?model=<id>: browser-to-backend Realtime proxy.
  • POST /api/meeting-notes/polish: Qwen-compatible chat completion endpoint for transcript polish + realtime summary structure.
  • POST /api/auth/register: intentionally returns 403; self-registration is disabled.
  • POST /api/auth/login, GET /api/auth/session, POST /api/auth/logout: invited-account session lifecycle.
  • GET|PUT|DELETE /api/meetings[/<id>]: authenticated meeting record storage. Writes require the session CSRF token.
  • GET|PUT|DELETE /api/conversations[/<id>]: authenticated text-only Realtime conversation storage. Writes require the session CSRF token.
  • GET|POST /api/tokens, DELETE /api/tokens/<id>: signed-in session token management.
  • GET /api/data/meetings[/<id>], GET /api/data/conversations[/<id>]: bearer-token data export for meetings, summaries, and realtime conversations.

Verification

python -m pytest -q
PYTHONPATH=src python -m chatvoice.cli --tree
python -m mkdocs build --strict
python -m build
python -m twine check dist/*

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

chatvoice-0.1.3.tar.gz (97.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

chatvoice-0.1.3-py3-none-any.whl (95.5 kB view details)

Uploaded Python 3

File details

Details for the file chatvoice-0.1.3.tar.gz.

File metadata

  • Download URL: chatvoice-0.1.3.tar.gz
  • Upload date:
  • Size: 97.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for chatvoice-0.1.3.tar.gz
Algorithm Hash digest
SHA256 f09fe1e226f81eb3a6db41763b5365286a8f43c13978b98dfd4820a8fed79f06
MD5 4414bab50a9b24e88380a0724372726c
BLAKE2b-256 c14b54b992c5db9ac53fd4f9920e8d15b3ab283d45cab8dfa4829c9454ff4534

See more details on using hashes here.

Provenance

The following attestation bundles were made for chatvoice-0.1.3.tar.gz:

Publisher: publish.yml on ChatArch/ChatVoice

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file chatvoice-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: chatvoice-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 95.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for chatvoice-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 104d76d43fac814a5cea17d9d7592888e7f89e38fc86b52168857bdf58841373
MD5 abfe5428459f568696119289ff3365e3
BLAKE2b-256 3eec920f668a9f020e767be3feea68c3198db83672a5a5f62e6b356f04aa5009

See more details on using hashes here.

Provenance

The following attestation bundles were made for chatvoice-0.1.3-py3-none-any.whl:

Publisher: publish.yml on ChatArch/ChatVoice

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.1.13

2 files

0.1.12

2 files

0.1.11

2 files

0.1.10

2 files

0.1.9

2 files

0.1.8

2 files

0.1.7

2 files

0.1.6

2 files

0.1.5

2 files

0.1.4

2 files

This release

0.1.3 This release

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

0.0.2

2 files

0.0.1

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page