Repository navigation
tools/paradee: run Paradee-8M v1.1 natively (source-filter head) - #86
Merged
Merged
Conversation
Paradee-8M v1.1 keeps v1.0's text side and AdaIN trunk and replaces the iSTFTNet generator and phase lock with vhead.py SourceFilterHead2. This adds: - converter --version 1.1, with the v1.1 HF files and source scripts pinned in pins.json; paradee.version / paradee.decoder.head in the GGUF - src/paradee-head.cpp: the ConvNeXt stack on the kokoro layers, the 64-harmonic sine bank, pulsing and burst noise, mixed-radix STFT/iSTFT 600/150 and 150/75, a seeded Gaussian noise source (or caller-supplied noise) - routing in paradee_load_model from paradee.decoder.head (absent = v1.0, so existing v1.0 GGUFs load unchanged and give byte-identical audio) - kokoro decoder_front_forward: the AdaIN trunk alone (Kokoro-82M output byte-identical) - dump_paradee_reference.py dump --version 1.1 with fixed noise, and v1.1 gates in test-paradee-parity (text side bit-identical to v1.0, trunk / head stages within 1e-3 x RMS given the reference inputs and noise, sine bank vs float64, end-to-end SNR >= 35 dB) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
This PR runs Paradee-8M v1.1 (sahilmahendrakar/Paradee-8M-v1.1 at
330617ad, Apache-2.0) natively intools/paradee, alongside v1.0. It is the follow-up proposed in #85.convert_paradee_pt_to_gguf.py --version 1.1checks the v1.1 files against the newpins.json"v1.1"section. That section pins the HF files,vhead.py/export_paradee_v1_1.pyat paradee606e16e1, and the output GGUF. The output is byte-reproducible (--check-outputpasses for both versions).src/paradee-head.cppimplementsvhead.pySourceFilterHead2:paradee_synth_options::noise_seed, default 0), so output is deterministic. Callers can also supply the noise (paradee_stages::noise_in).paradee.decoder.head(istftnet_lock/source_filter_v2) andparadee.version, andparadee_load_modelpicks the graph from them. A GGUF without the key is v1.0.357477…v1.0 file still loads and gives byte-identical audio.libelizainference.dylib:paradee_load+synthesize_allocwith the v1.0 and then the v1.1 GGUF in one context.decoder_front_forwardexposes the AdaIN trunk on its own (the existing weight filling, moved). Kokoro-82M audio is byte-identical before and after (kokoro-tts,af_bella).dump_paradee_reference.py dump --version 1.1runs the upstream module in float32 with fixed noise:torch.randnseeded per sentence, or read from--noise-dir. It writes the noise as a stage.test-paradee-paritygains the v1.1 gates below.test-paradee-apicovers the seed, injected noise and the head API.PARADEE_FIXTURE_DIRcan now be set at run time, for device runs.Parity (5 sentences; M4 Max and TB336FU arm64 both OK)
PARADEE_GGUF_V10)sine_bankthan float32 is from float64The sine bank is gated against float64 because torch's float32
sin(2πk·cyc)is itself up to 9e-4 × RMS off. This follows the v1.0 lock gate. The v1.0 parity test,test-paradee-api(both versions),test-paradee-phase-lock, the kokoro tests andeliza-inference-test-paradee-{asr,stream-output}all pass.v1.1 against v1.0 (the 40 sentences from #85, 130.1 s)
base.enparadee-tts --repeat 3)/data/local/tmp/paradee-v11, an NDK 29 arm64 build (android-28). That directory has been removed.GGUFs
paradee-8m-v1.1-f32.gguf(--version 1.1)f205ab055f0120d571aa6fda2deadde1e6fbc88e8d8bd56a592917fd0e50892eparadee-8m-v1.0-f32.gguf(this converter)c0d8f2010571c01015277bc11c9901d4d4cfbbfb25145932cdd86398464281d2The v1.0 sha changes only because the converter (its blob sha is in the metadata) and two new keys changed. The tensors are the same. The shipped
357477…file does not need to move.What would change downstream once this merges (not done here)
elizaOS/eliza (a reviewed PR that bumps
plugins/plugin-local-inference/native/llama.cppto the merged commit):packages/app/platforms/android/paradee-voice/inputs.jsonparadee: pathtts/paradee/paradee-8m-v1_1.gguf, bytes31275232, sha256f205ab05…, and source text--version 1.1fromsahilmahendrakar/Paradee-8M-v1.1.plugins/plugin-native-inference/src/model-catalog/voice-model-versions.json:mobile-voiceversion (1.3.0) whoseparadee-8m-v1.1row has the new path, hfPath, sha and bytes;sourceset to reposahilmahendrakar/Paradee-8M-v1.1, revision330617ad…, withdecoder.pt143f9678…(14,655,657 B) andconfig.jsonc3f420e8…;text_side.ptandtokenizer.jsonare unchanged;missingAssetsfilename.plugins/plugin-local-inference/src/host-tts-worker.ts;BionicSpeechInstrumentedTest.java(MODEL_HASH);ElizaBionicInferenceServer.java(PARADEE_MODEL);aosp-voice-download.tsand its test (filename migration);packages/app/README.mdtext.Grace (senior-care):
vendor/elizaandupstream.lock.jsonto that reviewed eliza commit.apps/app/native/android/voice/voice.lock.jsonpins no Paradee hash itself; it points at elizainputs.json. Nothing hash-bearing changes there. Only updatespeechif a field names the version.apps/app/scripts/apk.mjsasset path…/tts/paradee/paradee-8m-v1_1.gguf.voice/assets/grace-voice/NOTICE.txt(the v1.1 URL), thevoice/build.gradlecomment, anddocs/device-voice.md,docs/prd.mdand thedocs/verification.mdGGUF lines.docs/decisions.mdrow 3 names Paradee-8M v1.0, so the switch is an owner decision.stage-device-voice.mjs --build.Not covered
main, not tools/paradee: memory-map the F32 GGUF; record the F16 and v1.1 evaluation #85. Once both merge, tools/paradee: memory-map the F32 GGUF; record the F16 and v1.1 evaluation #85's mmap applies to the v1.1 file too (it is all F32).AI-assisted change.
🤖 Generated with Claude Code