deciwaves 0.1.0__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 (230) hide show
  1. deciwaves-0.1.0/LICENSE +21 -0
  2. deciwaves-0.1.0/PKG-INFO +284 -0
  3. deciwaves-0.1.0/README.md +265 -0
  4. deciwaves-0.1.0/pyproject.toml +55 -0
  5. deciwaves-0.1.0/setup.cfg +4 -0
  6. deciwaves-0.1.0/src/deciwaves/__init__.py +1 -0
  7. deciwaves-0.1.0/src/deciwaves/_vendor/__init__.py +0 -0
  8. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/LICENSE +19 -0
  9. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/__init__.py +1 -0
  10. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/_utils.py +27 -0
  11. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/enums/DecimaVersion.py +7 -0
  12. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/enums/EAudioLanguages.py +16 -0
  13. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/enums/EPixelFormat.py +81 -0
  14. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/enums/ESentenceGroupType.py +7 -0
  15. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/enums/ETextLanguages.py +25 -0
  16. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/enums/ETextureSetType.py +19 -0
  17. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/enums/EWaveDataEncoding.py +11 -0
  18. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/enums/EWaveDataEncodingQuality.py +10 -0
  19. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/enums/__init__.py +8 -0
  20. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/reader.py +91 -0
  21. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/AmmoResource.py +18 -0
  22. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/CharacterDescriptionComponentResource.py +23 -0
  23. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/CollisionTrigger.py +17 -0
  24. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/CreditsColumn.py +21 -0
  25. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/CreditsRow.py +20 -0
  26. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/DamageAreaResource.py +18 -0
  27. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/DataSourceCreditsResource.py +18 -0
  28. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/EntityProjectileAmmoResource.py +23 -0
  29. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/EntityResource.py +33 -0
  30. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/ExplosionResource.py +17 -0
  31. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/FacialAnimationComponentResource.py +28 -0
  32. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/FactCollisionTrigger.py +18 -0
  33. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/FocusScannedInfo.py +27 -0
  34. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/FocusTargetComponentResource.py +29 -0
  35. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/HumanoidBodyVariant.py +32 -0
  36. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/HumanoidBodyVariantGroup.py +19 -0
  37. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/InventoryActionAbilityResource.py +15 -0
  38. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/InventoryAmmoEjectorResource.py +17 -0
  39. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/InventoryEntityResource.py +26 -0
  40. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/InventoryItemComponentResource.py +32 -0
  41. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/InventoryLootPackageComponentResource.py +22 -0
  42. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/LocalizedAnimationResource.py +13 -0
  43. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/LocalizedSimpleSoundResource.py +99 -0
  44. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/LocalizedTextResource.py +74 -0
  45. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/LootData.py +22 -0
  46. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/LootItem.py +22 -0
  47. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/LootSlot.py +19 -0
  48. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/MusicResource.py +84 -0
  49. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/ObjectCollection.py +12 -0
  50. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/OutOfBoundsNavMeshArea.py +14 -0
  51. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/PhysicsCollisionResource.py +15 -0
  52. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/PrefetchList.py +18 -0
  53. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/Resource.py +25 -0
  54. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/SentenceGroupResource.py +33 -0
  55. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/SentenceResource.py +32 -0
  56. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/SkeletonAnimationResource.py +9 -0
  57. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/SpawnSetup.py +36 -0
  58. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/SpawnSetupGroup.py +26 -0
  59. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/Texture.py +20 -0
  60. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/TextureSet.py +56 -0
  61. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/ThrowableResource.py +15 -0
  62. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/UITexture.py +26 -0
  63. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/UnknownResource.py +15 -0
  64. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/VoiceComponentResource.py +19 -0
  65. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/VoiceResource.py +19 -0
  66. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/VoiceSignalsResource.py +20 -0
  67. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/WaveResource.py +37 -0
  68. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/__init__.py +47 -0
  69. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/structs/HashedString.py +7 -0
  70. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/structs/ImageStruct.py +54 -0
  71. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/structs/Ref.py +44 -0
  72. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/structs/__init__.py +0 -0
  73. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/type_maps/__init__.py +2 -0
  74. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/type_maps/dspc_type_map.py +6 -0
  75. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/type_maps/pc_type_map.py +5052 -0
  76. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/type_maps/ps4_type_map.py +1604 -0
  77. deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/type_maps/type_map.py +15 -0
  78. deciwaves-0.1.0/src/deciwaves/cli/__init__.py +1 -0
  79. deciwaves-0.1.0/src/deciwaves/cli/config.py +217 -0
  80. deciwaves-0.1.0/src/deciwaves/cli/doctor.py +255 -0
  81. deciwaves-0.1.0/src/deciwaves/cli/guided.py +165 -0
  82. deciwaves-0.1.0/src/deciwaves/cli/main.py +209 -0
  83. deciwaves-0.1.0/src/deciwaves/cli/run.py +463 -0
  84. deciwaves-0.1.0/src/deciwaves/cli/setup.py +317 -0
  85. deciwaves-0.1.0/src/deciwaves/data/README.md +66 -0
  86. deciwaves-0.1.0/src/deciwaves/data/__init__.py +10 -0
  87. deciwaves-0.1.0/src/deciwaves/data/ds/cutscene-keepspans.csv +165 -0
  88. deciwaves-0.1.0/src/deciwaves/data/ds/cutscene_tracks.csv +171 -0
  89. deciwaves-0.1.0/src/deciwaves/data/ds/data-file-list.txt +378 -0
  90. deciwaves-0.1.0/src/deciwaves/data/fw/burning_shores_names.md +15 -0
  91. deciwaves-0.1.0/src/deciwaves/data/fw/character_names.md +148 -0
  92. deciwaves-0.1.0/src/deciwaves/engine/__init__.py +0 -0
  93. deciwaves-0.1.0/src/deciwaves/engine/asr.py +71 -0
  94. deciwaves-0.1.0/src/deciwaves/engine/atomic_io.py +117 -0
  95. deciwaves-0.1.0/src/deciwaves/engine/audio_clip.py +222 -0
  96. deciwaves-0.1.0/src/deciwaves/engine/catalog_io.py +180 -0
  97. deciwaves-0.1.0/src/deciwaves/engine/pack/__init__.py +5 -0
  98. deciwaves-0.1.0/src/deciwaves/engine/pack/base.py +57 -0
  99. deciwaves-0.1.0/src/deciwaves/engine/pack/bin_archive.py +241 -0
  100. deciwaves-0.1.0/src/deciwaves/engine/pack/bin_index.py +42 -0
  101. deciwaves-0.1.0/src/deciwaves/engine/pack/dsar_archive.py +127 -0
  102. deciwaves-0.1.0/src/deciwaves/engine/pack/fw_fast_extract.py +112 -0
  103. deciwaves-0.1.0/src/deciwaves/engine/pack/fw_object_reader.py +359 -0
  104. deciwaves-0.1.0/src/deciwaves/engine/pack/fw_rtti.py +123 -0
  105. deciwaves-0.1.0/src/deciwaves/engine/pack/fw_stream.py +83 -0
  106. deciwaves-0.1.0/src/deciwaves/engine/pack/fw_streaming_graph.py +355 -0
  107. deciwaves-0.1.0/src/deciwaves/engine/pack/hzd_locators.py +111 -0
  108. deciwaves-0.1.0/src/deciwaves/engine/pack/hzd_package.py +73 -0
  109. deciwaves-0.1.0/src/deciwaves/engine/parallel.py +140 -0
  110. deciwaves-0.1.0/src/deciwaves/engine/profile.py +54 -0
  111. deciwaves-0.1.0/src/deciwaves/engine/render.py +452 -0
  112. deciwaves-0.1.0/src/deciwaves/engine/selection.py +60 -0
  113. deciwaves-0.1.0/src/deciwaves/engine/sentence_core.py +71 -0
  114. deciwaves-0.1.0/src/deciwaves/engine/speakers.py +193 -0
  115. deciwaves-0.1.0/src/deciwaves/engine/speech_trim.py +45 -0
  116. deciwaves-0.1.0/src/deciwaves/engine/text_lang.py +47 -0
  117. deciwaves-0.1.0/src/deciwaves/engine/text_normalize.py +19 -0
  118. deciwaves-0.1.0/src/deciwaves/engine/tool_paths.py +74 -0
  119. deciwaves-0.1.0/src/deciwaves/engine/transcript_anchor.py +46 -0
  120. deciwaves-0.1.0/src/deciwaves/games/__init__.py +0 -0
  121. deciwaves-0.1.0/src/deciwaves/games/ds/__init__.py +0 -0
  122. deciwaves-0.1.0/src/deciwaves/games/ds/catalog.py +146 -0
  123. deciwaves-0.1.0/src/deciwaves/games/ds/cutscene_audio.py +207 -0
  124. deciwaves-0.1.0/src/deciwaves/games/ds/cutscene_trim.py +121 -0
  125. deciwaves-0.1.0/src/deciwaves/games/ds/episode_map.py +121 -0
  126. deciwaves-0.1.0/src/deciwaves/games/ds/profile.py +52 -0
  127. deciwaves-0.1.0/src/deciwaves/games/ds/story_order.py +277 -0
  128. deciwaves-0.1.0/src/deciwaves/games/fw/__init__.py +1 -0
  129. deciwaves-0.1.0/src/deciwaves/games/fw/asr_run.py +140 -0
  130. deciwaves-0.1.0/src/deciwaves/games/fw/assemble.py +62 -0
  131. deciwaves-0.1.0/src/deciwaves/games/fw/dlc.py +92 -0
  132. deciwaves-0.1.0/src/deciwaves/games/fw/extract.py +236 -0
  133. deciwaves-0.1.0/src/deciwaves/games/fw/gamescript.py +78 -0
  134. deciwaves-0.1.0/src/deciwaves/games/fw/manifest.py +11 -0
  135. deciwaves-0.1.0/src/deciwaves/games/fw/render.py +172 -0
  136. deciwaves-0.1.0/src/deciwaves/games/fw/story_full.py +138 -0
  137. deciwaves-0.1.0/src/deciwaves/games/fw/subtitle_bind.py +256 -0
  138. deciwaves-0.1.0/src/deciwaves/games/fw/subtitle_match.py +172 -0
  139. deciwaves-0.1.0/src/deciwaves/games/fw/weave.py +151 -0
  140. deciwaves-0.1.0/src/deciwaves/games/hzd/__init__.py +0 -0
  141. deciwaves-0.1.0/src/deciwaves/games/hzd/asr_bind.py +284 -0
  142. deciwaves-0.1.0/src/deciwaves/games/hzd/atrac9.py +54 -0
  143. deciwaves-0.1.0/src/deciwaves/games/hzd/binding.py +38 -0
  144. deciwaves-0.1.0/src/deciwaves/games/hzd/catalog.py +244 -0
  145. deciwaves-0.1.0/src/deciwaves/games/hzd/clip_index.py +89 -0
  146. deciwaves-0.1.0/src/deciwaves/games/hzd/episode_map.py +106 -0
  147. deciwaves-0.1.0/src/deciwaves/games/hzd/inventory.py +56 -0
  148. deciwaves-0.1.0/src/deciwaves/games/hzd/match.py +82 -0
  149. deciwaves-0.1.0/src/deciwaves/games/hzd/profile.py +133 -0
  150. deciwaves-0.1.0/src/deciwaves/games/hzd/render.py +251 -0
  151. deciwaves-0.1.0/src/deciwaves/games/hzd/sentence_fw.py +319 -0
  152. deciwaves-0.1.0/src/deciwaves/games/hzd/wem_metadata.py +177 -0
  153. deciwaves-0.1.0/src/deciwaves.egg-info/PKG-INFO +284 -0
  154. deciwaves-0.1.0/src/deciwaves.egg-info/SOURCES.txt +228 -0
  155. deciwaves-0.1.0/src/deciwaves.egg-info/dependency_links.txt +1 -0
  156. deciwaves-0.1.0/src/deciwaves.egg-info/entry_points.txt +2 -0
  157. deciwaves-0.1.0/src/deciwaves.egg-info/requires.txt +9 -0
  158. deciwaves-0.1.0/src/deciwaves.egg-info/top_level.txt +1 -0
  159. deciwaves-0.1.0/tests/test_asr.py +97 -0
  160. deciwaves-0.1.0/tests/test_atomic_io.py +176 -0
  161. deciwaves-0.1.0/tests/test_atrac9.py +54 -0
  162. deciwaves-0.1.0/tests/test_audio_clip.py +333 -0
  163. deciwaves-0.1.0/tests/test_bin_archive_find_chunk.py +82 -0
  164. deciwaves-0.1.0/tests/test_binding.py +41 -0
  165. deciwaves-0.1.0/tests/test_build_catalog.py +421 -0
  166. deciwaves-0.1.0/tests/test_cli_config.py +377 -0
  167. deciwaves-0.1.0/tests/test_cli_doctor.py +394 -0
  168. deciwaves-0.1.0/tests/test_cli_guided.py +419 -0
  169. deciwaves-0.1.0/tests/test_cli_main.py +283 -0
  170. deciwaves-0.1.0/tests/test_cli_run.py +981 -0
  171. deciwaves-0.1.0/tests/test_cli_setup.py +613 -0
  172. deciwaves-0.1.0/tests/test_clip_index.py +20 -0
  173. deciwaves-0.1.0/tests/test_cutscene_audio.py +215 -0
  174. deciwaves-0.1.0/tests/test_cutscene_trim.py +47 -0
  175. deciwaves-0.1.0/tests/test_data_pkg.py +45 -0
  176. deciwaves-0.1.0/tests/test_dsar_archive.py +97 -0
  177. deciwaves-0.1.0/tests/test_dsar_archive_lru.py +115 -0
  178. deciwaves-0.1.0/tests/test_dspc_layout.py +92 -0
  179. deciwaves-0.1.0/tests/test_episode_map.py +82 -0
  180. deciwaves-0.1.0/tests/test_fixtures_bin_archive.py +352 -0
  181. deciwaves-0.1.0/tests/test_fixtures_fw_streaming_graph.py +168 -0
  182. deciwaves-0.1.0/tests/test_fixtures_sentence_core.py +184 -0
  183. deciwaves-0.1.0/tests/test_fixtures_sentence_fw.py +214 -0
  184. deciwaves-0.1.0/tests/test_fw_asr_run.py +158 -0
  185. deciwaves-0.1.0/tests/test_fw_assemble.py +32 -0
  186. deciwaves-0.1.0/tests/test_fw_audio_binding.py +95 -0
  187. deciwaves-0.1.0/tests/test_fw_dlc.py +43 -0
  188. deciwaves-0.1.0/tests/test_fw_extract.py +388 -0
  189. deciwaves-0.1.0/tests/test_fw_fast_extract.py +133 -0
  190. deciwaves-0.1.0/tests/test_fw_gamescript.py +97 -0
  191. deciwaves-0.1.0/tests/test_fw_manifest.py +9 -0
  192. deciwaves-0.1.0/tests/test_fw_object_reader.py +290 -0
  193. deciwaves-0.1.0/tests/test_fw_render.py +70 -0
  194. deciwaves-0.1.0/tests/test_fw_rtti.py +66 -0
  195. deciwaves-0.1.0/tests/test_fw_story_full.py +114 -0
  196. deciwaves-0.1.0/tests/test_fw_stream.py +33 -0
  197. deciwaves-0.1.0/tests/test_fw_streaming_graph.py +44 -0
  198. deciwaves-0.1.0/tests/test_fw_subtitle_bind.py +184 -0
  199. deciwaves-0.1.0/tests/test_fw_subtitle_manifest_defaults.py +46 -0
  200. deciwaves-0.1.0/tests/test_fw_subtitle_match.py +112 -0
  201. deciwaves-0.1.0/tests/test_fw_weave.py +72 -0
  202. deciwaves-0.1.0/tests/test_hzd_asr_bind.py +617 -0
  203. deciwaves-0.1.0/tests/test_hzd_catalog.py +584 -0
  204. deciwaves-0.1.0/tests/test_hzd_clip_index.py +119 -0
  205. deciwaves-0.1.0/tests/test_hzd_extract_ids.py +61 -0
  206. deciwaves-0.1.0/tests/test_hzd_inventory.py +103 -0
  207. deciwaves-0.1.0/tests/test_hzd_locators.py +141 -0
  208. deciwaves-0.1.0/tests/test_hzd_memscan.py +149 -0
  209. deciwaves-0.1.0/tests/test_hzd_package.py +156 -0
  210. deciwaves-0.1.0/tests/test_hzd_phys_to_key.py +31 -0
  211. deciwaves-0.1.0/tests/test_hzd_render.py +229 -0
  212. deciwaves-0.1.0/tests/test_hzd_wem_metadata.py +384 -0
  213. deciwaves-0.1.0/tests/test_match.py +130 -0
  214. deciwaves-0.1.0/tests/test_pack_base.py +172 -0
  215. deciwaves-0.1.0/tests/test_pack_index.py +81 -0
  216. deciwaves-0.1.0/tests/test_parallel.py +174 -0
  217. deciwaves-0.1.0/tests/test_profile.py +86 -0
  218. deciwaves-0.1.0/tests/test_render_story.py +685 -0
  219. deciwaves-0.1.0/tests/test_selection.py +182 -0
  220. deciwaves-0.1.0/tests/test_sentence_core.py +157 -0
  221. deciwaves-0.1.0/tests/test_sentence_fw.py +51 -0
  222. deciwaves-0.1.0/tests/test_sentence_media.py +182 -0
  223. deciwaves-0.1.0/tests/test_sound_resource.py +33 -0
  224. deciwaves-0.1.0/tests/test_speakers.py +507 -0
  225. deciwaves-0.1.0/tests/test_speech_trim.py +48 -0
  226. deciwaves-0.1.0/tests/test_story_order.py +260 -0
  227. deciwaves-0.1.0/tests/test_text_lang.py +60 -0
  228. deciwaves-0.1.0/tests/test_text_normalize.py +10 -0
  229. deciwaves-0.1.0/tests/test_tool_paths.py +77 -0
  230. deciwaves-0.1.0/tests/test_transcript_anchor.py +40 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 prekabreki
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,284 @@
1
+ Metadata-Version: 2.4
2
+ Name: deciwaves
3
+ Version: 0.1.0
4
+ Summary: Extract speaker- and subtitle-tagged voice audio from Decima-engine games into story-ordered MP3 reels
5
+ Author-email: prekabreki <prekabreki@users.noreply.github.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/prekabreki/DeciWaves
8
+ Requires-Python: >=3.12
9
+ Description-Content-Type: text/markdown
10
+ License-File: LICENSE
11
+ Requires-Dist: lz4>=4.0
12
+ Requires-Dist: numpy>=1.24
13
+ Requires-Dist: rapidfuzz>=3.0
14
+ Provides-Extra: test
15
+ Requires-Dist: pytest; extra == "test"
16
+ Provides-Extra: asr
17
+ Requires-Dist: whisperx<4,>=3.1; extra == "asr"
18
+ Dynamic: license-file
19
+
20
+ # DeciWaves
21
+
22
+ Turn the voice acting in a Decima-engine game you own into an audiobook of its own story.
23
+
24
+ You bought Death Stranding, Horizon Zero Dawn, or Horizon Forbidden West. Somewhere in
25
+ that install are thousands of recorded lines: main-story cutscenes, side conversations,
26
+ codec calls, ambient barks. They are locked inside the game's proprietary archives and
27
+ playable only in the order the game decides. DeciWaves reads your install, read-only, and
28
+ pulls those lines out with the speaker and the on-screen subtitle attached wherever it can
29
+ derive them.
30
+
31
+ It then puts the lines back in story order and encodes them into MP3 reels you can drop on a
32
+ phone and listen to like an audiobook. Nothing is fetched from the game's servers and nothing
33
+ in your install is modified. DeciWaves ships code only, and every second of audio it produces
34
+ comes off your own disk.
35
+
36
+ > **Requirements up front:** Windows 10/11 - Python 3.12+ - a legally owned PC install of the
37
+ > game you're extracting - about 10 GB free disk - (HZD and FW only) an NVIDIA GPU for the
38
+ > transcription stages. Death Stranding needs no GPU.
39
+
40
+ **Not affiliated with Guerrilla Games, Kojima Productions, or Sony Interactive
41
+ Entertainment.** DeciWaves ships code only - no game files, no dialogue text. It never
42
+ modifies your install (read-only), and its output is for your personal use.
43
+
44
+ ## Supported games
45
+
46
+ | Game | Edition | GPU needed | What you get |
47
+ |------|---------|------------|--------------|
48
+ | Death Stranding | Director's Cut (PC) | No | Lines identified straight from the Decima resource tree, with speaker and subtitle. Cutscene audio is whole-scene, not per-line. Story order is solid by default and sharper with an optional bring-your-own transcript. |
49
+ | Horizon Zero Dawn | Remastered (PC) | Yes | Audio is tied to lines by content fingerprint; ambiguous fingerprint collisions are confirmed with on-device transcription, capped by default at 300 buckets rather than a full-library pass (`--sample-cap 0` for uncapped). Reels come out in episode order. |
50
+ | Horizon Forbidden West | Complete Edition (PC) | Yes | Clips carry their exact in-game subtitle. Speaker labels and true story order need two bring-your-own inputs (a `types.json` and a gamescript); without them you still get subtitle-labeled reels. See [docs/BYO.md](docs/BYO.md). |
51
+
52
+ ## Install
53
+
54
+ pip install deciwaves
55
+
56
+ HZD and FW also need the GPU transcription extra (WhisperX). Install it together with a
57
+ PyTorch build that matches your CUDA version (see https://pytorch.org/get-started/locally/):
58
+
59
+ pip install deciwaves[asr]
60
+
61
+ Or install from a clone -- for development, or to run the latest unreleased code:
62
+
63
+ git clone https://github.com/prekabreki/DeciWaves
64
+ cd DeciWaves
65
+ pip install .
66
+
67
+ Then fetch the decode tools, point DeciWaves at your game, and check the result:
68
+
69
+ deciwaves setup --ds-install "C:\...\DEATH STRANDING DIRECTORS CUT"
70
+ deciwaves doctor
71
+
72
+ `setup` downloads vgmstream-cli, VGAudioCli, and ffmpeg into `%LOCALAPPDATA%\DeciWaves\tools`
73
+ (skipping any tool already present there -- pass `--force` to refetch anyway), finds the
74
+ Oodle DLL next to a DS install, and writes `config.json`. Pass `--hzd-package` or
75
+ `--fw-package` for those games instead, and (optionally) `--fw-gamescript` to persist your own
76
+ FW gamescript transcript so `fw run` and guided mode don't need `--gamescript` passed by hand
77
+ every time. It exits nonzero if any tool failed to download. `doctor` prints a preflight report
78
+ and returns success as long as every required tool is present; a game you don't own shows
79
+ `[--] not configured` and never fails the check.
80
+
81
+ ## Quick start - pick your game
82
+
83
+ The fastest path is guided mode. Run `deciwaves` with no arguments:
84
+
85
+ deciwaves
86
+
87
+ It detects which games you have configured, asks which one to extract, confirms a workspace
88
+ directory (and, for FW, optionally asks for your gamescript path if one isn't already
89
+ configured - see below - so guided mode can reach match/full-reel/render too, not just
90
+ subtitle-bind), and runs that game's full pipeline. This is the same pipeline the explicit commands
91
+ run; it only adds the menu around it. In a non-interactive shell it prints usage and exits
92
+ instead of blocking.
93
+
94
+ If you'd rather drive it yourself, each game has an explicit `run` command. The global
95
+ `--workspace` flag sets where output lands (default: the current directory) -- it must come
96
+ *before* the game name (`deciwaves --workspace DIR ds run`, not `deciwaves ds --workspace DIR
97
+ run`, which is parsed as that stage's own argument instead). A relative path you pass to a
98
+ stage's own flag (e.g. `--gamescript`) that already exists is resolved against the directory
99
+ you ran `deciwaves` from, not against `--workspace` -- it doesn't need to sit inside the
100
+ workspace. A relative path that doesn't exist yet (e.g. a stage's own output path) is left
101
+ alone and stays workspace-relative, same as always. A path saved earlier via `deciwaves setup`
102
+ is always absolute regardless.
103
+
104
+ ### Death Stranding (no GPU)
105
+
106
+ deciwaves --workspace D:\deciwaves ds run
107
+
108
+ This chains catalog -> order -> render. The catalog stage parses your install into
109
+ `out/catalog.csv` (roughly 27,000 rows, one per voice line); order builds `out/playlist.csv`;
110
+ render encodes the MP3 reels and their tracklists into `out/audio`. The catalog parse and the
111
+ render are the slow parts, each in the range of tens of minutes on a mid-range machine and
112
+ longer on a slow disk. No GPU is involved anywhere in the default DS chain.
113
+
114
+ ### Horizon Zero Dawn Remastered
115
+
116
+ pip install deciwaves[asr]
117
+ deciwaves --workspace D:\deciwaves hzd run
118
+
119
+ HZD chains catalog -> clip-index -> wem-metadata -> bind -> render. Structural binding
120
+ (content fingerprinting) resolves the vast majority of rows before any ASR runs at all; the
121
+ bind stage needs the `[asr]` extra and a CUDA GPU only to run WhisperX over what's left --
122
+ ambiguous fingerprint collisions. By default that ASR pass is capped at 300 ambiguous buckets
123
+ rather than running for hours over the full library; pass `--sample-cap 0` to `hzd run` (or
124
+ `hzd bind`) for an uncapped full pass instead, or any other number for a custom cap. On one
125
+ real install the capped default still bound 54,564 of 54,566 rows (99.996%), because
126
+ structural binding had already covered almost everything -- the cap costs little in practice,
127
+ and whenever it does leave buckets untranscribed, bind's own output states exactly how many.
128
+ Note: if `bind` already completed in a workspace, changing `--sample-cap` on a later `hzd run`
129
+ has no effect until you delete `out/hzd/.done-bind` and re-run it -- the done-marker doesn't
130
+ know its own flags changed. bind also checkpoints as it goes (see Resume, below), so an
131
+ interrupted bind picks up where it stopped.
132
+
133
+ ### Horizon Forbidden West
134
+
135
+ deciwaves --workspace D:\deciwaves fw run
136
+
137
+ FW chains extract -> asr -> subtitle-bind, which gets you clips labeled with their exact
138
+ in-game subtitle. The asr stage needs the `[asr]` extra and a GPU. subtitle-bind requires a
139
+ `types.json` (a Decima type map for FW) in the workspace root. Speaker labels and real story
140
+ order additionally need your own copy of the FW gamescript, passed with `--gamescript` (or set
141
+ once with `deciwaves setup --fw-gamescript <path>`, so you never have to pass the flag again).
142
+ Both are bring-your-own inputs that this repo does not and will not ship - see
143
+ [docs/BYO.md](docs/BYO.md). Without a gamescript, `fw run` stops cleanly after subtitle-bind
144
+ and tells you what it's waiting for.
145
+
146
+ ## How it works
147
+
148
+ DeciWaves reads the Decima archives in your install and never writes to them. Each game needs
149
+ its own way of tying an audio clip to the line it voices: DS parses the Decima resource tree
150
+ with a bundled, patched pydecima; HZD fingerprints each clip and confirms the match with
151
+ on-device transcription; FW replays its streaming-graph index and reads the exact subtitle out
152
+ of each dialogue group. The encoded payload is Wwise `.wem` (DS) or ATRAC9 (HZD and FW),
153
+ decoded to WAV by vgmstream-cli or VGAudioCli. A per-game story-order pass arranges the lines,
154
+ and ffmpeg encodes them into MP3 reels capped near 290 MB, each with a plain-text tracklist.
155
+ For the full design - package layout, the per-game solutions, the pipeline seam - see
156
+ [docs/architecture.md](docs/architecture.md).
157
+
158
+ ## Stage-by-stage usage
159
+
160
+ `deciwaves <game> run` is the whole pipeline. You can also run any single stage as
161
+ `deciwaves <game> <stage> [flags]`, and `deciwaves <game> <stage> --help` prints that stage's
162
+ own flags. `[GPU]` marks stages that need the `[asr]` extra and a CUDA GPU.
163
+
164
+ The decode-heavy stages (`ds render`, `hzd clip-index`, `hzd render`, `fw extract`) decode
165
+ clips concurrently and take a `--jobs N` flag (default `min(8, cpu_count)`); this is the
166
+ single biggest speed-up on a multi-core machine. `--jobs 1` forces the old one-at-a-time
167
+ decode. `deciwaves <game> run` uses the default automatically.
168
+
169
+ ### Death Stranding (`deciwaves ds ...`)
170
+
171
+ | Stage | What it does | Key flags |
172
+ |-------|--------------|-----------|
173
+ | catalog | Build the line catalog from your install | `--data-dir`, `--oodle` |
174
+ | order | Build the story-ordered playlist | `--transcript` (BYO, see [docs/BYO.md](docs/BYO.md)) |
175
+ | render | Render MP3 reels + tracklists | `--main-story`, `--speech-trim`, `--bitrate`, `--jobs` |
176
+ | cutscenes | Resolve cutscene voice tracks | standalone; `run` uses a bundled track list |
177
+ | trim | [GPU] Rebuild the speech-trim manifest | standalone |
178
+
179
+ `ds run` chains catalog -> order -> render. cutscenes and trim are not in that chain: `run`
180
+ ships pre-resolved data for them and leaves them available to regenerate against your own
181
+ install by hand.
182
+
183
+ ### Horizon Zero Dawn (`deciwaves hzd ...`)
184
+
185
+ | Stage | What it does | Key flags |
186
+ |-------|--------------|-----------|
187
+ | catalog | Build the line catalog | `--package` |
188
+ | clip-index | Fingerprint audio clips | `--package`, `--jobs` |
189
+ | wem-metadata | Extract wem metadata + coverage | `--package` |
190
+ | bind | [GPU] Bind clips to lines | `--package`, `--transcripts`, `--transcripts-out`, `--sample-cap` (default 300, 0 = unlimited) |
191
+ | render | Render MP3 reels + tracklists | `--out-dir`, `--jobs` |
192
+
193
+ ### Horizon Forbidden West (`deciwaves fw ...`)
194
+
195
+ | Stage | What it does | Key flags |
196
+ |-------|--------------|-----------|
197
+ | extract | Extract dialogue clips to WAV | `--package`, `--jobs` |
198
+ | asr | [GPU] Transcribe clips | `--roster`, `--model`, `--limit` |
199
+ | subtitle-bind | Label clips with exact subtitles | `--package-dir`, `--types-json` (BYO) |
200
+ | match | Speaker + story order (needs BYO gamescript) | `--gamescript` (BYO) |
201
+ | full-reel | Assemble the full-reel manifest | |
202
+ | weave | Woven story manifest | |
203
+ | dlc | Burning Shores manifest | |
204
+ | assemble | Concatenate manifests | |
205
+ | render | Render MP3 reels + tracklists | `--manifest`, `--tiers` |
206
+
207
+ `fw run` chains extract -> asr -> subtitle-bind, then continues match -> full-reel -> render
208
+ once a `--gamescript` is supplied (explicitly, or via a `--fw-gamescript` configured earlier
209
+ with `deciwaves setup`).
210
+
211
+ ## Configuration
212
+
213
+ `deciwaves setup` writes `config.json` to `%LOCALAPPDATA%\DeciWaves\config.json`. It records
214
+ the tools directory, the install path for each game you configured (`ds_install`,
215
+ `hzd_package`, `fw_package`, `oodle_dll`), and your optional FW gamescript path
216
+ (`fw_gamescript`, set with `--fw-gamescript`). Set `DECIWAVES_CONFIG_DIR` to keep that file
217
+ somewhere else.
218
+
219
+ Each run merges its flags over what's already saved -- an omitted flag keeps its previous
220
+ value, so running `deciwaves setup --hzd-package ...` later doesn't blank out a `--ds-install`
221
+ configured earlier. Pass a flag again (with a new path) to update it. To *clear* a saved path
222
+ (e.g. a stale `ds_install` or `fw_gamescript` that now points nowhere and makes `doctor` fail),
223
+ pass it as an explicit empty string: `deciwaves setup --ds-install ""` unsets it (omitting the
224
+ flag keeps it; only an explicit `""` clears).
225
+
226
+ Environment overrides, all optional:
227
+
228
+ - `DECIWAVES_CONFIG_DIR` - directory that holds `config.json` (default `%LOCALAPPDATA%\DeciWaves`).
229
+ - `DECIWAVES_VGMSTREAM` - full path to `vgmstream-cli.exe`, overriding the configured tools dir and PATH.
230
+ - `DECIWAVES_VGAUDIO` - full path to `VGAudioCli.exe`, same idea.
231
+
232
+ Workspace layout. `--workspace` (default: the current directory) is the root everything is
233
+ written under, all inside `out/`. DS writes `out/catalog.csv`, `out/playlist.csv`, and reels
234
+ in `out/audio`; HZD and FW write under `out/hzd/` and `out/fw/`.
235
+
236
+ Resume. `deciwaves <game> run` writes a marker file at `out/<game>/.done-<stage>` after each
237
+ stage finishes cleanly, and skips any stage whose marker already exists. To force a stage to
238
+ re-run, delete its marker and run again; the stages before it stay skipped, but re-running
239
+ that stage also deletes every LATER stage's marker in the chain, so downstream stages re-run
240
+ too instead of resuming from what's now stale data. A stage's output existing is deliberately
241
+ not treated as done - only its marker is - so a crash mid-stage never looks finished. The HZD
242
+ bind stage also checkpoints within itself: its `--transcripts-out` sidecar lets a restarted
243
+ bind reuse the clips it already transcribed. A marker also doesn't know if the flags used to
244
+ produce it have since changed - re-running `hzd run` with a different `--sample-cap` after
245
+ `bind` already has a marker is a no-op until you delete `out/hzd/.done-bind` yourself.
246
+
247
+ Bring-your-own inputs. The optional DS transcript, the required FW `types.json`, and the
248
+ optional FW gamescript are all documented in [docs/BYO.md](docs/BYO.md), including the exact
249
+ format each parser expects.
250
+
251
+ ## Troubleshooting
252
+
253
+ Run `deciwaves doctor` first. It reports each decode tool, the Oodle DLL, every configured
254
+ install, the ASR extra, and CUDA, and names the fix for anything missing.
255
+
256
+ Common failures:
257
+
258
+ - **Tool not found.** `doctor` shows a tool as `[--] not found`. Re-run `deciwaves setup` to
259
+ fetch it, put the executable on PATH, or point `DECIWAVES_VGMSTREAM` / `DECIWAVES_VGAUDIO`
260
+ at it.
261
+ - **Wrong install directory.** A game shows an error like "has no data/ dir" or "no
262
+ streaming_graph.core". Re-run `deciwaves setup --ds-install` / `--hzd-package` /
263
+ `--fw-package` with the correct path; the doctor message names the exact file it expects to
264
+ find.
265
+ - **No CUDA.** The `[asr]` extra is installed but `doctor` reports no GPU visible, so the GPU
266
+ stages (`hzd bind`, `fw asr`) won't run. Install a PyTorch build matching your CUDA version
267
+ (https://pytorch.org/get-started/locally/). DS needs none of this.
268
+ - **Windows Store Python.** The Microsoft Store build of Python virtualizes writes under
269
+ `%LOCALAPPDATA%`, which can hide or misplace DeciWaves' `config.json` and tools. Install
270
+ Python from python.org instead, or set `DECIWAVES_CONFIG_DIR` to a plain directory you
271
+ control.
272
+ - **Windows Store Python, second-order variant.** Even when `config.json` resolves fine, a
273
+ tools directory fetched under `%LOCALAPPDATA%` by `deciwaves setup` still lands inside that
274
+ same virtualized shadow. The parent Python resolves the tool there without trouble, but the
275
+ spawned `vgmstream-cli`/`ffmpeg` child process can't find its own side-by-side DLLs at the
276
+ real path and dies with an exit code like `0xC0000135` (STATUS_DLL_NOT_FOUND) -- every clip
277
+ fails and `render` reports zero decoded clips. The mitigation is the same, and matters more
278
+ here: use a python.org Python, or pass a plain directory outside `%LOCALAPPDATA%` to both
279
+ `DECIWAVES_CONFIG_DIR` and `deciwaves setup --tools-dir`.
280
+
281
+ ## License
282
+
283
+ MIT (see [LICENSE](LICENSE)). The bundled pydecima is also MIT (see
284
+ [src/deciwaves/_vendor/pydecima/LICENSE](src/deciwaves/_vendor/pydecima/LICENSE)).
@@ -0,0 +1,265 @@
1
+ # DeciWaves
2
+
3
+ Turn the voice acting in a Decima-engine game you own into an audiobook of its own story.
4
+
5
+ You bought Death Stranding, Horizon Zero Dawn, or Horizon Forbidden West. Somewhere in
6
+ that install are thousands of recorded lines: main-story cutscenes, side conversations,
7
+ codec calls, ambient barks. They are locked inside the game's proprietary archives and
8
+ playable only in the order the game decides. DeciWaves reads your install, read-only, and
9
+ pulls those lines out with the speaker and the on-screen subtitle attached wherever it can
10
+ derive them.
11
+
12
+ It then puts the lines back in story order and encodes them into MP3 reels you can drop on a
13
+ phone and listen to like an audiobook. Nothing is fetched from the game's servers and nothing
14
+ in your install is modified. DeciWaves ships code only, and every second of audio it produces
15
+ comes off your own disk.
16
+
17
+ > **Requirements up front:** Windows 10/11 - Python 3.12+ - a legally owned PC install of the
18
+ > game you're extracting - about 10 GB free disk - (HZD and FW only) an NVIDIA GPU for the
19
+ > transcription stages. Death Stranding needs no GPU.
20
+
21
+ **Not affiliated with Guerrilla Games, Kojima Productions, or Sony Interactive
22
+ Entertainment.** DeciWaves ships code only - no game files, no dialogue text. It never
23
+ modifies your install (read-only), and its output is for your personal use.
24
+
25
+ ## Supported games
26
+
27
+ | Game | Edition | GPU needed | What you get |
28
+ |------|---------|------------|--------------|
29
+ | Death Stranding | Director's Cut (PC) | No | Lines identified straight from the Decima resource tree, with speaker and subtitle. Cutscene audio is whole-scene, not per-line. Story order is solid by default and sharper with an optional bring-your-own transcript. |
30
+ | Horizon Zero Dawn | Remastered (PC) | Yes | Audio is tied to lines by content fingerprint; ambiguous fingerprint collisions are confirmed with on-device transcription, capped by default at 300 buckets rather than a full-library pass (`--sample-cap 0` for uncapped). Reels come out in episode order. |
31
+ | Horizon Forbidden West | Complete Edition (PC) | Yes | Clips carry their exact in-game subtitle. Speaker labels and true story order need two bring-your-own inputs (a `types.json` and a gamescript); without them you still get subtitle-labeled reels. See [docs/BYO.md](docs/BYO.md). |
32
+
33
+ ## Install
34
+
35
+ pip install deciwaves
36
+
37
+ HZD and FW also need the GPU transcription extra (WhisperX). Install it together with a
38
+ PyTorch build that matches your CUDA version (see https://pytorch.org/get-started/locally/):
39
+
40
+ pip install deciwaves[asr]
41
+
42
+ Or install from a clone -- for development, or to run the latest unreleased code:
43
+
44
+ git clone https://github.com/prekabreki/DeciWaves
45
+ cd DeciWaves
46
+ pip install .
47
+
48
+ Then fetch the decode tools, point DeciWaves at your game, and check the result:
49
+
50
+ deciwaves setup --ds-install "C:\...\DEATH STRANDING DIRECTORS CUT"
51
+ deciwaves doctor
52
+
53
+ `setup` downloads vgmstream-cli, VGAudioCli, and ffmpeg into `%LOCALAPPDATA%\DeciWaves\tools`
54
+ (skipping any tool already present there -- pass `--force` to refetch anyway), finds the
55
+ Oodle DLL next to a DS install, and writes `config.json`. Pass `--hzd-package` or
56
+ `--fw-package` for those games instead, and (optionally) `--fw-gamescript` to persist your own
57
+ FW gamescript transcript so `fw run` and guided mode don't need `--gamescript` passed by hand
58
+ every time. It exits nonzero if any tool failed to download. `doctor` prints a preflight report
59
+ and returns success as long as every required tool is present; a game you don't own shows
60
+ `[--] not configured` and never fails the check.
61
+
62
+ ## Quick start - pick your game
63
+
64
+ The fastest path is guided mode. Run `deciwaves` with no arguments:
65
+
66
+ deciwaves
67
+
68
+ It detects which games you have configured, asks which one to extract, confirms a workspace
69
+ directory (and, for FW, optionally asks for your gamescript path if one isn't already
70
+ configured - see below - so guided mode can reach match/full-reel/render too, not just
71
+ subtitle-bind), and runs that game's full pipeline. This is the same pipeline the explicit commands
72
+ run; it only adds the menu around it. In a non-interactive shell it prints usage and exits
73
+ instead of blocking.
74
+
75
+ If you'd rather drive it yourself, each game has an explicit `run` command. The global
76
+ `--workspace` flag sets where output lands (default: the current directory) -- it must come
77
+ *before* the game name (`deciwaves --workspace DIR ds run`, not `deciwaves ds --workspace DIR
78
+ run`, which is parsed as that stage's own argument instead). A relative path you pass to a
79
+ stage's own flag (e.g. `--gamescript`) that already exists is resolved against the directory
80
+ you ran `deciwaves` from, not against `--workspace` -- it doesn't need to sit inside the
81
+ workspace. A relative path that doesn't exist yet (e.g. a stage's own output path) is left
82
+ alone and stays workspace-relative, same as always. A path saved earlier via `deciwaves setup`
83
+ is always absolute regardless.
84
+
85
+ ### Death Stranding (no GPU)
86
+
87
+ deciwaves --workspace D:\deciwaves ds run
88
+
89
+ This chains catalog -> order -> render. The catalog stage parses your install into
90
+ `out/catalog.csv` (roughly 27,000 rows, one per voice line); order builds `out/playlist.csv`;
91
+ render encodes the MP3 reels and their tracklists into `out/audio`. The catalog parse and the
92
+ render are the slow parts, each in the range of tens of minutes on a mid-range machine and
93
+ longer on a slow disk. No GPU is involved anywhere in the default DS chain.
94
+
95
+ ### Horizon Zero Dawn Remastered
96
+
97
+ pip install deciwaves[asr]
98
+ deciwaves --workspace D:\deciwaves hzd run
99
+
100
+ HZD chains catalog -> clip-index -> wem-metadata -> bind -> render. Structural binding
101
+ (content fingerprinting) resolves the vast majority of rows before any ASR runs at all; the
102
+ bind stage needs the `[asr]` extra and a CUDA GPU only to run WhisperX over what's left --
103
+ ambiguous fingerprint collisions. By default that ASR pass is capped at 300 ambiguous buckets
104
+ rather than running for hours over the full library; pass `--sample-cap 0` to `hzd run` (or
105
+ `hzd bind`) for an uncapped full pass instead, or any other number for a custom cap. On one
106
+ real install the capped default still bound 54,564 of 54,566 rows (99.996%), because
107
+ structural binding had already covered almost everything -- the cap costs little in practice,
108
+ and whenever it does leave buckets untranscribed, bind's own output states exactly how many.
109
+ Note: if `bind` already completed in a workspace, changing `--sample-cap` on a later `hzd run`
110
+ has no effect until you delete `out/hzd/.done-bind` and re-run it -- the done-marker doesn't
111
+ know its own flags changed. bind also checkpoints as it goes (see Resume, below), so an
112
+ interrupted bind picks up where it stopped.
113
+
114
+ ### Horizon Forbidden West
115
+
116
+ deciwaves --workspace D:\deciwaves fw run
117
+
118
+ FW chains extract -> asr -> subtitle-bind, which gets you clips labeled with their exact
119
+ in-game subtitle. The asr stage needs the `[asr]` extra and a GPU. subtitle-bind requires a
120
+ `types.json` (a Decima type map for FW) in the workspace root. Speaker labels and real story
121
+ order additionally need your own copy of the FW gamescript, passed with `--gamescript` (or set
122
+ once with `deciwaves setup --fw-gamescript <path>`, so you never have to pass the flag again).
123
+ Both are bring-your-own inputs that this repo does not and will not ship - see
124
+ [docs/BYO.md](docs/BYO.md). Without a gamescript, `fw run` stops cleanly after subtitle-bind
125
+ and tells you what it's waiting for.
126
+
127
+ ## How it works
128
+
129
+ DeciWaves reads the Decima archives in your install and never writes to them. Each game needs
130
+ its own way of tying an audio clip to the line it voices: DS parses the Decima resource tree
131
+ with a bundled, patched pydecima; HZD fingerprints each clip and confirms the match with
132
+ on-device transcription; FW replays its streaming-graph index and reads the exact subtitle out
133
+ of each dialogue group. The encoded payload is Wwise `.wem` (DS) or ATRAC9 (HZD and FW),
134
+ decoded to WAV by vgmstream-cli or VGAudioCli. A per-game story-order pass arranges the lines,
135
+ and ffmpeg encodes them into MP3 reels capped near 290 MB, each with a plain-text tracklist.
136
+ For the full design - package layout, the per-game solutions, the pipeline seam - see
137
+ [docs/architecture.md](docs/architecture.md).
138
+
139
+ ## Stage-by-stage usage
140
+
141
+ `deciwaves <game> run` is the whole pipeline. You can also run any single stage as
142
+ `deciwaves <game> <stage> [flags]`, and `deciwaves <game> <stage> --help` prints that stage's
143
+ own flags. `[GPU]` marks stages that need the `[asr]` extra and a CUDA GPU.
144
+
145
+ The decode-heavy stages (`ds render`, `hzd clip-index`, `hzd render`, `fw extract`) decode
146
+ clips concurrently and take a `--jobs N` flag (default `min(8, cpu_count)`); this is the
147
+ single biggest speed-up on a multi-core machine. `--jobs 1` forces the old one-at-a-time
148
+ decode. `deciwaves <game> run` uses the default automatically.
149
+
150
+ ### Death Stranding (`deciwaves ds ...`)
151
+
152
+ | Stage | What it does | Key flags |
153
+ |-------|--------------|-----------|
154
+ | catalog | Build the line catalog from your install | `--data-dir`, `--oodle` |
155
+ | order | Build the story-ordered playlist | `--transcript` (BYO, see [docs/BYO.md](docs/BYO.md)) |
156
+ | render | Render MP3 reels + tracklists | `--main-story`, `--speech-trim`, `--bitrate`, `--jobs` |
157
+ | cutscenes | Resolve cutscene voice tracks | standalone; `run` uses a bundled track list |
158
+ | trim | [GPU] Rebuild the speech-trim manifest | standalone |
159
+
160
+ `ds run` chains catalog -> order -> render. cutscenes and trim are not in that chain: `run`
161
+ ships pre-resolved data for them and leaves them available to regenerate against your own
162
+ install by hand.
163
+
164
+ ### Horizon Zero Dawn (`deciwaves hzd ...`)
165
+
166
+ | Stage | What it does | Key flags |
167
+ |-------|--------------|-----------|
168
+ | catalog | Build the line catalog | `--package` |
169
+ | clip-index | Fingerprint audio clips | `--package`, `--jobs` |
170
+ | wem-metadata | Extract wem metadata + coverage | `--package` |
171
+ | bind | [GPU] Bind clips to lines | `--package`, `--transcripts`, `--transcripts-out`, `--sample-cap` (default 300, 0 = unlimited) |
172
+ | render | Render MP3 reels + tracklists | `--out-dir`, `--jobs` |
173
+
174
+ ### Horizon Forbidden West (`deciwaves fw ...`)
175
+
176
+ | Stage | What it does | Key flags |
177
+ |-------|--------------|-----------|
178
+ | extract | Extract dialogue clips to WAV | `--package`, `--jobs` |
179
+ | asr | [GPU] Transcribe clips | `--roster`, `--model`, `--limit` |
180
+ | subtitle-bind | Label clips with exact subtitles | `--package-dir`, `--types-json` (BYO) |
181
+ | match | Speaker + story order (needs BYO gamescript) | `--gamescript` (BYO) |
182
+ | full-reel | Assemble the full-reel manifest | |
183
+ | weave | Woven story manifest | |
184
+ | dlc | Burning Shores manifest | |
185
+ | assemble | Concatenate manifests | |
186
+ | render | Render MP3 reels + tracklists | `--manifest`, `--tiers` |
187
+
188
+ `fw run` chains extract -> asr -> subtitle-bind, then continues match -> full-reel -> render
189
+ once a `--gamescript` is supplied (explicitly, or via a `--fw-gamescript` configured earlier
190
+ with `deciwaves setup`).
191
+
192
+ ## Configuration
193
+
194
+ `deciwaves setup` writes `config.json` to `%LOCALAPPDATA%\DeciWaves\config.json`. It records
195
+ the tools directory, the install path for each game you configured (`ds_install`,
196
+ `hzd_package`, `fw_package`, `oodle_dll`), and your optional FW gamescript path
197
+ (`fw_gamescript`, set with `--fw-gamescript`). Set `DECIWAVES_CONFIG_DIR` to keep that file
198
+ somewhere else.
199
+
200
+ Each run merges its flags over what's already saved -- an omitted flag keeps its previous
201
+ value, so running `deciwaves setup --hzd-package ...` later doesn't blank out a `--ds-install`
202
+ configured earlier. Pass a flag again (with a new path) to update it. To *clear* a saved path
203
+ (e.g. a stale `ds_install` or `fw_gamescript` that now points nowhere and makes `doctor` fail),
204
+ pass it as an explicit empty string: `deciwaves setup --ds-install ""` unsets it (omitting the
205
+ flag keeps it; only an explicit `""` clears).
206
+
207
+ Environment overrides, all optional:
208
+
209
+ - `DECIWAVES_CONFIG_DIR` - directory that holds `config.json` (default `%LOCALAPPDATA%\DeciWaves`).
210
+ - `DECIWAVES_VGMSTREAM` - full path to `vgmstream-cli.exe`, overriding the configured tools dir and PATH.
211
+ - `DECIWAVES_VGAUDIO` - full path to `VGAudioCli.exe`, same idea.
212
+
213
+ Workspace layout. `--workspace` (default: the current directory) is the root everything is
214
+ written under, all inside `out/`. DS writes `out/catalog.csv`, `out/playlist.csv`, and reels
215
+ in `out/audio`; HZD and FW write under `out/hzd/` and `out/fw/`.
216
+
217
+ Resume. `deciwaves <game> run` writes a marker file at `out/<game>/.done-<stage>` after each
218
+ stage finishes cleanly, and skips any stage whose marker already exists. To force a stage to
219
+ re-run, delete its marker and run again; the stages before it stay skipped, but re-running
220
+ that stage also deletes every LATER stage's marker in the chain, so downstream stages re-run
221
+ too instead of resuming from what's now stale data. A stage's output existing is deliberately
222
+ not treated as done - only its marker is - so a crash mid-stage never looks finished. The HZD
223
+ bind stage also checkpoints within itself: its `--transcripts-out` sidecar lets a restarted
224
+ bind reuse the clips it already transcribed. A marker also doesn't know if the flags used to
225
+ produce it have since changed - re-running `hzd run` with a different `--sample-cap` after
226
+ `bind` already has a marker is a no-op until you delete `out/hzd/.done-bind` yourself.
227
+
228
+ Bring-your-own inputs. The optional DS transcript, the required FW `types.json`, and the
229
+ optional FW gamescript are all documented in [docs/BYO.md](docs/BYO.md), including the exact
230
+ format each parser expects.
231
+
232
+ ## Troubleshooting
233
+
234
+ Run `deciwaves doctor` first. It reports each decode tool, the Oodle DLL, every configured
235
+ install, the ASR extra, and CUDA, and names the fix for anything missing.
236
+
237
+ Common failures:
238
+
239
+ - **Tool not found.** `doctor` shows a tool as `[--] not found`. Re-run `deciwaves setup` to
240
+ fetch it, put the executable on PATH, or point `DECIWAVES_VGMSTREAM` / `DECIWAVES_VGAUDIO`
241
+ at it.
242
+ - **Wrong install directory.** A game shows an error like "has no data/ dir" or "no
243
+ streaming_graph.core". Re-run `deciwaves setup --ds-install` / `--hzd-package` /
244
+ `--fw-package` with the correct path; the doctor message names the exact file it expects to
245
+ find.
246
+ - **No CUDA.** The `[asr]` extra is installed but `doctor` reports no GPU visible, so the GPU
247
+ stages (`hzd bind`, `fw asr`) won't run. Install a PyTorch build matching your CUDA version
248
+ (https://pytorch.org/get-started/locally/). DS needs none of this.
249
+ - **Windows Store Python.** The Microsoft Store build of Python virtualizes writes under
250
+ `%LOCALAPPDATA%`, which can hide or misplace DeciWaves' `config.json` and tools. Install
251
+ Python from python.org instead, or set `DECIWAVES_CONFIG_DIR` to a plain directory you
252
+ control.
253
+ - **Windows Store Python, second-order variant.** Even when `config.json` resolves fine, a
254
+ tools directory fetched under `%LOCALAPPDATA%` by `deciwaves setup` still lands inside that
255
+ same virtualized shadow. The parent Python resolves the tool there without trouble, but the
256
+ spawned `vgmstream-cli`/`ffmpeg` child process can't find its own side-by-side DLLs at the
257
+ real path and dies with an exit code like `0xC0000135` (STATUS_DLL_NOT_FOUND) -- every clip
258
+ fails and `render` reports zero decoded clips. The mitigation is the same, and matters more
259
+ here: use a python.org Python, or pass a plain directory outside `%LOCALAPPDATA%` to both
260
+ `DECIWAVES_CONFIG_DIR` and `deciwaves setup --tools-dir`.
261
+
262
+ ## License
263
+
264
+ MIT (see [LICENSE](LICENSE)). The bundled pydecima is also MIT (see
265
+ [src/deciwaves/_vendor/pydecima/LICENSE](src/deciwaves/_vendor/pydecima/LICENSE)).
@@ -0,0 +1,55 @@
1
+ [build-system]
2
+ requires = ["setuptools>=69"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "deciwaves"
7
+ version = "0.1.0"
8
+ description = "Extract speaker- and subtitle-tagged voice audio from Decima-engine games into story-ordered MP3 reels"
9
+ readme = "README.md"
10
+ requires-python = ">=3.12"
11
+ license = { text = "MIT" }
12
+ authors = [{ name = "prekabreki", email = "prekabreki@users.noreply.github.com" }]
13
+ dependencies = ["lz4>=4.0", "numpy>=1.24", "rapidfuzz>=3.0"]
14
+
15
+ [project.optional-dependencies]
16
+ test = ["pytest"]
17
+ asr = ["whisperx>=3.1,<4"]
18
+
19
+ [project.scripts]
20
+ deciwaves = "deciwaves.cli.main:main"
21
+
22
+ [project.urls]
23
+ Homepage = "https://github.com/prekabreki/DeciWaves"
24
+
25
+ [tool.setuptools.packages.find]
26
+ where = ["src"]
27
+
28
+ [tool.setuptools.package-data]
29
+ "deciwaves.data" = ["**/*.csv", "**/*.txt", "**/*.md"]
30
+ "deciwaves._vendor.pydecima" = ["LICENSE"]
31
+
32
+ [tool.pytest.ini_options]
33
+ testpaths = ["tests"]
34
+
35
+ [tool.ruff]
36
+ line-length = 120
37
+ target-version = "py312"
38
+ extend-exclude = ["src/deciwaves/_vendor"]
39
+
40
+ [tool.ruff.lint]
41
+ # Narrowly-scoped ignores for rules that fight this codebase's existing style
42
+ # (verified during Task 13 CI setup: each ignore below covers a pattern used
43
+ # repeatedly and deliberately, not a one-off; fixing them would mean mass
44
+ # rewriting working code rather than a mechanical lint fix).
45
+ ignore = [
46
+ "E702", # multiple statements on one line (;) -- used deliberately for
47
+ # dense algorithmic code (e.g. MurmurHash in pack/bin_archive.py)
48
+ # and terse test fakes; spans 14 files, not a one-off.
49
+ "E731", # lambda assigned to a name -- idiomatic here for small
50
+ # predicates/test fakes (engine/speakers.py filter, test doubles
51
+ # in test_cutscene_trim.py / test_speakers.py).
52
+ "E741", # ambiguous variable name (e.g. `l`) -- short loop vars in list
53
+ # comprehensions across src/games/hzd and multiple test files;
54
+ # renaming is a real edit, not a mechanical lint fix.
55
+ ]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1 @@
1
+ __version__ = "0.1.0"
File without changes
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2022 Bearborg
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ from deciwaves._vendor.pydecima import reader