Modular Python voice I/O for AI applications. Text-to-speech, speech-to-text, and voice cloning with local-first defaults and remote provider support. One interface across Piper, Supertonic, OpenAI, OmniVoice, and more.
6
stars
146
commits
Python
primary language
Aug 6, 2026
updated
Lightweight voice I/O for AI applications: remote/OpenAI-compatible audio adapters by default, plus local TTS, STT, microphone control, streaming speech output, and optional voice cloning behind explicit extras.
AbstractVoice is useful on its own, and it is also the voice capability package
for the AbstractFramework ecosystem. It does not force you to run a daemon:
embed VoiceManager directly when you want an in-process library; install it
beside AbstractCore when you want OpenAI-compatible HTTP audio endpoints.
abstractvoice[apple], abstractvoice[gpu]): Piper, Supertonic 3, faster-whisper, microphone/playback, AEC, and local cloning/TTS enginesabstractvoice[apple] and abstractvoice[gpu] install the local stack; abstractvoice[all-apple] and abstractvoice[all-gpu] add the lightweight web example dependencies.abstractvoice[piper], abstractvoice[supertonic], abstractvoice[stt], abstractvoice[stt-hf], abstractvoice[audio-io], abstractvoice[cloning], abstractvoice[audiodit], abstractvoice[omnivoice], abstractvoice[qwen3-tts], abstractvoice[chroma]speak_to_bytes(), speak_to_file(), transcribe_*speak_to_audio_chunks() and open_tts_text_stream()abstractvoice webabstractcore.capabilities_pluginsStatus: alpha (0.10.x). The base install and library constructor are
remote-first: VoiceManager() and library auto select hosted OpenAI audio and require
OPENAI_API_KEY (or remote_api_key=...). Local/offline stacks are available
through abstractvoice[apple] / abstractvoice[gpu] or granular engine
composition such as abstractvoice[supertonic,stt,audio-io].
The shipped CLI and web examples use an install-aware auto resolver instead:
installed Supertonic first, installed Piper second, then OpenAI remote as a
fallback. This keeps plain abstractvoice remote/OpenAI by default, while
abstractvoice[all-apple] and abstractvoice[all-gpu] start on Supertonic.
Use an explicit local provider such as --tts-engine supertonic when you require
no remote TTS.
For new local voice clones, the default cloning backend is OmniVoice; install
abstractvoice[omnivoice] or a platform/full profile before using clone
commands without --engine. Optional cloning and torch-based engines are
heavier and should be validated on your target hardware. The supported integrator surface is documented in
docs/api.md, and current engine caveats are tracked in
docs/known-issues.md.
Next: docs/getting-started.md (recommended setup + first smoke tests).
Published documentation: https://www.lpalbou.info/AbstractVoice/.
AbstractVoice has four intended usage modes:
VoiceManager directly from a desktop app,
local assistant, batch job, or your own backend.abstractvoice) or the optional FastAPI web
example (abstractvoice web) to validate VoiceManager from a browser.https://github.com/lpalbou/abstractframework).Key links:
https://abstractcore.ai and https://github.com/lpalbou/abstractcorehttps://github.com/lpalbou/abstractframeworkIntegration points:
pyproject.toml → [project.entry-points."abstractcore.capabilities_plugins"]abstractvoice/integrations/abstractcore_plugin.pyabstractvoice/artifacts.pyImportant: AbstractVoice is a voice I/O library (TTS/STT + optional cloning), not an agent framework and not a standalone LLM server. That boundary is intentional: in the AbstractFramework stack, AbstractCore owns agents, provider routing, and OpenAI-compatible HTTP endpoints; AbstractVoice supplies the concrete voice implementation.
flowchart LR
App["Your app / REPL"] --> VM["abstractvoice.VoiceManager"]
VM --> Remote["OpenAI-compatible audio"]
VM --> TTS["Piper TTS (local extra)"]
VM --> Supertonic["Supertonic TTS (local extra)"]
VM --> STT["faster-whisper STT (local extra)"]
VM --> IO["sounddevice / PortAudio (local extra)"]
subgraph AbstractFramework
AC["AbstractCore"] -. "capability plugin" .-> VM
AR["AbstractRuntime"] -. "optional ArtifactStore" .-> VM
end
The shipped AbstractCore integration is via the capability plugin above. The abstractvoice REPL is a demonstrator/smoke-test harness (see docs/repl_guide.md) and includes a minimal OpenAI-compatible LLM HTTP client (abstractvoice/examples/llm_provider.py) for convenience.
Install AbstractVoice into the same environment as AbstractCore:
pip install "abstractcore[server]" abstractvoice
AbstractCore discovers AbstractVoice through the
abstractcore.capabilities_plugins entry point and can use it as:
core.voice.tts(...) / llm.voice.tts(...) for TTS, with explicit
provider, model, and voice selectioncore.audio.transcribe(...) / llm.audio.transcribe(...) for STT, with
explicit provider and model selectionllm.capabilities.*) for audio now works even
when AbstractCore selects the STT-only backend (abstractvoice:stt), via
available_providers(task=None) and list_models(task=None, provider=...|provider_id=...)available_providers(), which exposes
clean tts, stt, and cloning provider lists plus per-provider detailslist_models(kind="tts"|"stt"|"cloning", provider=...)list_tts_models(provider=...)list_stt_models(provider=...)list_cloning_models(provider=...)list_tts_voices(provider=..., model=...)list_cloned_voices(provider=..., model=...)get_capability_support(...) / find_compatible_models(...)voice_catalog()clone(audio, provider=..., model=..., name=..., reference_text=..., artifact_store=...)clone_voice(...) as a compatibility aliasload_resident_model(...), list_resident_models(...), and unload_resident_model(...)abstractvoice:default), and local STT on the audio backend (abstractvoice:stt)voice_catalog():
tts_catalog_by_provider[provider] -> models, model_variants,
voices, profiles, cloned_voices, voices_by_modelstt_catalog_by_provider[provider] -> models, model_variantsprovider:model selectors for both TTS and STT, so Core/Gateway can
accept either split fields such as provider="openai", model="tts-1" or a
single combined value such as provider="openai:tts-1" or
provider="faster-whisper:large"POST /v1/audio/speechPOST /v1/audio/transcriptionsGET /v1/audio/voices, /v1/audio/speech/models, and
/v1/audio/transcriptions/models for UI catalog discoveryThe abstraction is intentionally simple:
provider = engine/backend (openai, openai-compatible, piper,
supertonic, faster-whisper, transformers-asr, ...)model = provider-specific selectable model idvoice = a built-in/base voice profile id or a cloned voice id available for
the selected provider + modelFor TTS, AbstractCore can drive the plugin with calls such as
core.voice.tts(text, provider="openai", model="tts-1", voice="alloy") or
core.voice.tts(text, provider="openai:tts-1", voice="voice_abc123"). For
STT, use core.audio.transcribe(audio, provider="faster-whisper", model="large")
or provider="transformers-asr:Qwen/Qwen3-ASR-1.7B".
For a remote-first Gateway/Core deployment, the AbstractCore plugin defaults to
OpenAI remote TTS/STT and reads OPENAI_API_KEY. Configure
voice_tts_engine=openai-compatible (provider), voice_stt_engine=openai-compatible (provider), and
voice_remote_base_url=... for a compatible audio endpoint. For local
Supertonic/Piper/faster-whisper inside the same environment, install
abstractvoice[apple] or abstractvoice[gpu], or compose granular extras such
as abstractvoice[supertonic,stt], then select the local providers explicitly.
Do not point voice_remote_base_url back at the same AbstractCore Server
instance that is resolving the plugin fallback; that loops through
/v1/audio/* recursively. Use an upstream provider/gateway URL, or install the
local extra and select local providers.
Minimal server smoke test:
OPENAI_API_KEY=... python -m abstractcore.server.app
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{"input":"Hello from AbstractVoice through AbstractCore.","format":"wav"}' \
--output hello.wav
curl -X POST http://localhost:8000/v1/audio/transcriptions \
-F "file=@hello.wav" \
-F "language=en"
For the current AbstractCore surface, see https://abstractcore.ai and
https://github.com/lpalbou/abstractcore.
If you’re using the full AbstractFramework stack, install and run via the umbrella project and gateway tooling. Start here: https://github.com/lpalbou/abstractframework.
Requires Python >=3.9 (see pyproject.toml).
pip install abstractvoice
This is the lightweight remote/plugin base. It uses OpenAI audio by default:
OPENAI_API_KEY=... abstractvoice \
--provider openai \
--model tts-1 \
--voice alloy \
--prompt "Hello from AbstractVoice." \
--output hello.wav
The one-shot command writes audio and exits. Use --provider openai-compatible --api http://localhost:8000/v1 for compatible remote audio
servers, or a local provider such as --tts-engine supertonic after installing
the matching local extra.
export OPENAI_API_KEY=...
For local desktop/REPL voice and local cloning engines, use the platform profile for your machine:
pip install "abstractvoice[apple]"
pip install "abstractvoice[gpu]"
Common extras:
pip install "abstractvoice[openai]" # hosted OpenAI intent extra (no extra deps today)
pip install "abstractvoice[openai-compatible]" # generic compatible provider intent extra
pip install "abstractvoice[web]" # local FastAPI web example
pip install "abstractvoice[piper]" # local Piper TTS only
pip install "abstractvoice[supertonic]" # local Supertonic 3 ONNX TTS only
pip install "abstractvoice[stt]" # local faster-whisper STT only
pip install "abstractvoice[stt-hf]" # local Transformers/Hugging Face ASR (e.g. openai/whisper-large-v3, openai/whisper-large-v3-turbo, Qwen/Qwen3-ASR-1.7B)
pip install "abstractvoice[omnivoice]" # recommended/default local cloning engine
pip install "abstractvoice[qwen3-tts]" # Qwen3-TTS: preset speakers, cloning, voice design (Python 3.10+)
pip install "abstractvoice[cloning]" # explicit OpenF5 cloning engine
Notes:
abstractvoice[apple] and abstractvoice[gpu] are platform install profiles for the local voice stack: Piper, Supertonic 3, faster-whisper, audio I/O, AEC where supported, and local cloning/TTS engines gated by Python-version markers.abstractvoice[all-apple] and abstractvoice[all-gpu] install the full platform stack plus the web example dependencies.--tts-engine supertonic), while
local cloning defaults to OmniVoice (--cloning-engine omnivoice).aec-audio-processing does.docs/installation.md.Some features rely on large model weights/artifacts. AbstractVoice will not download these implicitly inside the REPL (offline-first).
After installing, prefetch explicitly (cross-platform).
Recommended (most users):
abstractvoice-prefetch --supertonic
abstractvoice-prefetch --piper en
abstractvoice-prefetch --stt small
Optional (voice cloning artifacts):
pip install "abstractvoice[cloning]"
abstractvoice-prefetch --openf5
# Heavy (torch/transformers):
pip install "abstractvoice[audiodit]"
abstractvoice-prefetch --audiodit
pip install "abstractvoice[omnivoice]"
abstractvoice-prefetch --omnivoice
# GPU-heavy:
pip install "abstractvoice[chroma]"
abstractvoice-prefetch --chroma
OmniVoice is the default local cloning backend for new clones. Supertonic is not a cloning engine; use it for fixed-profile base TTS.
Equivalent python -m form:
python -m abstractvoice download --supertonic
python -m abstractvoice download --piper en
python -m abstractvoice download --stt small
python -m abstractvoice download --openf5 # optional; requires abstractvoice[cloning]
python -m abstractvoice download --chroma # optional; requires abstractvoice[chroma] (GPU-heavy)
python -m abstractvoice download --audiodit # optional; requires abstractvoice[audiodit]
python -m abstractvoice download --omnivoice # optional; requires abstractvoice[omnivoice]
Notes:
--piper <lang> downloads the Piper ONNX voice for that language into ~/.piper/models.--supertonic downloads Supertonic 3 ONNX weights and built-in voice styles into ~/.cache/abstractvoice/supertonic-3.--openf5 is ~5.4GB. --chroma is very large (GPU-heavy).abstractvoice --verbose
# or (from a source checkout):
python -m abstractvoice cli --verbose
# Force hosted OpenAI audio:
OPENAI_API_KEY=... abstractvoice --tts-engine openai --stt-engine openai --verbose
Notes:
--voice-mode stop (or in-session: /voice stop).auto prefers installed Supertonic, then installed Piper, then
OpenAI remote. A plain lightweight install therefore starts on OpenAI, while
abstractvoice[all-apple] / abstractvoice[all-gpu] start on Supertonic. If
the status line says openai (remote), /speak is making a remote TTS
request.abstractvoice[supertonic] or a
platform profile, prefetch explicitly, and start with
abstractvoice --tts-engine supertonic --stt-engine faster_whisper./voices; older commands such as
/profile, /tts_voice, and /setvoice remain as compatibility/direct
forms./tts engine ... resets the base voice/profile to the
default for that engine and language; for example Supertonic starts on M1.docs/api.md → “Integrations”).See docs/repl_guide.md.
pip install "abstractvoice[web]"
abstractvoice web --port 5000
# Hosted OpenAI audio in the same web UI
OPENAI_API_KEY=... abstractvoice web --tts-engine openai --stt-engine openai
# Guaranteed local web TTS after explicit prefetch
abstractvoice web --tts-engine supertonic --stt-engine faster_whisper
# OpenAI-compatible remote audio
abstractvoice web --tts-engine openai-compatible --stt-engine openai-compatible --remote-base-url http://localhost:8000/v1
Use pip install "abstractvoice[web,supertonic]" for the browser UI plus
Supertonic, pip install "abstractvoice[web,omnivoice]" for OmniVoice, or
pip install "abstractvoice[all-apple]" / abstractvoice[all-gpu] for the
browser UI plus the platform local stack.
Open http://127.0.0.1:5000. The browser example has message/conversation
playback, chat clearing, assistant/user voice selectors, browser voice cloning
from uploaded or recorded reference audio, text-to-WAV, file transcription, and
a tiny optional LLM dialogue panel for OpenAI-compatible local providers such as
Ollama or LM Studio. It exposes small local /api/* routes plus /v1/audio/*
smoke-test aliases. The /v1/audio/voices and /v1/voice/clone extension
routes let another AbstractVoice client discover profiles/cloned voices and
request compatible remote cloning. The supported production HTTP path remains
AbstractCore Server. Treat the browser example as a local/dev surface: it does
not inherit AbstractCore/Gateway bearer-token or browser-origin policy.
The browser clone action validates the new voice by synthesizing a short sample before it reports success. If the selected optional engine cannot load, the unusable clone is removed and the UI shows the backend error.
from abstractvoice import VoiceManager
vm = VoiceManager()
vm.speak("Hello! This is AbstractVoice.")
VoiceManager() is remote-first and reads OPENAI_API_KEY from the
environment. For offline/local inference:
from abstractvoice import VoiceManager
vm = VoiceManager(
tts_engine="supertonic",
stt_engine="faster_whisper",
cloning_engine="omnivoice",
)
vm.speak("Hello from the local stack.")
Install local support first with pip install "abstractvoice[supertonic]"
and pip install "abstractvoice[omnivoice]", or a platform profile such as
abstractvoice[apple] / abstractvoice[gpu].
See docs/api.md for the supported integrator contract.
At a glance:
speak(), set_tts_engine(), stop_speaking(), pause_speaking(), resume_speaking(), speak_to_bytes(), speak_to_file()transcribe_file(), transcribe_from_bytes()listen(), stop_listening(), pause_listening(), resume_listening()docs/getting-started.mddocs/api.mddocs/architecture.mddocs/faq.mddocs/repl_guide.mddocs/known-issues.mddocs/README.mddocs/installation.mddocs/multilingual.mddocs/adr/docs/acronyms.mddocs/model-management.mddocs/voices-and-licenses.mdCHANGELOG.mdCONTRIBUTING.mddocs/known-issues.md.github/ISSUE_TEMPLATE/bug_report.ymlSECURITY.mdACKNOWLEDGMENTS.mdMIT. See LICENSE.
146 commits
Python
100.0%
Modular Python voice I/O for AI applications. Text-to-speech, speech-to-text, and voice cloning with local-first defaults and remote provider support. One interface across Piper, Supertonic, OpenAI, OmniVoice, and more.
6
stars
146
commits
Python
primary language
Aug 6, 2026
updated
Lightweight voice I/O for AI applications: remote/OpenAI-compatible audio adapters by default, plus local TTS, STT, microphone control, streaming speech output, and optional voice cloning behind explicit extras.
AbstractVoice is useful on its own, and it is also the voice capability package
for the AbstractFramework ecosystem. It does not force you to run a daemon:
embed VoiceManager directly when you want an in-process library; install it
beside AbstractCore when you want OpenAI-compatible HTTP audio endpoints.
abstractvoice[apple], abstractvoice[gpu]): Piper, Supertonic 3, faster-whisper, microphone/playback, AEC, and local cloning/TTS enginesabstractvoice[apple] and abstractvoice[gpu] install the local stack; abstractvoice[all-apple] and abstractvoice[all-gpu] add the lightweight web example dependencies.abstractvoice[piper], abstractvoice[supertonic], abstractvoice[stt], abstractvoice[stt-hf], abstractvoice[audio-io], abstractvoice[cloning], abstractvoice[audiodit], abstractvoice[omnivoice], abstractvoice[qwen3-tts], abstractvoice[chroma]speak_to_bytes(), speak_to_file(), transcribe_*speak_to_audio_chunks() and open_tts_text_stream()abstractvoice webabstractcore.capabilities_pluginsStatus: alpha (0.10.x). The base install and library constructor are
remote-first: VoiceManager() and library auto select hosted OpenAI audio and require
OPENAI_API_KEY (or remote_api_key=...). Local/offline stacks are available
through abstractvoice[apple] / abstractvoice[gpu] or granular engine
composition such as abstractvoice[supertonic,stt,audio-io].
The shipped CLI and web examples use an install-aware auto resolver instead:
installed Supertonic first, installed Piper second, then OpenAI remote as a
fallback. This keeps plain abstractvoice remote/OpenAI by default, while
abstractvoice[all-apple] and abstractvoice[all-gpu] start on Supertonic.
Use an explicit local provider such as --tts-engine supertonic when you require
no remote TTS.
For new local voice clones, the default cloning backend is OmniVoice; install
abstractvoice[omnivoice] or a platform/full profile before using clone
commands without --engine. Optional cloning and torch-based engines are
heavier and should be validated on your target hardware. The supported integrator surface is documented in
docs/api.md, and current engine caveats are tracked in
docs/known-issues.md.
Next: docs/getting-started.md (recommended setup + first smoke tests).
Published documentation: https://www.lpalbou.info/AbstractVoice/.
AbstractVoice has four intended usage modes:
VoiceManager directly from a desktop app,
local assistant, batch job, or your own backend.abstractvoice) or the optional FastAPI web
example (abstractvoice web) to validate VoiceManager from a browser.https://github.com/lpalbou/abstractframework).Key links:
https://abstractcore.ai and https://github.com/lpalbou/abstractcorehttps://github.com/lpalbou/abstractframeworkIntegration points:
pyproject.toml → [project.entry-points."abstractcore.capabilities_plugins"]abstractvoice/integrations/abstractcore_plugin.pyabstractvoice/artifacts.pyImportant: AbstractVoice is a voice I/O library (TTS/STT + optional cloning), not an agent framework and not a standalone LLM server. That boundary is intentional: in the AbstractFramework stack, AbstractCore owns agents, provider routing, and OpenAI-compatible HTTP endpoints; AbstractVoice supplies the concrete voice implementation.
flowchart LR
App["Your app / REPL"] --> VM["abstractvoice.VoiceManager"]
VM --> Remote["OpenAI-compatible audio"]
VM --> TTS["Piper TTS (local extra)"]
VM --> Supertonic["Supertonic TTS (local extra)"]
VM --> STT["faster-whisper STT (local extra)"]
VM --> IO["sounddevice / PortAudio (local extra)"]
subgraph AbstractFramework
AC["AbstractCore"] -. "capability plugin" .-> VM
AR["AbstractRuntime"] -. "optional ArtifactStore" .-> VM
end
The shipped AbstractCore integration is via the capability plugin above. The abstractvoice REPL is a demonstrator/smoke-test harness (see docs/repl_guide.md) and includes a minimal OpenAI-compatible LLM HTTP client (abstractvoice/examples/llm_provider.py) for convenience.
Install AbstractVoice into the same environment as AbstractCore:
pip install "abstractcore[server]" abstractvoice
AbstractCore discovers AbstractVoice through the
abstractcore.capabilities_plugins entry point and can use it as:
core.voice.tts(...) / llm.voice.tts(...) for TTS, with explicit
provider, model, and voice selectioncore.audio.transcribe(...) / llm.audio.transcribe(...) for STT, with
explicit provider and model selectionllm.capabilities.*) for audio now works even
when AbstractCore selects the STT-only backend (abstractvoice:stt), via
available_providers(task=None) and list_models(task=None, provider=...|provider_id=...)available_providers(), which exposes
clean tts, stt, and cloning provider lists plus per-provider detailslist_models(kind="tts"|"stt"|"cloning", provider=...)list_tts_models(provider=...)list_stt_models(provider=...)list_cloning_models(provider=...)list_tts_voices(provider=..., model=...)list_cloned_voices(provider=..., model=...)get_capability_support(...) / find_compatible_models(...)voice_catalog()clone(audio, provider=..., model=..., name=..., reference_text=..., artifact_store=...)clone_voice(...) as a compatibility aliasload_resident_model(...), list_resident_models(...), and unload_resident_model(...)abstractvoice:default), and local STT on the audio backend (abstractvoice:stt)voice_catalog():
tts_catalog_by_provider[provider] -> models, model_variants,
voices, profiles, cloned_voices, voices_by_modelstt_catalog_by_provider[provider] -> models, model_variantsprovider:model selectors for both TTS and STT, so Core/Gateway can
accept either split fields such as provider="openai", model="tts-1" or a
single combined value such as provider="openai:tts-1" or
provider="faster-whisper:large"POST /v1/audio/speechPOST /v1/audio/transcriptionsGET /v1/audio/voices, /v1/audio/speech/models, and
/v1/audio/transcriptions/models for UI catalog discoveryThe abstraction is intentionally simple:
provider = engine/backend (openai, openai-compatible, piper,
supertonic, faster-whisper, transformers-asr, ...)model = provider-specific selectable model idvoice = a built-in/base voice profile id or a cloned voice id available for
the selected provider + modelFor TTS, AbstractCore can drive the plugin with calls such as
core.voice.tts(text, provider="openai", model="tts-1", voice="alloy") or
core.voice.tts(text, provider="openai:tts-1", voice="voice_abc123"). For
STT, use core.audio.transcribe(audio, provider="faster-whisper", model="large")
or provider="transformers-asr:Qwen/Qwen3-ASR-1.7B".
For a remote-first Gateway/Core deployment, the AbstractCore plugin defaults to
OpenAI remote TTS/STT and reads OPENAI_API_KEY. Configure
voice_tts_engine=openai-compatible (provider), voice_stt_engine=openai-compatible (provider), and
voice_remote_base_url=... for a compatible audio endpoint. For local
Supertonic/Piper/faster-whisper inside the same environment, install
abstractvoice[apple] or abstractvoice[gpu], or compose granular extras such
as abstractvoice[supertonic,stt], then select the local providers explicitly.
Do not point voice_remote_base_url back at the same AbstractCore Server
instance that is resolving the plugin fallback; that loops through
/v1/audio/* recursively. Use an upstream provider/gateway URL, or install the
local extra and select local providers.
Minimal server smoke test:
OPENAI_API_KEY=... python -m abstractcore.server.app
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{"input":"Hello from AbstractVoice through AbstractCore.","format":"wav"}' \
--output hello.wav
curl -X POST http://localhost:8000/v1/audio/transcriptions \
-F "file=@hello.wav" \
-F "language=en"
For the current AbstractCore surface, see https://abstractcore.ai and
https://github.com/lpalbou/abstractcore.
If you’re using the full AbstractFramework stack, install and run via the umbrella project and gateway tooling. Start here: https://github.com/lpalbou/abstractframework.
Requires Python >=3.9 (see pyproject.toml).
pip install abstractvoice
This is the lightweight remote/plugin base. It uses OpenAI audio by default:
OPENAI_API_KEY=... abstractvoice \
--provider openai \
--model tts-1 \
--voice alloy \
--prompt "Hello from AbstractVoice." \
--output hello.wav
The one-shot command writes audio and exits. Use --provider openai-compatible --api http://localhost:8000/v1 for compatible remote audio
servers, or a local provider such as --tts-engine supertonic after installing
the matching local extra.
export OPENAI_API_KEY=...
For local desktop/REPL voice and local cloning engines, use the platform profile for your machine:
pip install "abstractvoice[apple]"
pip install "abstractvoice[gpu]"
Common extras:
pip install "abstractvoice[openai]" # hosted OpenAI intent extra (no extra deps today)
pip install "abstractvoice[openai-compatible]" # generic compatible provider intent extra
pip install "abstractvoice[web]" # local FastAPI web example
pip install "abstractvoice[piper]" # local Piper TTS only
pip install "abstractvoice[supertonic]" # local Supertonic 3 ONNX TTS only
pip install "abstractvoice[stt]" # local faster-whisper STT only
pip install "abstractvoice[stt-hf]" # local Transformers/Hugging Face ASR (e.g. openai/whisper-large-v3, openai/whisper-large-v3-turbo, Qwen/Qwen3-ASR-1.7B)
pip install "abstractvoice[omnivoice]" # recommended/default local cloning engine
pip install "abstractvoice[qwen3-tts]" # Qwen3-TTS: preset speakers, cloning, voice design (Python 3.10+)
pip install "abstractvoice[cloning]" # explicit OpenF5 cloning engine
Notes:
abstractvoice[apple] and abstractvoice[gpu] are platform install profiles for the local voice stack: Piper, Supertonic 3, faster-whisper, audio I/O, AEC where supported, and local cloning/TTS engines gated by Python-version markers.abstractvoice[all-apple] and abstractvoice[all-gpu] install the full platform stack plus the web example dependencies.--tts-engine supertonic), while
local cloning defaults to OmniVoice (--cloning-engine omnivoice).aec-audio-processing does.docs/installation.md.Some features rely on large model weights/artifacts. AbstractVoice will not download these implicitly inside the REPL (offline-first).
After installing, prefetch explicitly (cross-platform).
Recommended (most users):
abstractvoice-prefetch --supertonic
abstractvoice-prefetch --piper en
abstractvoice-prefetch --stt small
Optional (voice cloning artifacts):
pip install "abstractvoice[cloning]"
abstractvoice-prefetch --openf5
# Heavy (torch/transformers):
pip install "abstractvoice[audiodit]"
abstractvoice-prefetch --audiodit
pip install "abstractvoice[omnivoice]"
abstractvoice-prefetch --omnivoice
# GPU-heavy:
pip install "abstractvoice[chroma]"
abstractvoice-prefetch --chroma
OmniVoice is the default local cloning backend for new clones. Supertonic is not a cloning engine; use it for fixed-profile base TTS.
Equivalent python -m form:
python -m abstractvoice download --supertonic
python -m abstractvoice download --piper en
python -m abstractvoice download --stt small
python -m abstractvoice download --openf5 # optional; requires abstractvoice[cloning]
python -m abstractvoice download --chroma # optional; requires abstractvoice[chroma] (GPU-heavy)
python -m abstractvoice download --audiodit # optional; requires abstractvoice[audiodit]
python -m abstractvoice download --omnivoice # optional; requires abstractvoice[omnivoice]
Notes:
--piper <lang> downloads the Piper ONNX voice for that language into ~/.piper/models.--supertonic downloads Supertonic 3 ONNX weights and built-in voice styles into ~/.cache/abstractvoice/supertonic-3.--openf5 is ~5.4GB. --chroma is very large (GPU-heavy).abstractvoice --verbose
# or (from a source checkout):
python -m abstractvoice cli --verbose
# Force hosted OpenAI audio:
OPENAI_API_KEY=... abstractvoice --tts-engine openai --stt-engine openai --verbose
Notes:
--voice-mode stop (or in-session: /voice stop).auto prefers installed Supertonic, then installed Piper, then
OpenAI remote. A plain lightweight install therefore starts on OpenAI, while
abstractvoice[all-apple] / abstractvoice[all-gpu] start on Supertonic. If
the status line says openai (remote), /speak is making a remote TTS
request.abstractvoice[supertonic] or a
platform profile, prefetch explicitly, and start with
abstractvoice --tts-engine supertonic --stt-engine faster_whisper./voices; older commands such as
/profile, /tts_voice, and /setvoice remain as compatibility/direct
forms./tts engine ... resets the base voice/profile to the
default for that engine and language; for example Supertonic starts on M1.docs/api.md → “Integrations”).See docs/repl_guide.md.
pip install "abstractvoice[web]"
abstractvoice web --port 5000
# Hosted OpenAI audio in the same web UI
OPENAI_API_KEY=... abstractvoice web --tts-engine openai --stt-engine openai
# Guaranteed local web TTS after explicit prefetch
abstractvoice web --tts-engine supertonic --stt-engine faster_whisper
# OpenAI-compatible remote audio
abstractvoice web --tts-engine openai-compatible --stt-engine openai-compatible --remote-base-url http://localhost:8000/v1
Use pip install "abstractvoice[web,supertonic]" for the browser UI plus
Supertonic, pip install "abstractvoice[web,omnivoice]" for OmniVoice, or
pip install "abstractvoice[all-apple]" / abstractvoice[all-gpu] for the
browser UI plus the platform local stack.
Open http://127.0.0.1:5000. The browser example has message/conversation
playback, chat clearing, assistant/user voice selectors, browser voice cloning
from uploaded or recorded reference audio, text-to-WAV, file transcription, and
a tiny optional LLM dialogue panel for OpenAI-compatible local providers such as
Ollama or LM Studio. It exposes small local /api/* routes plus /v1/audio/*
smoke-test aliases. The /v1/audio/voices and /v1/voice/clone extension
routes let another AbstractVoice client discover profiles/cloned voices and
request compatible remote cloning. The supported production HTTP path remains
AbstractCore Server. Treat the browser example as a local/dev surface: it does
not inherit AbstractCore/Gateway bearer-token or browser-origin policy.
The browser clone action validates the new voice by synthesizing a short sample before it reports success. If the selected optional engine cannot load, the unusable clone is removed and the UI shows the backend error.
from abstractvoice import VoiceManager
vm = VoiceManager()
vm.speak("Hello! This is AbstractVoice.")
VoiceManager() is remote-first and reads OPENAI_API_KEY from the
environment. For offline/local inference:
from abstractvoice import VoiceManager
vm = VoiceManager(
tts_engine="supertonic",
stt_engine="faster_whisper",
cloning_engine="omnivoice",
)
vm.speak("Hello from the local stack.")
Install local support first with pip install "abstractvoice[supertonic]"
and pip install "abstractvoice[omnivoice]", or a platform profile such as
abstractvoice[apple] / abstractvoice[gpu].
See docs/api.md for the supported integrator contract.
At a glance:
speak(), set_tts_engine(), stop_speaking(), pause_speaking(), resume_speaking(), speak_to_bytes(), speak_to_file()transcribe_file(), transcribe_from_bytes()listen(), stop_listening(), pause_listening(), resume_listening()docs/getting-started.mddocs/api.mddocs/architecture.mddocs/faq.mddocs/repl_guide.mddocs/known-issues.mddocs/README.mddocs/installation.mddocs/multilingual.mddocs/adr/docs/acronyms.mddocs/model-management.mddocs/voices-and-licenses.mdCHANGELOG.mdCONTRIBUTING.mddocs/known-issues.md.github/ISSUE_TEMPLATE/bug_report.ymlSECURITY.mdACKNOWLEDGMENTS.mdMIT. See LICENSE.
146 commits
Python
100.0%