Repository navigation
Releases: user-github-me/soniccraft
Releases · user-github-me/soniccraft
Release list
SonicCraft v0.1.0
First release: timeline DSL v1.0 and engine v0.1.
Added
- Timeline DSL v1.0 (YAML 1.2 or JSON): output and mastering settings, subtitle layout, timing policy,
mix reference level, voice defaults, a speakers registry, provider instances, and speech, music and sfx
tracks with cues, pauses and clips. Values accept unit strings ("350ms","1.5s","1m30s",
"00:01:30.500","320k"). - Validation with agent-first diagnostics: stable codes,
field.sub[index]paths, line/column for YAML,
did-you-mean hints for unknown keys, enum values, references and providers; every problem reported at
once; secrets in timelines rejected. - Timing: sequential placement with pauses, absolute starts, and relative anchors (
after_cue,
with_cue,before_cue, signed offsets) on cues, clips and tracks; dependency-cycle detection; a
sample-accurate layout engine with the speech-overlap policy (pushby default, orwarn,error,
allow) and per-cueallow_overlap. - TTS providers: ElevenLabs (word timestamps), OpenAI-compatible
/audio/speechservers, Cartesia
(word timestamps), Kokoro via Kokoro-FastAPI (word timestamps), Piper, macOSsay, custom commands and a
deterministic mock voice; content-addressed cache; concurrency limits; retries with backoff; credential
checks; voice listing; dry-run duration estimates in characters per second. - Native DSP: decoding, resampling, silence trimming, per-source loudness normalization, loops with
optional seam crossfades, fades (equal-power, linear, exponential), clip crossfades, constant-power
panning, sidechain and cue-driven ducking with attack, release, hold and lookahead. - Mastering: EBU R128 / BS.1770 loudness normalization with presets (
podcast-16,streaming-14,
broadcast-23,atsc-24 LUFS) and an iterative, 4× oversampled true-peak limiter. - Encoders: WAV (16/24-bit integer, 32-bit float), MP3 (LAME, CBR; cargo feature
mp3, on by default),
FLAC (16/24-bit); ogg, opus and m4a through ffmpeg; fixed-seed TPDF dither. - Subtitles: WebVTT, SRT, JSON with per-word timestamps, and a HyperFrames-compatible transcript;
speaker labels; caption overrides. - Side files: per-track stems, a deterministic manifest, and a self-contained HTML preview (waveform,
ducking envelopes, captions). - CLI
soniccraft:validate,plan(dry-run),render,schema,init,providers,voices,
cache,mcp;--jsonoutput and exit codes 0/1/2/3. - MCP server (
soniccraft mcp,soniccraft-mcp) serving both protocol eras: tools
soniccraft_validate_timeline,soniccraft_dry_run,soniccraft_render,soniccraft_get_schema,
soniccraft_list_providers,soniccraft_list_voices. - Agent Skill
skills/soniccraftwith references and five templates; Claude Code plugin and marketplace
manifests; Codex skill metadata. - Examples (
tech-briefing,two-person-podcast,offline-demo) with procedurally generated,
royalty-free assets and the script that generates them. - Dual MIT OR Apache-2.0 licensing; CI on Linux and macOS.
- A container image,
ghcr.io/user-github-me/soniccraft(linux/amd64 and linux/arm64, with ffmpeg), published
from each release's Linux binaries;docker build .builds it from source.
Added in pre-release hardening
- Release workflow: prebuilt
soniccraftandsoniccraft-mcpfor Linux (x86_64, arm64), macOS (Apple
silicon, Intel) and Windows (x86_64), each with and without the LGPL MP3 encoder, withSHA256SUMSand a
THIRD-PARTY-LICENSES.txtin every archive. - The
soniccraft-mcpnpm launcher (npx -y soniccraft-mcp): runssoniccraft mcp, downloading the
matching release on first use and verifying it against checksums pinned in the package. licenses/with the LAME and LGPL/GPL texts and the steps to relink a modified LAME; a cargo-deny license,
ban and source policy (deny.toml).- CI: the minimum Rust version, Windows (build and smoke render), cargo-deny, rustdoc, and the npm packages
on Node 20 and 24. - New diagnostics:
comment_in_text(an unquoted#cut a cue's text short),suspicious_value(seconds
written as milliseconds;{text}/{voice_id}as a command argument of its own),speakers_share_voice,
unknown_voice(macOS voice not installed, piper model not found, already in validate),
track_anchor_out_of_order,timeline_too_long(over 24 h, or over the render memory budget),
loudness_target_missed,true_peak_exceeded,cache_write_failed,audio_repaired,
channels_downmixed. - Render memory budget:
SONICCRAFT_MAX_RENDER_GB(default 8); a render that would need more stops before
any TTS request, and validate/plan warn. SONICCRAFT_ALLOWED_HOSTS: hosts besides each provider's own API host and servers on this machine that may
receive API keys.- MCP:
detail: auto|summary|fullon validate, dry run, render and get_schema (compact reports above about
12,000 characters, whole results under about 40,000;fullnever turns into -32603); aformatargument on
render; at most two concurrent renders (SONICCRAFT_MCP_MAX_RENDERS), queued renders report progress and
can be cancelled; 2026-07-28 results carry_metaserverInfo. - CLI:
soniccraft mcp --allow-command/SONICCRAFT_ALLOW_COMMAND=1. RenderReport.loudness.pre_encode: the master that went into a lossy encoder.- Sources with more than two channels (5.1, 7.1) are mixed down with ITU-R BS.775 instead of being
unusable. - Docs: a Security and a Resources section in the README, a Setup section in the skill (install, verify,
failed MCP server), Codex approval settings forcodex exec. - Library APIs:
soniccraft_core::parse::secret_spans,parse::MAX_NODES,values::parse_duration
(DurationError),values::MAX_BITRATE_BPS,spelling_ofon every name enum,Compiled.assets
(AssetRef),ir::checked_ms_to_frames,diagnostics::display_pathandhuman_duration; layout
Layout::estimate_dependent,depends_on_estimates,diagnostics_with_estimates,has_certain_errors;
dspdownmix,master::master_with_cancel,limiter::limit_in_place,loudness::measure_file,
measure_with_cancel,duck::cue_regions,wav::read_repaired, newDecodeInfofields; tts
render_mock,resolve_macos_voice,resolve_piper_model,probe_reachable,key_host_allowed,
settings_keys,command_argument_warnings,error_codes,TtsOptions.child_env_remove,
SynthesisResult.cache_write_error; engineMAX_TIMELINE_BYTES,TimelineSource::from_reader,
LoudnessReport.pre_encode, workingEngineOptions.allow_commandandconfine_outputs_to; mcp
ServerOptions::max_concurrent_renders,ALLOW_COMMAND_ENV,MAX_RENDERS_ENV.
Behaviour settled in pre-release hardening
- enum spellings are exact (
Speech,MP3,equal-powerareinvalid_valuewith a
did-you-mean); duration units are lowercase and clock seconds must be below 60; bitrate strings take no
sign or exponent;version: "01.0"is invalid; padded ids (" v ") areinvalid_id. - every time is at most 24 h (larger values, usually epoch milliseconds, are
invalid_value),
and a timeline longer than 24 h istimeline_too_long;target_lufsmust be in [-60, -5] (was
[-70, -5]); a total length of 0 isinvalid_value. - a misspelled speaker (a close match of a defined speaker) is an error; voice keys inside
settings(settings.voice) are afield_not_applicablewarning. - MCP servers refuse
commandproviders (and piper with its owncommand) unless started
with--allow-command; a timeline's ownoutput.pathmust stay inside the MCP base directory. - API keys go only to the provider's own API host, to servers on this machine (only the
provider's own key variable), or toSONICCRAFT_ALLOWED_HOSTS; regional, remote and other local-network
endpoints must be listed, and so must a local server that should get a variable named byapi_key_env. - command and piper cache keys include the program, its content hash, script files and the
piper model, so those cues re-synthesize once. soniccraft_core::Compiledhas a new fieldassets(build it with
..Compiled::default());DspErrorhas a new variantCancelled; the name enums'parseis exact
(case-sensitive, no trimming), sobuiltin_type("Eleven-Labs")isNone;Layout.total_framesis capped
at 24 h.- JSON input has the YAML limits (250000 values, 64 levels) and diagnostics for comments and trailing
commas; stdin/MCP auto-detection no longer reads such JSON as YAML. - Hints convert values (
44.1k→44100,50%→0.5,target_lufs: 16→-16,youtube→
streaming,start_at_ms: a2→start_relative: {after_cue: a2}) and know common key synonyms (file,
voice_name,start_after,pause_ms), with unit notes for bare numbers. secret_in_timelinealso covers annotation keys (x-api-key), keys inside provider strings (Bearer,
--api-key=, URLs) and URL passwords; diagnostics never repeat a secret, and CLI source snippets show it as
<redacted>.- The JSON Schema encodes conflicts, applicability by track type, time sign and length rules, and
null-as-absent. - Renders commit their outputs atomically: a cancelled or failed render never deletes or half-writes
earlier outputs, and files that are not SonicCraft outputs are never overwritten. - Lossy outputs (mp3, ogg, opus, m4a) are decoded and measured as delivered, with codec true-peak and
loudness-drift compensation (at most 3 passes); the report's loudness describes the delivered file. - Mastering brackets the gain and keeps the pass closest to the target; an unreachable target gives the
loudest master within 6 dB of limiting, the same for every target out of reach. - Dry runs render mock voices exactly; ducking regions are computed from intervals; layout errors that depend
on estimated durations are warnings in validate and plan; a render...