Python SDK for the Fennec ASR API
Project description
fennec-asr (Python SDK)
A small, friendly Python SDK for the Fennec ASR API. It supports:
- Batch transcription (HTTP) – upload a file or provide a URL, then poll until complete.
- Speaker Diarization – identify different speakers in batch transcriptions.
- Realtime transcription (WebSocket) – stream raw PCM audio bytes and receive partial/final results.
- One-liner convenience –
transcribe("sample.mp3")usingFENNEC_API_KEYfrom your environment. - CLI –
fennec-asr <file-or-url>prints the transcript.
API base:
https://asr-api-hso0.onrender.com/api/v1(configurable)
Install
pip install fennec-asr
Optional live-microphone helper (via
sounddevice):pip install sounddevice numpy
Quickstarts
1) One-liner (batch)
from fennec_asr import transcribe
# FENNEC_API_KEY must be set in your env
print(transcribe("sample.mp3"))
Environment:
export FENNEC_API_KEY="sk_***"
# optional:
# export FENNEC_BASE_URL="https://your-deployment/api/v1"
2) Batch with options
from fennec_asr import FennecASRClient
client = FennecASRClient(api_key="sk_***")
job_id = client.submit_url(
"https://example.com/audio.mp3",
context="Lightly punctuate. Keep acronyms uppercase.",
apply_contextual_correction=False,
formatting={"newline_pause_threshold": 0.65, "double_newline_pause_threshold": 0.7},
)
final = client.wait_for_completion(job_id, timeout_s=300)
if final["status"] == "completed":
print(final["transcript"])
else:
print("Failed:", final.get("transcript"))
3) Realtime (WebSocket)
import asyncio
from fennec_asr import Realtime
async def main():
rt = Realtime("sk_***").on("final", print).on("error", lambda e: print("ERR:", e))
async with rt:
# Send 16kHz, mono, 16-bit PCM bytes (no helper; bring your own frames)
# The client performs a start/ready handshake automatically on enter.
# After you see the "open" event, you can send 16kHz, mono, 16-bit PCM:
await rt.send_bytes(b"...")
await rt.send_eos()
async for _ in rt.messages(): # drain until server closes
pass
asyncio.run(main())
To receive only “complete thoughts”, construct with
Realtime("sk_***", detect_thoughts=True)and subscribe to.on("thought", ...).
4) CLI
fennec-asr sample.mp3
# or:
fennec-asr "https://example.com/audio.mp3"
# with options:
fennec-asr sample.mp3 --context "meeting notes" --apply-correction --formatting '{"newline_pause_threshold":0.65}'
API
FennecASRClient(api_key: str, base_url: str = DEFAULT_BASE_URL, timeout: int = 60)
submit_file(path, context=None, apply_contextual_correction=False, formatting=None) -> job_idsubmit_url(audio_url, context=None, apply_contextual_correction=False, formatting=None) -> job_idget_status(job_id) -> dictwait_for_completion(job_id, poll_interval_s=3.0, timeout_s=300.0) -> dicttranscribe_file(path, ...) -> str(submit + wait)
Realtime(api_key: str, *, ws_url=..., sample_rate=16000, channels=1, detect_thoughts=False, ...)
Event-driven WS client:
- Register events with
.on("partial"|"final"|"thought"|"open"|"close"|"error", callback) await open() / close()(or useasync with)await send_bytes(chunk: bytes)– raw 16kHz mono 16-bit PCMawait send_eos()async for msg in messages(): ...– raw JSON frames if you want lower-level access
Back-compat alias: StreamingSession = Realtime.
Convenience
transcribe(source, *, context=None, apply_contextual_correction=False, formatting=None, timeout_s=300.0) -> strget_default_client()– readsFENNEC_API_KEY/FENNEC_BASE_URLfrom env.
Errors
Exceptions live in fennec_asr.exceptions:
AuthenticationError– 401/403NotFoundError– 404APIError– other non-2xx or SDK-level errorsFennecASRError– base class
The client surfaces server messages; future versions may include request_id and structured problem details if the server provides them.
Notes & Expectations
- Audio format (WS): 16kHz, mono, 16-bit PCM (
int16). Convert withffmpeg:ffmpeg -y -i input.wav -ac 1 -ar 16000 -acodec pcm_s16le output.pcm
Then read bytes fromoutput.pcm. - Formatting options: pass a dict; the SDK will JSON-encode when required.
- Idempotency & retries: basic happy-path covered; advanced policies can be added (see roadmap).
Development
# setup
python -m venv .venv && source .venv/bin/activate
pip install -U pip build twine pytest
# run tests
pytest -q
# build & upload (needs PyPI creds)
python -m build
twine upload dist/*
License
MIT © Fennec ASR
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fennec_asr-1.1.8.tar.gz.
File metadata
- Download URL: fennec_asr-1.1.8.tar.gz
- Upload date:
- Size: 17.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e3a52c92f34554a147643789452d71f8f4cb912760af545b6540763698c60c4b
|
|
| MD5 |
933485249f6b90d4a9134fc3690988f8
|
|
| BLAKE2b-256 |
27d4408930d2640aa3231722444f0aa8a97ae5e4b287617b6d79738ac9f35385
|
File details
Details for the file fennec_asr-1.1.8-py3-none-any.whl.
File metadata
- Download URL: fennec_asr-1.1.8-py3-none-any.whl
- Upload date:
- Size: 16.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4cf571928783c92b5f5b587b9a0c79b234a0523fc2357860e6e6ac6cd0f11d94
|
|
| MD5 |
7107bb0603a228adb987a540cd5ade7f
|
|
| BLAKE2b-256 |
dfecbdddfe3210966fcbef69b90a304f4f8995d6a68e48325866b974a1d05138
|