voicerender 0.1.1__tar.gz → 0.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. {voicerender-0.1.1 → voicerender-0.2.1}/.github/workflows/codecov.yml +2 -2
  2. {voicerender-0.1.1 → voicerender-0.2.1}/.github/workflows/pre-commit.yml +1 -1
  3. {voicerender-0.1.1 → voicerender-0.2.1}/.github/workflows/python-publish.yml +2 -2
  4. {voicerender-0.1.1 → voicerender-0.2.1}/.github/workflows/tests.yml +50 -18
  5. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/events/events.jsonl +23 -0
  6. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.1.1/audit/commit-audit.yaml +36 -0
  7. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.1.1/entries/entry-0001.md +29 -0
  8. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.1.1/release.md +27 -0
  9. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/audit/commit-audit.yaml +690 -0
  10. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0001.md +37 -0
  11. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0002.md +39 -0
  12. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0003.md +39 -0
  13. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0004.md +29 -0
  14. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0005.md +31 -0
  15. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0006.md +30 -0
  16. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/entries/entry-0007.md +31 -0
  17. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.0/release.md +27 -0
  18. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/audit/commit-audit.yaml +176 -0
  19. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/entries/entry-0001.md +48 -0
  20. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/entries/entry-0002.md +34 -0
  21. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/entries/entry-0003.md +28 -0
  22. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/entries/entry-0004.md +27 -0
  23. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/entries/entry-0005.md +31 -0
  24. voicerender-0.2.1/.ledger/releaseledger/data/ledgers/main/releases/0.2.1/release.md +27 -0
  25. voicerender-0.2.1/.ledger/releaseledger/work/0.1.1/audit-decisions.yaml +12 -0
  26. voicerender-0.2.1/.ledger/releaseledger/work/0.1.1/entries.yaml +25 -0
  27. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/audit-decisions.yaml +338 -0
  28. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/audit.yaml +425 -0
  29. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/entries.yaml +139 -0
  30. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/evidence/19f5b06.patch +1522 -0
  31. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/evidence/245ca9f.patch +637 -0
  32. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/evidence/42a90e3.patch +10816 -0
  33. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/evidence/480cbea.patch +1700 -0
  34. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/evidence/4eb3c28.patch +370 -0
  35. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/evidence/50f298e.patch +176 -0
  36. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/evidence/56ae327.patch +1645 -0
  37. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/evidence/57f1e24.patch +693 -0
  38. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/evidence/6dae2b6.patch +2477 -0
  39. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/evidence/84f29db.patch +250 -0
  40. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/evidence/a390661.patch +598 -0
  41. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/evidence/a431dfa.patch +264 -0
  42. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/evidence/c2be7b3.patch +5101 -0
  43. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/evidence/da15247.patch +1489 -0
  44. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/evidence/ede34ea.patch +385 -0
  45. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/evidence/manifest.json +361 -0
  46. voicerender-0.2.1/.ledger/releaseledger/work/0.2.0/range.json +13 -0
  47. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/audit-decisions.yaml +85 -0
  48. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/audit.yaml +122 -0
  49. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/entries.yaml +107 -0
  50. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/evidence/3342e15.patch +50 -0
  51. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/evidence/3c82349.patch +4812 -0
  52. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/evidence/7f466cc.patch +163 -0
  53. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/evidence/84f629e.patch +675 -0
  54. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/evidence/b7e1917.patch +147 -0
  55. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/evidence/manifest.json +100 -0
  56. voicerender-0.2.1/.ledger/releaseledger/work/0.2.1/range.json +13 -0
  57. voicerender-0.2.1/MANIFEST.in +3 -0
  58. voicerender-0.2.1/PKG-INFO +359 -0
  59. voicerender-0.2.1/README.md +319 -0
  60. voicerender-0.2.1/docs/changelog.md +49 -0
  61. {voicerender-0.1.1 → voicerender-0.2.1}/docs/conf.py +5 -5
  62. voicerender-0.2.1/docs/index.md +67 -0
  63. voicerender-0.2.1/docs/renderprofile.md +156 -0
  64. voicerender-0.2.1/examples/README.md +51 -0
  65. voicerender-0.2.1/examples/plans/chapter.renderplan.toml +39 -0
  66. voicerender-0.2.1/examples/voices/narration.renderprofile.toml +36 -0
  67. voicerender-0.2.1/examples/voices/pocket-reference.toml +39 -0
  68. {voicerender-0.1.1 → voicerender-0.2.1}/pyproject.toml +19 -6
  69. {voicerender-0.1.1 → voicerender-0.2.1}/tests/test_backends.py +93 -41
  70. {voicerender-0.1.1 → voicerender-0.2.1}/tests/test_capacity.py +3 -3
  71. voicerender-0.2.1/tests/test_cli.py +624 -0
  72. voicerender-0.2.1/tests/test_engine_contracts.py +48 -0
  73. voicerender-0.2.1/tests/test_engine_registry.py +729 -0
  74. voicerender-0.2.1/tests/test_inflectsynth_engine.py +264 -0
  75. voicerender-0.2.1/tests/test_kittensynth_engine.py +382 -0
  76. voicerender-0.2.1/tests/test_kokoro_reference.py +405 -0
  77. voicerender-0.2.1/tests/test_managed_voices.py +176 -0
  78. voicerender-0.2.1/tests/test_package_metadata.py +6 -0
  79. voicerender-0.2.1/tests/test_pocketsynth_managed.py +591 -0
  80. voicerender-0.2.1/tests/test_preflight.py +875 -0
  81. voicerender-0.2.1/tests/test_qwen3_voice_design.py +185 -0
  82. voicerender-0.2.1/tests/test_qwen3synth_engine.py +688 -0
  83. voicerender-0.2.1/tests/test_render_book.py +934 -0
  84. {voicerender-0.1.1 → voicerender-0.2.1}/tests/test_renderer.py +2 -37
  85. voicerender-0.2.1/tests/test_renderplan_input.py +884 -0
  86. voicerender-0.2.1/tests/test_renderplan_render.py +1396 -0
  87. voicerender-0.2.1/tests/test_renderprofile.py +395 -0
  88. voicerender-0.2.1/tests/test_soprosynth_engine.py +432 -0
  89. voicerender-0.2.1/tests/test_storage.py +16 -0
  90. voicerender-0.2.1/tests/test_voice_source_codec.py +182 -0
  91. voicerender-0.2.1/tests/test_voice_sources.py +200 -0
  92. voicerender-0.2.1/tests/wheel_smoke.py +248 -0
  93. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/__init__.py +74 -19
  94. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/_version.py +3 -3
  95. voicerender-0.2.1/voicerender/book.py +1018 -0
  96. voicerender-0.2.1/voicerender/book_contract.py +78 -0
  97. voicerender-0.2.1/voicerender/book_layout.py +143 -0
  98. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/capacity.py +5 -5
  99. voicerender-0.2.1/voicerender/cli.py +981 -0
  100. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/engines/base.py +37 -3
  101. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/engines/inflectsynth.py +192 -63
  102. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/engines/kittensynth.py +243 -14
  103. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/engines/kokoro.py +499 -33
  104. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/engines/piper.py +1 -1
  105. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/engines/pipersynth.py +94 -24
  106. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/engines/pocket.py +1 -1
  107. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/engines/pocketsynth.py +140 -198
  108. voicerender-0.2.1/voicerender/engines/profiles.py +148 -0
  109. voicerender-0.2.1/voicerender/engines/qwen3synth.py +967 -0
  110. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/engines/registry.py +48 -27
  111. voicerender-0.2.1/voicerender/engines/soprosynth.py +997 -0
  112. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/engines/supertonicsynth.py +14 -0
  113. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/errors.py +8 -0
  114. voicerender-0.2.1/voicerender/managed_voices.py +207 -0
  115. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/models.py +0 -1
  116. voicerender-0.2.1/voicerender/preflight.py +296 -0
  117. voicerender-0.2.1/voicerender/py.typed +0 -0
  118. voicerender-0.2.1/voicerender/renderplan_input.py +667 -0
  119. voicerender-0.2.1/voicerender/renderplan_render.py +835 -0
  120. voicerender-0.2.1/voicerender/renderprofile.py +310 -0
  121. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/storage.py +3 -2
  122. voicerender-0.2.1/voicerender/voice_design.py +357 -0
  123. voicerender-0.2.1/voicerender/voice_source_codec.py +196 -0
  124. voicerender-0.2.1/voicerender/voice_sources.py +887 -0
  125. voicerender-0.2.1/voicerender.egg-info/PKG-INFO +359 -0
  126. voicerender-0.2.1/voicerender.egg-info/SOURCES.txt +172 -0
  127. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender.egg-info/requires.txt +11 -3
  128. voicerender-0.2.1/voicerender.egg-info/scm_file_list.json +167 -0
  129. voicerender-0.2.1/voicerender.egg-info/scm_version.json +8 -0
  130. voicerender-0.1.1/.ledger/releaseledger/data/ledgers/main/events/events.jsonl +0 -6
  131. voicerender-0.1.1/MANIFEST.in +0 -2
  132. voicerender-0.1.1/PKG-INFO +0 -254
  133. voicerender-0.1.1/README.md +0 -220
  134. voicerender-0.1.1/docs/changelog.md +0 -15
  135. voicerender-0.1.1/docs/utterplan-v5-integration.md +0 -77
  136. voicerender-0.1.1/examples/plans/chapter.utterplan.toml +0 -13
  137. voicerender-0.1.1/examples/voices/pocket-reference.toml +0 -10
  138. voicerender-0.1.1/examples/voices/voice.toml +0 -9
  139. voicerender-0.1.1/tests/fixtures/utterplan_v5_contract.toml +0 -36
  140. voicerender-0.1.1/tests/test_cli_v5.py +0 -236
  141. voicerender-0.1.1/tests/test_engine_registry.py +0 -330
  142. voicerender-0.1.1/tests/test_manifest.py +0 -229
  143. voicerender-0.1.1/tests/test_render_v5.py +0 -1072
  144. voicerender-0.1.1/tests/test_utterplan_v5.py +0 -224
  145. voicerender-0.1.1/voicerender/cli.py +0 -345
  146. voicerender-0.1.1/voicerender/handoff.py +0 -62
  147. voicerender-0.1.1/voicerender/inputs/__init__.py +0 -21
  148. voicerender-0.1.1/voicerender/inputs/utterplan_v5.py +0 -897
  149. voicerender-0.1.1/voicerender/manifest.py +0 -750
  150. voicerender-0.1.1/voicerender/render_v5.py +0 -1193
  151. voicerender-0.1.1/voicerender/schemas/render-manifest-v2.schema.json +0 -415
  152. voicerender-0.1.1/voicerender.egg-info/PKG-INFO +0 -254
  153. voicerender-0.1.1/voicerender.egg-info/SOURCES.txt +0 -95
  154. voicerender-0.1.1/voicerender.egg-info/scm_file_list.json +0 -90
  155. voicerender-0.1.1/voicerender.egg-info/scm_version.json +0 -8
  156. {voicerender-0.1.1 → voicerender-0.2.1}/.codecrate.toml +0 -0
  157. {voicerender-0.1.1 → voicerender-0.2.1}/.gitignore +0 -0
  158. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/ledger.toml +0 -0
  159. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/releaseledger/.ledger-project.toml +0 -0
  160. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/releaseledger/config.toml +0 -0
  161. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/releaseledger/data/.ledger-project.toml +0 -0
  162. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/audit/commit-audit.yaml +0 -0
  163. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0001.md +0 -0
  164. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0002.md +0 -0
  165. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0003.md +0 -0
  166. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0004.md +0 -0
  167. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/entries/entry-0005.md +0 -0
  168. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/releaseledger/data/ledgers/main/releases/v0.1.0/release.md +0 -0
  169. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/releaseledger/work/v0.1.0/audit-decisions.yaml +0 -0
  170. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/releaseledger/work/v0.1.0/entries.yaml +0 -0
  171. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/releaseledger/work/v0.1.0/evidence/264eb9b.patch +0 -0
  172. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/releaseledger/work/v0.1.0/evidence/774f6f2.patch +0 -0
  173. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/releaseledger/work/v0.1.0/evidence/9e71e84.patch +0 -0
  174. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/releaseledger/work/v0.1.0/evidence/c4a2872.patch +0 -0
  175. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/releaseledger/work/v0.1.0/evidence/fb7faaf.patch +0 -0
  176. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/releaseledger/work/v0.1.0/evidence/manifest.json +0 -0
  177. /voicerender-0.1.1/voicerender/py.typed → /voicerender-0.2.1/.ledger/releaseledger/write.lock +0 -0
  178. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/taskledger/.ledger-project.toml +0 -0
  179. {voicerender-0.1.1 → voicerender-0.2.1}/.ledger/taskledger/config.toml +0 -0
  180. {voicerender-0.1.1 → voicerender-0.2.1}/.pre-commit-config.yaml +0 -0
  181. {voicerender-0.1.1 → voicerender-0.2.1}/LICENSE +0 -0
  182. {voicerender-0.1.1 → voicerender-0.2.1}/docs/Makefile +0 -0
  183. {voicerender-0.1.1 → voicerender-0.2.1}/docs/make.bat +0 -0
  184. {voicerender-0.1.1 → voicerender-0.2.1}/docs/make.py +0 -0
  185. {voicerender-0.1.1 → voicerender-0.2.1}/docs/requirements.txt +0 -0
  186. {voicerender-0.1.1 → voicerender-0.2.1}/examples/plans/chapter.voiceplan.toml +0 -0
  187. {voicerender-0.1.1 → voicerender-0.2.1}/examples/voices/piper.toml +0 -0
  188. {voicerender-0.1.1 → voicerender-0.2.1}/setup.cfg +0 -0
  189. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/__main__.py +0 -0
  190. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/engines/__init__.py +0 -0
  191. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/engines/api_probe.py +0 -0
  192. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/engines/catalog.py +0 -0
  193. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/engines/metadata.py +0 -0
  194. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/engines/selection.py +0 -0
  195. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/events.py +0 -0
  196. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/lexicons.py +0 -0
  197. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender/render.py +0 -0
  198. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender.egg-info/dependency_links.txt +0 -0
  199. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender.egg-info/entry_points.txt +0 -0
  200. {voicerender-0.1.1 → voicerender-0.2.1}/voicerender.egg-info/top_level.txt +0 -0
@@ -14,10 +14,10 @@ jobs:
14
14
  python-version: "3.12"
15
15
  - name: Run tests with coverage
16
16
  run: |
17
- python -m pip install --upgrade pip
17
+ python -m pip install --upgrade "pip<26.2"
18
18
  python -m pip install coverage pytest pytest-cov
19
19
  python -m pip install -e ".[dev]"
20
- python -m pytest --cov=utterplan --cov-report=xml --junitxml=junit.xml
20
+ python -m pytest --cov=voicerender --cov-report=xml --junitxml=junit.xml
21
21
  - name: Upload coverage to Codecov
22
22
  uses: codecov/codecov-action@v5
23
23
  with:
@@ -21,7 +21,7 @@ jobs:
21
21
 
22
22
  - name: Install Python tools
23
23
  run: |
24
- python -m pip install --upgrade pip
24
+ python -m pip install --upgrade "pip<26.2"
25
25
  python -m pip install "ruff==0.16.0"
26
26
 
27
27
  - name: Install Node tools
@@ -23,7 +23,7 @@ jobs:
23
23
  python-version: "3.13"
24
24
 
25
25
  - name: Install build tooling
26
- run: python -m pip install --upgrade pip build twine
26
+ run: python -m pip install --upgrade "pip<26.2" build twine
27
27
  - name: Build package
28
28
  run: |
29
29
  rm -rf dist
@@ -72,7 +72,7 @@ jobs:
72
72
  names = set(archive.namelist())
73
73
  expected = {
74
74
  "voicerender/py.typed",
75
- "voicerender/schemas/render-manifest-v2.schema.json",
75
+ "voicerender/renderplan_render.py",
76
76
  }
77
77
  assert expected <= names
78
78
  PY
@@ -20,7 +20,7 @@ jobs:
20
20
  python-version: ${{ matrix.python-version }}
21
21
  - name: Install package
22
22
  run: |
23
- python -m pip install --upgrade pip
23
+ python -m pip install --upgrade "pip<26.2"
24
24
  python -m pip install -e ".[dev]"
25
25
  python -m compileall -q voicerender tests
26
26
  - name: Run tests
@@ -36,7 +36,7 @@ jobs:
36
36
  python-version: "3.12"
37
37
  - name: Install quality tools
38
38
  run: |
39
- python -m pip install --upgrade pip
39
+ python -m pip install --upgrade "pip<26.2"
40
40
  python -m pip install -e ".[dev]"
41
41
  - name: Run quality checks
42
42
  run: |
@@ -50,7 +50,7 @@ jobs:
50
50
  strategy:
51
51
  fail-fast: false
52
52
  matrix:
53
- extra: [kokoro, piper, pocket, kitten, supertonic, inflect]
53
+ extra: [kokoro, piper, pocket, kitten, sopro, supertonic, inflect]
54
54
  steps:
55
55
  - uses: actions/checkout@v4
56
56
  - name: Set up Python
@@ -59,7 +59,7 @@ jobs:
59
59
  python-version: "3.12"
60
60
  - name: Install engine extra and test tools
61
61
  run: |
62
- python -m pip install --upgrade pip
62
+ python -m pip install --upgrade "pip<26.2"
63
63
  python -m pip install -e ".[${{ matrix.extra }}]" pytest
64
64
  - name: Run API and adapter contracts without model downloads
65
65
  run: python -m pytest -q tests/test_engine_registry.py tests/test_backends.py
@@ -74,12 +74,13 @@ jobs:
74
74
  python-version: "3.12"
75
75
  - name: Install the pinned released engine set
76
76
  run: |
77
- python -m pip install --upgrade pip pytest
77
+ python -m pip install --upgrade "pip<26.2" pytest
78
78
  python -m pip install -e . \
79
- "pykokoro==0.10.2" \
80
- "pipersynth==0.2.1" \
79
+ "pykokoro==0.10.5" \
80
+ "pipersynth==0.2.5" \
81
81
  "pocketsynth[cpu]==0.2.5" \
82
- "kittensynth[cpu]==0.1.1" \
82
+ "kittensynth[cpu]==0.1.4" \
83
+ "soprosynth[cpu]==0.1.1" \
83
84
  "supertonicsynth[cpu]==0.1.2" \
84
85
  "inflectsynth[cpu]==0.1.1"
85
86
  - name: Run released-set compatibility contracts
@@ -95,12 +96,14 @@ jobs:
95
96
  python-version: "3.10"
96
97
  - name: Install lower-bound dependencies
97
98
  run: |
98
- python -m pip install --upgrade pip
99
+ python -m pip install --upgrade "pip<26.2"
99
100
  python -m pip install \
100
101
  "pytest==8.0.0" \
101
102
  "numpy==1.23.0" \
102
103
  "soundfile==0.12.1" \
103
- "tomli==2.0.1"
104
+ "tomli==2.0.1" \
105
+ "renderplan==0.1.2" \
106
+ "voicefolio==0.1.1"
104
107
  python -m pip install --no-deps -e .
105
108
  - name: Run lower-bound tests
106
109
  run: python -m pytest -q
@@ -115,7 +118,7 @@ jobs:
115
118
  python-version: "3.12"
116
119
  - name: Build wheel and sdist
117
120
  run: |
118
- python -m pip install --upgrade pip build twine
121
+ python -m pip install --upgrade "pip<26.2" build twine
119
122
  python -m build --outdir "$RUNNER_TEMP/dist"
120
123
  python -m twine check "$RUNNER_TEMP"/dist/*
121
124
  - name: Verify SCM fallback for an untagged source archive
@@ -159,7 +162,9 @@ jobs:
159
162
  sdist = next(artifacts.glob("voicerender-*.tar.gz"))
160
163
  expected = {
161
164
  "voicerender/py.typed",
162
- "voicerender/schemas/render-manifest-v2.schema.json",
165
+ "voicerender/renderplan_render.py",
166
+ "voicerender/book_contract.py",
167
+ "voicerender/book_layout.py",
163
168
  }
164
169
 
165
170
  with ZipFile(wheel) as archive:
@@ -174,6 +179,15 @@ jobs:
174
179
  for value in metadata.get_all("Requires-Dist", [])
175
180
  }
176
181
  assert {"numpy", "soundfile"} <= requirements
182
+
183
+ renderplan_requirement = next(
184
+ Requirement(value)
185
+ for value in metadata.get_all("Requires-Dist", [])
186
+ if Requirement(value).name.lower() == "renderplan"
187
+ )
188
+ assert {">=0.1.2", "<0.2"} <= {
189
+ str(specifier) for specifier in renderplan_requirement.specifier
190
+ }
177
191
  base_requirements = set()
178
192
  for value in metadata.get_all("Requires-Dist", []):
179
193
  requirement = Requirement(value)
@@ -184,9 +198,11 @@ jobs:
184
198
  base_requirements.add(requirement.name.lower())
185
199
  engine_sdks = {
186
200
  "inflectsynth", "kittensynth", "pykokoro", "pipersynth",
187
- "pocketsynth", "supertonicsynth",
201
+ "pocketsynth", "soprosynth", "supertonicsynth",
202
+ "qwen3synth",
188
203
  }
189
204
  assert not engine_sdks & base_requirements
205
+ assert "utterplan" not in base_requirements
190
206
  assert not {"audiocompose", "readio"} & {name.lower() for name in requirements}
191
207
 
192
208
  with tarfile.open(sdist, "r:gz") as archive:
@@ -208,22 +224,38 @@ jobs:
208
224
  import sys
209
225
 
210
226
  import voicerender
227
+ import voicerender.book
228
+ from renderplan import RenderPlanSet
211
229
  from voicerender import list_engines
212
230
 
213
231
  assert metadata.version("voicerender") == voicerender.__version__
214
232
  assert resources.files("voicerender").joinpath("py.typed").is_file()
215
- assert resources.files("voicerender").joinpath("schemas/render-manifest-v2.schema.json").is_file()
216
- assert len(list_engines()) == 6
233
+ assert resources.files("voicerender").joinpath("renderplan_render.py").is_file()
234
+ assert resources.files("voicerender").joinpath("book_contract.py").is_file()
235
+ assert resources.files("voicerender").joinpath("book_layout.py").is_file()
236
+ assert RenderPlanSet is not None
237
+ assert {item["id"] for item in list_engines()} == {
238
+ "inflect",
239
+ "kitten",
240
+ "kokoro",
241
+ "piper",
242
+ "pocket",
243
+ "qwen3",
244
+ "sopro",
245
+ "supertonic",
246
+ }
217
247
  assert not any(
218
248
  name.split(".", 1)[0] in {
219
249
  "inflectsynth", "kittensynth", "pykokoro", "pipersynth",
220
- "pocketsynth", "supertonicsynth",
250
+ "pocketsynth", "soprosynth", "supertonicsynth", "utterplan",
251
+ "qwen3synth",
221
252
  }
222
253
  for name in sys.modules
223
254
  )
224
255
  PY
225
256
  "$VENV/bin/voicerender" --version
226
257
  "$VENV/bin/voicerender" engines list --json
258
+ "$VENV/bin/python" "$GITHUB_WORKSPACE/tests/wheel_smoke.py"
227
259
  - name: Smoke-test the installed Piper extra
228
260
  working-directory: ${{ runner.temp }}
229
261
  run: |
@@ -241,7 +273,7 @@ jobs:
241
273
  python-version: "3.12"
242
274
  - name: Install documentation dependencies
243
275
  run: |
244
- python -m pip install --upgrade pip
276
+ python -m pip install --upgrade "pip<26.2"
245
277
  python -m pip install -r docs/requirements.txt
246
278
  - name: Build documentation
247
- run: sphinx-build -W --keep-going -D master_doc=utterplan-v5-integration -b html docs docs/_build/html
279
+ run: sphinx-build -W --keep-going -D master_doc=index -b html docs docs/_build/html
@@ -0,0 +1,23 @@
1
+ {"data":{"status":"planned"},"event":"release.created","event_id":"event-0001","record_revisions":{"release:v0.1.0":1},"release_version":"v0.1.0","schema_version":2}
2
+ {"data":{"fields":["changelog_file","git_base_ref","git_base_sha","git_commit_count","git_head_ref","git_head_sha","git_range","title"]},"event":"release.updated","event_id":"event-0002","record_revisions":{"release:v0.1.0":2},"release_version":"v0.1.0","schema_version":2}
3
+ {"data":{"row_count":5},"event":"audit.created","event_id":"event-0003","record_revisions":{"commit_audit_sheet":1},"release_version":"v0.1.0","schema_version":2}
4
+ {"data":{"updated_rows":5},"event":"audit.updated","event_id":"event-0004","record_revisions":{"commit_audit_sheet":2},"release_version":"v0.1.0","schema_version":2}
5
+ {"data":{"entry_ids":["entry-0001","entry-0002","entry-0003","entry-0004","entry-0005"],"synced_audit_rows":5},"event":"entry.batch_added","event_id":"event-0005","record_revisions":{"commit_audit_sheet":3,"entry:v0.1.0/entry-0001":1,"entry:v0.1.0/entry-0002":1,"entry:v0.1.0/entry-0003":1,"entry:v0.1.0/entry-0004":1,"entry:v0.1.0/entry-0005":1,"release:v0.1.0":3},"release_version":"v0.1.0","schema_version":2}
6
+ {"data":{"released_at":"2026-10-10"},"event":"release.finalized","event_id":"event-0006","record_revisions":{"release:v0.1.0":4},"release_version":"v0.1.0","schema_version":2}
7
+ {"data":{"status":"released"},"event":"release.created","event_id":"event-0007","record_revisions":{"release:0.1.1":1},"release_version":"0.1.1","schema_version":2}
8
+ {"data":{"fields":["git_base_ref","git_base_sha","git_commit_count","git_head_ref","git_head_sha","git_range"]},"event":"release.updated","event_id":"event-0008","record_revisions":{"release:0.1.1":2},"release_version":"0.1.1","schema_version":2}
9
+ {"data":{"fields":["git_base_ref","git_base_sha","git_commit_count","git_range"]},"event":"release.updated","event_id":"event-0009","record_revisions":{"release:0.1.1":3},"release_version":"0.1.1","schema_version":2}
10
+ {"data":{"row_count":1},"event":"audit.created","event_id":"event-0010","record_revisions":{"commit_audit_sheet":1},"release_version":"0.1.1","schema_version":2}
11
+ {"data":{"updated_rows":1},"event":"audit.updated","event_id":"event-0011","record_revisions":{"commit_audit_sheet":2},"release_version":"0.1.1","schema_version":2}
12
+ {"data":{"entry_ids":["entry-0001"],"synced_audit_rows":1},"event":"entry.batch_added","event_id":"event-0012","record_revisions":{"commit_audit_sheet":3,"entry:0.1.1/entry-0001":1,"release:0.1.1":4},"release_version":"0.1.1","schema_version":2}
13
+ {"data":{"status":"planned"},"event":"release.created","event_id":"event-0013","record_revisions":{"release:0.2.0":1},"release_version":"0.2.0","schema_version":2}
14
+ {"data":{"fields":["git_base_ref","git_base_sha","git_commit_count","git_head_ref","git_head_sha","git_range"]},"event":"release.updated","event_id":"event-0014","record_revisions":{"release:0.2.0":2},"release_version":"0.2.0","schema_version":2}
15
+ {"data":{"row_count":15},"event":"audit.created","event_id":"event-0015","record_revisions":{"commit_audit_sheet":1},"release_version":"0.2.0","schema_version":2}
16
+ {"data":{"updated_rows":15},"event":"audit.updated","event_id":"event-0016","record_revisions":{"commit_audit_sheet":2},"release_version":"0.2.0","schema_version":2}
17
+ {"data":{"entry_ids":["entry-0001","entry-0002","entry-0003","entry-0004","entry-0005","entry-0006","entry-0007"],"synced_audit_rows":14},"event":"entry.batch_added","event_id":"event-0017","record_revisions":{"commit_audit_sheet":3,"entry:0.2.0/entry-0001":1,"entry:0.2.0/entry-0002":1,"entry:0.2.0/entry-0003":1,"entry:0.2.0/entry-0004":1,"entry:0.2.0/entry-0005":1,"entry:0.2.0/entry-0006":1,"entry:0.2.0/entry-0007":1,"release:0.2.0":3},"release_version":"0.2.0","schema_version":2}
18
+ {"data":{"released_at":"2026-10-16"},"event":"release.finalized","event_id":"event-0018","record_revisions":{"release:0.2.0":4},"release_version":"0.2.0","schema_version":2}
19
+ {"data":{"status":"planned"},"event":"release.created","event_id":"event-0019","record_revisions":{"release:0.2.1":1},"release_version":"0.2.1","schema_version":2}
20
+ {"data":{"fields":["git_base_ref","git_base_sha","git_commit_count","git_head_ref","git_head_sha","git_range"]},"event":"release.updated","event_id":"event-0020","record_revisions":{"release:0.2.1":2},"release_version":"0.2.1","schema_version":2}
21
+ {"data":{"row_count":5},"event":"audit.created","event_id":"event-0021","record_revisions":{"commit_audit_sheet":1},"release_version":"0.2.1","schema_version":2}
22
+ {"data":{"updated_rows":5},"event":"audit.updated","event_id":"event-0022","record_revisions":{"commit_audit_sheet":2},"release_version":"0.2.1","schema_version":2}
23
+ {"data":{"entry_ids":["entry-0001","entry-0002","entry-0003","entry-0004","entry-0005"],"synced_audit_rows":5},"event":"entry.batch_added","event_id":"event-0023","record_revisions":{"commit_audit_sheet":3,"entry:0.2.1/entry-0001":1,"entry:0.2.1/entry-0002":1,"entry:0.2.1/entry-0003":1,"entry:0.2.1/entry-0004":1,"entry:0.2.1/entry-0005":1,"release:0.2.1":3},"release_version":"0.2.1","schema_version":2}
@@ -0,0 +1,36 @@
1
+ schema_version: 1
2
+ object_type: commit_audit_sheet
3
+ versioning:
4
+ schema_version: 1
5
+ revision: 3
6
+ release_version: 0.1.1
7
+ git_base_ref: v0.1.0
8
+ git_base_sha: 46cea5077ac2b81c4c96b1c41ceb4e78c53d960c
9
+ git_head_ref: v0.1.1
10
+ git_head_sha: eaa3bc4964996281a156eda9aebe5a32d5f56201
11
+ git_range: 46cea5077ac2b81c4c96b1c41ceb4e78c53d960c..eaa3bc4964996281a156eda9aebe5a32d5f56201
12
+ commit_count: 1
13
+ rows:
14
+ - sha: eaa3bc4964996281a156eda9aebe5a32d5f56201
15
+ source_ref: git:eaa3bc4964996281a156eda9aebe5a32d5f56201
16
+ short_sha: eaa3bc4
17
+ changed_paths:
18
+ - .github/workflows/python-publish.yml
19
+ stats:
20
+ files_changed: 1
21
+ insertions: 12
22
+ deletions: 29
23
+ inspected: true
24
+ inspected_paths:
25
+ - .github/workflows/python-publish.yml
26
+ observed_behavior:
27
+ The publish workflow now validates VoiceRender artifact metadata
28
+ and package content; no user-facing API or runtime behavior changes.
29
+ public_impact: internal
30
+ decision: internal
31
+ stale: false
32
+ evidence_subject: "chore: ci"
33
+ target_entry_id: entry-0001
34
+ notes:
35
+ Intentional internal-only release-history reconciliation; omit from public
36
+ changelog.
@@ -0,0 +1,29 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release_entry
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 1
7
+ entry_id: entry-0001
8
+ release_version: 0.1.1
9
+ kind: internal
10
+ summary:
11
+ Improved release artifact validation for VoiceRender package metadata and
12
+ contents
13
+ status: accepted
14
+ audience: null
15
+ scopes: []
16
+ source_refs:
17
+ - git:eaa3bc4964996281a156eda9aebe5a32d5f56201
18
+ paths:
19
+ - .github/workflows/python-publish.yml
20
+ issues: []
21
+ prs: []
22
+ sources:
23
+ - git:eaa3bc4964996281a156eda9aebe5a32d5f56201
24
+ contributors:
25
+ - "@holgern"
26
+ breaking: false
27
+ internal: true
28
+ order: 1
29
+ ---
@@ -0,0 +1,27 @@
1
+ ---
2
+ schema_version: 2
3
+ object_type: release
4
+ versioning:
5
+ schema_version: 1
6
+ revision: 4
7
+ version: 0.1.1
8
+ status: released
9
+ history_state: discovered
10
+ title: null
11
+ released_at: "2026-10-10"
12
+ previous_version: v0.1.0
13
+ cancel_reason: null
14
+ superseded_by: null
15
+ changelog_file: null
16
+ boundary_ref: null
17
+ source_refs: []
18
+ source_count: null
19
+ entry_count: 1
20
+ artifact_count: 0
21
+ git_base_ref: v0.1.0
22
+ git_base_sha: 46cea5077ac2b81c4c96b1c41ceb4e78c53d960c
23
+ git_head_ref: v0.1.1
24
+ git_head_sha: eaa3bc4964996281a156eda9aebe5a32d5f56201
25
+ git_range: 46cea5077ac2b81c4c96b1c41ceb4e78c53d960c..eaa3bc4964996281a156eda9aebe5a32d5f56201
26
+ git_commit_count: 1
27
+ ---