Python SDK for the Breeze Blue Developer API.
Project description
Breeze Blue Python SDK
Python SDK for the Breeze Blue Developer API. Covers text-to-speech, voice management, voice preview generation, history audio, models, and account usage.
Install
uv add breeze-blue
or:
pip install breeze-blue
API Key
Create an API key in the Breeze Blue Developer Console, then export it:
export BREEZE_API_KEY=brz_...
The SDK sends the key with the xi-api-key header.
Quickstart
from breeze_blue import BreezeBlue, save
client = BreezeBlue()
audio = client.text_to_speech.convert(
voice_id="voc_...",
text="Hello from Breeze Blue.",
output_format="mp3",
)
save(audio, "hello.mp3")
print(audio.content_type)
print(audio.history_item_id)
BreezeBlue() reads BREEZE_API_KEY by default and sends requests to
https://api.breeze.blue. To point at another environment, pass base_url=...
or set BREEZE_BASE_URL.
client = BreezeBlue(
api_key="brz_...",
base_url="https://api.breeze.blue",
timeout=120.0,
)
All resource methods accept timeout=<seconds> to override the client default
for a single call.
Text to Speech
audio = client.text_to_speech.convert(
voice_id="voc_...",
text="Render this line.",
)
streamed_audio = client.text_to_speech.stream(
voice_id="voc_...",
text="Stream this line.",
)
rewritten = client.text_to_speech.ai_rewrite(
instruction="Calm, warm, bedtime narration.",
language_code="en",
)
Use async text-to-speech for long text, reference-heavy voices, or batch production where the caller should not hold an HTTP connection open:
job = client.text_to_speech.create_job(
voice_id="voc_...",
text="Render this longer script.",
output_format="mp3",
)
status = client.generation_jobs.get(job["generation_job_id"])
if status["status"] == "ready":
audio = client.generation_jobs.download_audio(job["generation_job_id"])
audio.save("async.mp3")
If the job is still active, download_audio(...) raises
GenerationNotReadyError; read exc.retry_after before retrying.
The API uses the default text-to-speech model when model_id is omitted. If
you need to select a model explicitly, call client.models.list() and pass one
of the returned model_id values.
Audio responses are returned as AudioResponse:
audio.content # bytes
audio.content_type # e.g. "audio/mpeg"
audio.history_item_id # history item id when returned by the API
audio.save("speech.mp3")
Playback helpers are available for local scripts:
from breeze_blue import play, stream
play(audio) # ffplay, with macOS afplay fallback
stream(audio) # mpv; accepts AudioResponse, bytes, or an iterable of byte chunks
audio.stream() is a buffered helper for AudioResponse.
Use the module-level stream(audio_chunks) helper when you already have chunked
audio data.
Voices
Browse existing voices and inspect a single voice:
voices = client.voices.search(search="narrator")
first_voice_id = voices["voices"][0]["voice_id"]
voice = client.voices.get(first_voice_id)
settings = client.voices.get_settings(first_voice_id)
random_voice = client.voices.random()
print(random_voice["voice_id"], random_voice["name"])
Breeze voice creation is always two steps: produce a preview, let the user accept it, then save the preview as a real voice. Two ways to produce a preview:
# Option A — clone preview from an audio sample
clone_preview = client.voices.create_clone_preview(
name="Demo voice",
file="sample.wav",
text="This is a short preview script.",
)
generated_voice_id = clone_preview["generated_voice_id"]
# Option B — design preview from a text description (no audio)
design = client.voices.create_design_preview(
voice_description="Warm documentary narrator with clear articulation.",
)
generated_voice_id = design["previews"][0]["generated_voice_id"]
files is also accepted with exactly one item.
Stream the preview so the user can audition it, then save the one they pick:
audio = client.voices.stream_preview(generated_voice_id)
audio.save("preview.mp3")
saved = client.voices.save_preview(
generated_voice_id=generated_voice_id,
voice_name="Documentary narrator",
)
Edit, tune settings, or delete a saved voice:
client.voices.edit(saved["voice_id"], name="Renamed narrator")
client.voices.edit_settings(saved["voice_id"], guidance_scale=1.2)
client.voices.delete(saved["voice_id"])
History, Models, and Account
models = client.models.list()
balance = client.account.balance()
usage = client.account.usage(days=7)
key_usage = client.account.usage(api_key_id="key_01hprod", client_type="sdk")
history = client.history.list(page_size=10)
item = client.history.get(history["history"][0]["history_item_id"])
audio = client.history.download_audio(item["history_item_id"])
Common response shapes are exported as TypedDict types from
breeze_blue.types and from the package root.
Errors
All API errors inherit from BreezeBlueError. HTTP status codes and Breeze
error codes map to typed exceptions:
BadRequestErrorAuthenticationErrorForbiddenErrorNotFoundErrorConflictErrorValidationErrorRateLimitErrorBillingInsufficientCreditsErrorUpstreamErrorServiceUnavailableError
from breeze_blue import BreezeBlue, RateLimitError
try:
BreezeBlue().models.list()
except RateLimitError as exc:
print(exc.retry_after)
Each ApiError exposes status_code, code, detail, meta, and
retry_after.
Project details
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 breeze_blue-0.4.0.tar.gz.
File metadata
- Download URL: breeze_blue-0.4.0.tar.gz
- Upload date:
- Size: 13.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a49462d537600df791ef6929543b4350631f5340aa7152d2682b1f8fb95fb9e7
|
|
| MD5 |
da8ab3702716a1b31f502566ccd6c2ab
|
|
| BLAKE2b-256 |
27989e55758fae31717ebe9926caa353aaddd34d558d071333ff572a2e40ae37
|
File details
Details for the file breeze_blue-0.4.0-py3-none-any.whl.
File metadata
- Download URL: breeze_blue-0.4.0-py3-none-any.whl
- Upload date:
- Size: 13.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b15fcb5bcb654ca9d0b2b699fcc63d7b2e897f168d8860715d79838457010e48
|
|
| MD5 |
724ac21ac44c7cdc01d7141f228e2de3
|
|
| BLAKE2b-256 |
8583c230e772fef7b8be22e3e9869690ac494f1c6fd8bc067863a263f7f4a330
|