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.
- deciwaves-0.1.0/LICENSE +21 -0
- deciwaves-0.1.0/PKG-INFO +284 -0
- deciwaves-0.1.0/README.md +265 -0
- deciwaves-0.1.0/pyproject.toml +55 -0
- deciwaves-0.1.0/setup.cfg +4 -0
- deciwaves-0.1.0/src/deciwaves/__init__.py +1 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/__init__.py +0 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/LICENSE +19 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/__init__.py +1 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/_utils.py +27 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/enums/DecimaVersion.py +7 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/enums/EAudioLanguages.py +16 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/enums/EPixelFormat.py +81 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/enums/ESentenceGroupType.py +7 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/enums/ETextLanguages.py +25 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/enums/ETextureSetType.py +19 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/enums/EWaveDataEncoding.py +11 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/enums/EWaveDataEncodingQuality.py +10 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/enums/__init__.py +8 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/reader.py +91 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/AmmoResource.py +18 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/CharacterDescriptionComponentResource.py +23 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/CollisionTrigger.py +17 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/CreditsColumn.py +21 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/CreditsRow.py +20 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/DamageAreaResource.py +18 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/DataSourceCreditsResource.py +18 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/EntityProjectileAmmoResource.py +23 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/EntityResource.py +33 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/ExplosionResource.py +17 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/FacialAnimationComponentResource.py +28 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/FactCollisionTrigger.py +18 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/FocusScannedInfo.py +27 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/FocusTargetComponentResource.py +29 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/HumanoidBodyVariant.py +32 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/HumanoidBodyVariantGroup.py +19 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/InventoryActionAbilityResource.py +15 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/InventoryAmmoEjectorResource.py +17 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/InventoryEntityResource.py +26 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/InventoryItemComponentResource.py +32 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/InventoryLootPackageComponentResource.py +22 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/LocalizedAnimationResource.py +13 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/LocalizedSimpleSoundResource.py +99 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/LocalizedTextResource.py +74 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/LootData.py +22 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/LootItem.py +22 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/LootSlot.py +19 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/MusicResource.py +84 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/ObjectCollection.py +12 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/OutOfBoundsNavMeshArea.py +14 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/PhysicsCollisionResource.py +15 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/PrefetchList.py +18 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/Resource.py +25 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/SentenceGroupResource.py +33 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/SentenceResource.py +32 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/SkeletonAnimationResource.py +9 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/SpawnSetup.py +36 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/SpawnSetupGroup.py +26 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/Texture.py +20 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/TextureSet.py +56 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/ThrowableResource.py +15 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/UITexture.py +26 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/UnknownResource.py +15 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/VoiceComponentResource.py +19 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/VoiceResource.py +19 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/VoiceSignalsResource.py +20 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/WaveResource.py +37 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/__init__.py +47 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/structs/HashedString.py +7 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/structs/ImageStruct.py +54 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/structs/Ref.py +44 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/resources/structs/__init__.py +0 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/type_maps/__init__.py +2 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/type_maps/dspc_type_map.py +6 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/type_maps/pc_type_map.py +5052 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/type_maps/ps4_type_map.py +1604 -0
- deciwaves-0.1.0/src/deciwaves/_vendor/pydecima/type_maps/type_map.py +15 -0
- deciwaves-0.1.0/src/deciwaves/cli/__init__.py +1 -0
- deciwaves-0.1.0/src/deciwaves/cli/config.py +217 -0
- deciwaves-0.1.0/src/deciwaves/cli/doctor.py +255 -0
- deciwaves-0.1.0/src/deciwaves/cli/guided.py +165 -0
- deciwaves-0.1.0/src/deciwaves/cli/main.py +209 -0
- deciwaves-0.1.0/src/deciwaves/cli/run.py +463 -0
- deciwaves-0.1.0/src/deciwaves/cli/setup.py +317 -0
- deciwaves-0.1.0/src/deciwaves/data/README.md +66 -0
- deciwaves-0.1.0/src/deciwaves/data/__init__.py +10 -0
- deciwaves-0.1.0/src/deciwaves/data/ds/cutscene-keepspans.csv +165 -0
- deciwaves-0.1.0/src/deciwaves/data/ds/cutscene_tracks.csv +171 -0
- deciwaves-0.1.0/src/deciwaves/data/ds/data-file-list.txt +378 -0
- deciwaves-0.1.0/src/deciwaves/data/fw/burning_shores_names.md +15 -0
- deciwaves-0.1.0/src/deciwaves/data/fw/character_names.md +148 -0
- deciwaves-0.1.0/src/deciwaves/engine/__init__.py +0 -0
- deciwaves-0.1.0/src/deciwaves/engine/asr.py +71 -0
- deciwaves-0.1.0/src/deciwaves/engine/atomic_io.py +117 -0
- deciwaves-0.1.0/src/deciwaves/engine/audio_clip.py +222 -0
- deciwaves-0.1.0/src/deciwaves/engine/catalog_io.py +180 -0
- deciwaves-0.1.0/src/deciwaves/engine/pack/__init__.py +5 -0
- deciwaves-0.1.0/src/deciwaves/engine/pack/base.py +57 -0
- deciwaves-0.1.0/src/deciwaves/engine/pack/bin_archive.py +241 -0
- deciwaves-0.1.0/src/deciwaves/engine/pack/bin_index.py +42 -0
- deciwaves-0.1.0/src/deciwaves/engine/pack/dsar_archive.py +127 -0
- deciwaves-0.1.0/src/deciwaves/engine/pack/fw_fast_extract.py +112 -0
- deciwaves-0.1.0/src/deciwaves/engine/pack/fw_object_reader.py +359 -0
- deciwaves-0.1.0/src/deciwaves/engine/pack/fw_rtti.py +123 -0
- deciwaves-0.1.0/src/deciwaves/engine/pack/fw_stream.py +83 -0
- deciwaves-0.1.0/src/deciwaves/engine/pack/fw_streaming_graph.py +355 -0
- deciwaves-0.1.0/src/deciwaves/engine/pack/hzd_locators.py +111 -0
- deciwaves-0.1.0/src/deciwaves/engine/pack/hzd_package.py +73 -0
- deciwaves-0.1.0/src/deciwaves/engine/parallel.py +140 -0
- deciwaves-0.1.0/src/deciwaves/engine/profile.py +54 -0
- deciwaves-0.1.0/src/deciwaves/engine/render.py +452 -0
- deciwaves-0.1.0/src/deciwaves/engine/selection.py +60 -0
- deciwaves-0.1.0/src/deciwaves/engine/sentence_core.py +71 -0
- deciwaves-0.1.0/src/deciwaves/engine/speakers.py +193 -0
- deciwaves-0.1.0/src/deciwaves/engine/speech_trim.py +45 -0
- deciwaves-0.1.0/src/deciwaves/engine/text_lang.py +47 -0
- deciwaves-0.1.0/src/deciwaves/engine/text_normalize.py +19 -0
- deciwaves-0.1.0/src/deciwaves/engine/tool_paths.py +74 -0
- deciwaves-0.1.0/src/deciwaves/engine/transcript_anchor.py +46 -0
- deciwaves-0.1.0/src/deciwaves/games/__init__.py +0 -0
- deciwaves-0.1.0/src/deciwaves/games/ds/__init__.py +0 -0
- deciwaves-0.1.0/src/deciwaves/games/ds/catalog.py +146 -0
- deciwaves-0.1.0/src/deciwaves/games/ds/cutscene_audio.py +207 -0
- deciwaves-0.1.0/src/deciwaves/games/ds/cutscene_trim.py +121 -0
- deciwaves-0.1.0/src/deciwaves/games/ds/episode_map.py +121 -0
- deciwaves-0.1.0/src/deciwaves/games/ds/profile.py +52 -0
- deciwaves-0.1.0/src/deciwaves/games/ds/story_order.py +277 -0
- deciwaves-0.1.0/src/deciwaves/games/fw/__init__.py +1 -0
- deciwaves-0.1.0/src/deciwaves/games/fw/asr_run.py +140 -0
- deciwaves-0.1.0/src/deciwaves/games/fw/assemble.py +62 -0
- deciwaves-0.1.0/src/deciwaves/games/fw/dlc.py +92 -0
- deciwaves-0.1.0/src/deciwaves/games/fw/extract.py +236 -0
- deciwaves-0.1.0/src/deciwaves/games/fw/gamescript.py +78 -0
- deciwaves-0.1.0/src/deciwaves/games/fw/manifest.py +11 -0
- deciwaves-0.1.0/src/deciwaves/games/fw/render.py +172 -0
- deciwaves-0.1.0/src/deciwaves/games/fw/story_full.py +138 -0
- deciwaves-0.1.0/src/deciwaves/games/fw/subtitle_bind.py +256 -0
- deciwaves-0.1.0/src/deciwaves/games/fw/subtitle_match.py +172 -0
- deciwaves-0.1.0/src/deciwaves/games/fw/weave.py +151 -0
- deciwaves-0.1.0/src/deciwaves/games/hzd/__init__.py +0 -0
- deciwaves-0.1.0/src/deciwaves/games/hzd/asr_bind.py +284 -0
- deciwaves-0.1.0/src/deciwaves/games/hzd/atrac9.py +54 -0
- deciwaves-0.1.0/src/deciwaves/games/hzd/binding.py +38 -0
- deciwaves-0.1.0/src/deciwaves/games/hzd/catalog.py +244 -0
- deciwaves-0.1.0/src/deciwaves/games/hzd/clip_index.py +89 -0
- deciwaves-0.1.0/src/deciwaves/games/hzd/episode_map.py +106 -0
- deciwaves-0.1.0/src/deciwaves/games/hzd/inventory.py +56 -0
- deciwaves-0.1.0/src/deciwaves/games/hzd/match.py +82 -0
- deciwaves-0.1.0/src/deciwaves/games/hzd/profile.py +133 -0
- deciwaves-0.1.0/src/deciwaves/games/hzd/render.py +251 -0
- deciwaves-0.1.0/src/deciwaves/games/hzd/sentence_fw.py +319 -0
- deciwaves-0.1.0/src/deciwaves/games/hzd/wem_metadata.py +177 -0
- deciwaves-0.1.0/src/deciwaves.egg-info/PKG-INFO +284 -0
- deciwaves-0.1.0/src/deciwaves.egg-info/SOURCES.txt +228 -0
- deciwaves-0.1.0/src/deciwaves.egg-info/dependency_links.txt +1 -0
- deciwaves-0.1.0/src/deciwaves.egg-info/entry_points.txt +2 -0
- deciwaves-0.1.0/src/deciwaves.egg-info/requires.txt +9 -0
- deciwaves-0.1.0/src/deciwaves.egg-info/top_level.txt +1 -0
- deciwaves-0.1.0/tests/test_asr.py +97 -0
- deciwaves-0.1.0/tests/test_atomic_io.py +176 -0
- deciwaves-0.1.0/tests/test_atrac9.py +54 -0
- deciwaves-0.1.0/tests/test_audio_clip.py +333 -0
- deciwaves-0.1.0/tests/test_bin_archive_find_chunk.py +82 -0
- deciwaves-0.1.0/tests/test_binding.py +41 -0
- deciwaves-0.1.0/tests/test_build_catalog.py +421 -0
- deciwaves-0.1.0/tests/test_cli_config.py +377 -0
- deciwaves-0.1.0/tests/test_cli_doctor.py +394 -0
- deciwaves-0.1.0/tests/test_cli_guided.py +419 -0
- deciwaves-0.1.0/tests/test_cli_main.py +283 -0
- deciwaves-0.1.0/tests/test_cli_run.py +981 -0
- deciwaves-0.1.0/tests/test_cli_setup.py +613 -0
- deciwaves-0.1.0/tests/test_clip_index.py +20 -0
- deciwaves-0.1.0/tests/test_cutscene_audio.py +215 -0
- deciwaves-0.1.0/tests/test_cutscene_trim.py +47 -0
- deciwaves-0.1.0/tests/test_data_pkg.py +45 -0
- deciwaves-0.1.0/tests/test_dsar_archive.py +97 -0
- deciwaves-0.1.0/tests/test_dsar_archive_lru.py +115 -0
- deciwaves-0.1.0/tests/test_dspc_layout.py +92 -0
- deciwaves-0.1.0/tests/test_episode_map.py +82 -0
- deciwaves-0.1.0/tests/test_fixtures_bin_archive.py +352 -0
- deciwaves-0.1.0/tests/test_fixtures_fw_streaming_graph.py +168 -0
- deciwaves-0.1.0/tests/test_fixtures_sentence_core.py +184 -0
- deciwaves-0.1.0/tests/test_fixtures_sentence_fw.py +214 -0
- deciwaves-0.1.0/tests/test_fw_asr_run.py +158 -0
- deciwaves-0.1.0/tests/test_fw_assemble.py +32 -0
- deciwaves-0.1.0/tests/test_fw_audio_binding.py +95 -0
- deciwaves-0.1.0/tests/test_fw_dlc.py +43 -0
- deciwaves-0.1.0/tests/test_fw_extract.py +388 -0
- deciwaves-0.1.0/tests/test_fw_fast_extract.py +133 -0
- deciwaves-0.1.0/tests/test_fw_gamescript.py +97 -0
- deciwaves-0.1.0/tests/test_fw_manifest.py +9 -0
- deciwaves-0.1.0/tests/test_fw_object_reader.py +290 -0
- deciwaves-0.1.0/tests/test_fw_render.py +70 -0
- deciwaves-0.1.0/tests/test_fw_rtti.py +66 -0
- deciwaves-0.1.0/tests/test_fw_story_full.py +114 -0
- deciwaves-0.1.0/tests/test_fw_stream.py +33 -0
- deciwaves-0.1.0/tests/test_fw_streaming_graph.py +44 -0
- deciwaves-0.1.0/tests/test_fw_subtitle_bind.py +184 -0
- deciwaves-0.1.0/tests/test_fw_subtitle_manifest_defaults.py +46 -0
- deciwaves-0.1.0/tests/test_fw_subtitle_match.py +112 -0
- deciwaves-0.1.0/tests/test_fw_weave.py +72 -0
- deciwaves-0.1.0/tests/test_hzd_asr_bind.py +617 -0
- deciwaves-0.1.0/tests/test_hzd_catalog.py +584 -0
- deciwaves-0.1.0/tests/test_hzd_clip_index.py +119 -0
- deciwaves-0.1.0/tests/test_hzd_extract_ids.py +61 -0
- deciwaves-0.1.0/tests/test_hzd_inventory.py +103 -0
- deciwaves-0.1.0/tests/test_hzd_locators.py +141 -0
- deciwaves-0.1.0/tests/test_hzd_memscan.py +149 -0
- deciwaves-0.1.0/tests/test_hzd_package.py +156 -0
- deciwaves-0.1.0/tests/test_hzd_phys_to_key.py +31 -0
- deciwaves-0.1.0/tests/test_hzd_render.py +229 -0
- deciwaves-0.1.0/tests/test_hzd_wem_metadata.py +384 -0
- deciwaves-0.1.0/tests/test_match.py +130 -0
- deciwaves-0.1.0/tests/test_pack_base.py +172 -0
- deciwaves-0.1.0/tests/test_pack_index.py +81 -0
- deciwaves-0.1.0/tests/test_parallel.py +174 -0
- deciwaves-0.1.0/tests/test_profile.py +86 -0
- deciwaves-0.1.0/tests/test_render_story.py +685 -0
- deciwaves-0.1.0/tests/test_selection.py +182 -0
- deciwaves-0.1.0/tests/test_sentence_core.py +157 -0
- deciwaves-0.1.0/tests/test_sentence_fw.py +51 -0
- deciwaves-0.1.0/tests/test_sentence_media.py +182 -0
- deciwaves-0.1.0/tests/test_sound_resource.py +33 -0
- deciwaves-0.1.0/tests/test_speakers.py +507 -0
- deciwaves-0.1.0/tests/test_speech_trim.py +48 -0
- deciwaves-0.1.0/tests/test_story_order.py +260 -0
- deciwaves-0.1.0/tests/test_text_lang.py +60 -0
- deciwaves-0.1.0/tests/test_text_normalize.py +10 -0
- deciwaves-0.1.0/tests/test_tool_paths.py +77 -0
- deciwaves-0.1.0/tests/test_transcript_anchor.py +40 -0
deciwaves-0.1.0/LICENSE
ADDED
|
@@ -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.
|
deciwaves-0.1.0/PKG-INFO
ADDED
|
@@ -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 @@
|
|
|
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
|