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.0"

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
<ASR_API_URL_SETTING>="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

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.0 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.0 packaged legacy storage layer still supports SQLite only.

API surface

  • GET /api/status: redacted backend status, models, ASR channels, and route shapes.
  • 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.0.tar.gz (89.5 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.0-py3-none-any.whl (91.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: chatvoice-0.1.0.tar.gz
  • Upload date:
  • Size: 89.5 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.0.tar.gz
Algorithm Hash digest
SHA256 3d1d67764975f97979069cafe47ef75f859270d665b9946409e8a0c4aa40a7a1
MD5 4c0b1ec694fde407510b24967e92d659
BLAKE2b-256 761272b43447c602cad0d96d457cbb73d58cb6386ef1300818c8c771ce33f738

See more details on using hashes here.

Provenance

The following attestation bundles were made for chatvoice-0.1.0.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.0-py3-none-any.whl.

File metadata

  • Download URL: chatvoice-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 91.0 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.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ad441f5bfb41affef8917f9f9064c79c14168e55966f906103ad172eca88c0a9
MD5 b740315e104fd5514c5cf343a33cc932
BLAKE2b-256 d07791943005f03108f420c109eea508eaeacf15ccfbebcda6e35d6008d546f7

See more details on using hashes here.

Provenance

The following attestation bundles were made for chatvoice-0.1.0-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

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

This release

0.1.0 This release

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