Датасеты

#4
by ll2pakll - opened

Привет. Где вы брали датасеты? Я хочу обучить новые модели для RVC.

Здраствуйте - я достаю напрямую из игры.

Здраствуйте - я достаю напрямую из игры.

А у вас они не остались в каком нибудь архиве например? А то я не знаю как из игры достать.

Нет - я их не храню, так-как это занимает много дискового пространства и ощутимо замедляет работоспособность системы. У меня храниться только некоторая часть в виде не сортированных и не обработанных аудио файлов (60 000 с небольшим тысяч).

Нет - я их не храню, так-как это занимает много дискового пространства и ощутимо замедляет работоспособность системы. У меня храниться только некоторая часть в виде не сортированных и не обработанных аудио файлов (60 000 с небольшим тысяч).

Понял. А может поделитесь способом как вы извлекали голоса и сегригировали их по персонажам?

Извлечь файлы озвучки из "Ведьмак 3" не очень сложно, но занимает много машинного времени. Я знаю 2 способа:

  1. Крайне прост, но извлекает далеко не всё и нормально не работает с DLC и NextGen версией (У меня он извлекал +-60к аудио файлов из примерно 120к) - https://github.com/JTGizmo/Extracting-Voice-Over-Audio-from-Witcher-3
  2. Извлекает всё, но не работает из коробки и требует определённых манипуляций - https://www.playground.ru/witcher_3_wild_hunt/guide/the_witcher_3_wild_hunt_drugoe_modkit-1206307

Я использую объединённый способ:

  1. Использую настроенный инструмент из "2. playground" для извлечения ".wav (это сжатый тип, который не открывается без преобразования)" и ".cr2w (Это вроде как файл отвечающий за движения губ и он необходим для преобразования в читабельные аудио файлы)"
  • Для настройки надо следовать инструкции "Гайд по получению всех текстур из игры", но не создавать папку "exported_offzip";
  • Использовать команду lua lua/inspect_w3speech.lua "путь к папке с игрой\content\content0\Язык_Озвучкиpc.w3speech" exported_lua вместо lua lua/unpack_textures.lua texture.cache exported_lua
  • Пример команды для простой работы: lua lua/inspect_w3speech.lua "C:\Games\The_Witcher_3_Wild_Hunt\content\content0\rupc.w3speech" exported_lua
    (Эта команда извлечёт файлы русской озвучки из архива "rupc.w3speech" и поместит сжатые файлы в папку "exported_lua"
  1. Использую инструмент преобразования из "1. github" и преобразовываю файлы из ".wav" и ".cr2w" -> ".ogg" -> ".wav (читабельный PCM)"
  2. Использую текстовый файлы "w3dialog_id.txt" из "1. github" для сопоставления имения аудио файла и персонажей с фразами из игры
  • Пример: После извлечения и преобразования есть файл "0x0002a7e2.wav.ogg.wav" -> захожу в "w3dialog_id.txt" и ищу (для поиска использую "Notepad++") id без расширения "0x0002a7e2" -> находиться строка "48 0x0002a7e2 Geralt: We had a deal. I've done my part. Your turn to do yours."
    (48="Номер фразы по игровому порядку" 0x0002a7e2="Уникальное имя фразы (id)" Geralt:="Имя персонажа (бывает что имя не соответствует внутри игровому и приходится искать по фразам)")
  1. После сопоставления у меня получается следующие название файла "48_0x0002a7e2.wav" или "Rus_48_0x0002a7e2_Geralt"
  2. Сопоставленные фразы необходимо подготовить для обучения в "SO-VITS-SVC" -> Для этого их необходимо преобразовать со следующими параметрами "44100 Гц, Моно 1 канал, 16-Бит" -> Для преобразования можно использовать любой аудио редактор который умеет пакетно обрабатывать аудио файлы (Я использую "Adobe Audition")

Касаемо всего процесса - у меня он уже отточен и во многих вещях упрощён и автоматизирован.

Спасибо за подробную инструкцию. В целом вполне выполнимо, но я ещу попробую помучится с SO-VITS-SVC, потому что исходя из инструкции придётся много эксперементировать пока не получится то что нужно, уйдёт на это несколько недель, которых у меня нет. SO-VITS-SVC и ваши модели замечательные, но к сожалению местами кортавят и сложные слова как напрмиер "пятидесяти" звучат неестественно, но всё равно проделанная вами работа замечательна и мне, как человеку который хочет озвучить свою историю голосами персонажей из the witcher невероятно помогла.

Касаемо картавости - вы на какой голос пытаетесь накладывать модели, так-как звучание очень сильно привязано к говорящему (Я для этих целей в большинстве случаев использую синтезатор речи "Microsoft - Azure (Edge)) или "Silero TTS - Xenia (Demagog)

Добрый день
Я не смог найти файлы русской речи
Английские диалоги вижу. НО вот русских не увидел. Я что-то пропустил или они не были загружены? Просто странно что в папке для RU нету русских диалогов.

Вы про какую папку "RU"?

Я немного добавлю контекста
Моя задача составить вот такой датасет:
звуковой файл wav | текст
где .wav это русский голосовой файл Геральта, а текст - сам текст его фразы.

Потом я буду использовать такой датасет для создания TTS модели.
И наткнулся на вашу страницу.

Вот здесь есть ру WAV файлы: https://huggingface.co/datasets/Rootreck/so-vits-svc-4.0-ru-The_Witcher_3_Wild_Hunt/tree/7b42b550afcb5fc32d5fc053815bd2148db8350d/TW3_M_Geralt_Rus%20(Training%20data)
Но там только англ речь Геральта, например в этом файле: w3dialog_id (Geralt - All)_1.txt
А мне бы условно получить вот такой файл: RU_w3dialog_id (Geralt - All)_1.txt

Я кое уже что попробовал сделать. Из файлов игры я извлек ру речь, при помощи w3strings encode
Там в таком формате:
id,key_hex,key_str,text
527948,00000000,,"Я так скажу… Если Йен не справится с проклятием Умы, мы всегда сможем обратиться к Трисс, и она на нас не обозлится. А вот если сделать наоборот…"

Я догадался что по вашему методу, названия файлов кодируются в 16-ричной системе. Так например 527948 превращается в 0x00080e4c
И в Witcher 3 Dialog.xlsx доке с диалогами я смог найти 157 0x00080e4c:
Geralt: Put it to you this way… If Yen can't help Uma, we can always go to Triss - she won't hold it against us. But if we'd done it the other way around…

Но может у вас уже есть таблица соответствия русским диалогам и русским .wav файлам?

Это бы очень помогло!

Я вас понял.

  1. Текст на Английском (Его подготавливал не я, а автор инструмента "w3utils - proper - https://github.com/JTGizmo/Extracting-Voice-Over-Audio-from-Witcher-3) мне не удалось вытащить русский текст;
  2. Звуковые файлы все на русском языке;
  3. Русской таблицы у меня нет, но мне бы она тоже пригодилась

Вы можете попробовать извлечь таблицу (у меня не выходит). Вот инструмент - https://github.com/hhrhhr/Lua-utils-for-Witcher-3
Я пробовал при помощи "inspect_w2strings.lua", но выходит ошибка:
!!! unknown key '0x00A34800' !!!

stack traceback:
[C]: in function 'assert'
...ograms\Extracting-Voice\Lua_Export\lua\mod_w3strings.lua:24: in function 'get_key'
lua/inspect_w2strings.lua:94: in main chunk
[C]: in ?

Кажется я смог извлечь
Нашлись совпадения по 10000 файлов
Вроде бы адекватные. Я проведу еще раз тестов, и поделюсь

Мне удалось получить файл "RU_w3dialog (Но как получить его с id - я не понимаю)". Для этого я использовал инструмент "w3unpack.exe", который есть в архиве "https://github.com/JTGizmo/Extracting-Voice-Over-Audio-from-Witcher-3"

Для этого я создал "03 all_dialogues.bat" и вставил туда следующие:
:: Путь к папке с игрой
set W3DIR=C:\Games\The_Witcher_3_Wild_Hunt
:: Язык локализации
set W3LANG=ru

w3unpack.exe -d -l %W3LANG% "%W3DIR%\content" all_dialogues_%W3LANG%.txt

Так-что делюсь.

спасибо
я сделал сложнее, но все получилось. Вытянул весь текст, перекодировал ID в формат ID wav файлов, и тоже работает.
Благодарю за труд!

Можете более подробно написать, как вы сделали?

Нет проблем!
По этапам:

  1. Нашел вообще все .w3string файлы в папке с игрой

  2. сделал батник и запустил - он все .w3string превратил в .csv:
    @echo off
    for %%f in (*.w3strings) do (
    w3strings.exe -d "%%f"
    )
    pause

  3. Склеил ВСЕ полученные CSV в один файл (можно в питоне или в cmd)

  4. Запустил скрипт на python который вытягивает из этой CSV таблицы ID и Text, приводя к формату:
    id | text
    И самое главное - w3strings ID сохраняет в 10ричной системе. Поэтому в этом python скрипте я все ID переделал в 16-ричные под формат извлеченных .wav файлов
    Вот кусок кода на python:
    decimal_id = int(id_str) # Преобразуем в десятичное
    row["hex_id_padded"] = f"0x{decimal_id:08x}" # Преобразуем в hex с дополнением

  5. Итог
    В итоге получается таблица в таком формате:
    id|text
    1000_0x00127ad0|Как такое могло случиться? Кто на неё напал?!
    1001_0x00070d8f|Здесь не пройти. Надо поискать другую дорогу.
    1003_0x00127ad4|Лютик, мне жаль, что меня там не было…

@kivrus А вы не могли бы куда-нибудь выложить итоговую таблицу? Я хотела бы сделать из этого датасета датасет для TTS и тоже выложить его на Huggingface, потому что таких датасетов на русском очень не хватает.

Здравствуйте @korovsky , можно поинтересоваться насчёт TTS над которым вы работаете - возможно я смогу помочь.
Мне сегодня удалось получить таблицу в следующем формате: (Я использовал иной подход в отличие от предыдущих попыток)

Голос говорящего|Название извлечённого аудио без номера|Текст
GERALT|0x000f7fae|"Высунулся, чтобы глотнуть воздуха, - и тут на него напали."
GERALT|0x000f7fb2|"Зараза... Ничего удивительного, что старик говорил не выныривать."
GERALT|0x000f7fb4|"Крысы. Что за гнусное место..."

У этого способа имеется недостаток - придётся по новой извлекать все аудио файлы из игры или обратно переименовывать мои датасеты из формата "5_0x000f7fae.wav" в формат "0x000f7fae.wav"

@Rootreck Здравствуйте. Я вчера в итоге смогла вытащить весь текст из игры, когда знакомые отдали мне файлы w3strings (у меня нет игрового ПК, только консоли). Положила csv-файл сюда: https://github.com/juliakorovsky/witcher_rus_dialogue
Насколько я понимаю, мне удалось сопоставить аудио с текстом из вашего датасета. По крайней мере, я проверила пару фраз - там была правильная транскрипция. У меня порядок действий был такой:

  1. Получила content.ru.w3strings файлы
  2. Извлекла каждый файл с помощью w3strings.exe
  3. Почистила файлы, чтобы они все были в одном формате: id|hex|text и склеила в один csv-файл, убрав дубликаты строк
  4. По совету @kivrus выше преобразовала числа из поля id в формат f"0x{decimal_id:08x}", добавила колонку wav_id с этими преобразованными значениями
  5. Прошлась по всем вашим wav-файлам в датасете и сопоставила вторую часть имени файла после _ без расширения с полем wav_id.
  6. В итоге у меня совпали 13 882 строки.

Теперь с помощью моего csv можно сопоставить ваши wav-файлы и текст, с помощью поиска по полю wav_id.

У моих WAV есть ещё номер в начале файла - этот номер и ID были взяты из файла "w3dialog_id.txt (https://github.com/JTGizmo/Extracting-Voice-Over-Audio-from-Witcher-3)", но там текст на английском языке в следующем формате:

quests/minor_quests/skellige/quest_files/mq2041_trial_of_dexterity/scenes/mq2041_04_man_from_the_hill.w2scene:

6 0x000f8c73 Skellige Old Man 01: The White-Haired One goes to his death… Nay, no foreigner can traverse the Path of Warriors.

11 0x000f8c74 Skellige Old Man 01: No foreigner's ever completed the Path of Warriors.
13 0x000f8c75 Geralt: First time for everything.
15 0x000f8c84 Skellige Old Man 01: Some only learn from their mistakes. Thing is, in Skellige, mistakes usually cost you your life.

quests/minor_quests/skellige/quest_files/mq2043_trial_of_conviction/scenes/mq2043_01_geralt_gp.w2scene:

5 0x000f7fae Geralt: Surfaced for air - and they nabbed him.

9 0x000f7fb2 Geralt: Shit… Old man warned me not to surface before the end. No wonder.

13 0x000f7fb4 Geralt: Rats. Real pleasant place…

Раньше я чистил текст в "Notepad++" в несколько этапов, чтобы получить:
6 0x000f8c73 Skellige Old Man 01: The White-Haired One goes to his death… Nay, no foreigner can traverse the Path of Warriors.
11 0x000f8c74 Skellige Old Man 01: No foreigner's ever completed the Path of Warriors.
13 0x000f8c75 Geralt: First time for everything.
15 0x000f8c84 Skellige Old Man 01: Some only learn from their mistakes. Thing is, in Skellige, mistakes usually cost you your life.
5 0x000f7fae Geralt: Surfaced for air - and they nabbed him.
9 0x000f7fb2 Geralt: Shit… Old man warned me not to surface before the end. No wonder.
13 0x000f7fb4 Geralt: Rats. Real pleasant place…

Потом этот вариант сохранял и открывал в "Microsft Excel".
6 0x000f8c73 Skellige Old Man 01: The White-Haired One goes to his death… Nay, no foreigner can traverse the Path of Warriors.
11 0x000f8c74 Skellige Old Man 01: No foreigner's ever completed the Path of Warriors.
13 0x000f8c75 Geralt: First time for everything.
15 0x000f8c84 Skellige Old Man 01: Some only learn from their mistakes. Thing is, in Skellige, mistakes usually cost you your life.
5 0x000f7fae Geralt: Surfaced for air - and they nabbed him.
9 0x000f7fb2 Geralt: Shit… Old man warned me not to surface before the end. No wonder.
13 0x000f7fb4 Geralt: Rats. Real pleasant place…

Далее в "Excel"
Из этого "6 0x000f8c73 Skellige Old Man 01: The White-Haired One goes to his death… Nay, no foreigner can traverse the Path of Warriors.
В это "6 0x000f8c73"

Далее в "Notepad++"
Из "6 0x000f8c73"
В "6_0x000f8c73"

Далее создавал 2 списка

1)
0x000f8c73.wav.ogg.wav
0x000f8c74.wav.ogg.wav
0x000f8c75.wav.ogg.wav
2)
6_0x000f8c73.wav
11_0x000f8c74.wav
13_0x000f8c75.wav

Далее создавал "list.txt" для переименования в следующем формате:
0x000f8c73.wav.ogg.wav:6_0x000f8c73.wav
0x000f8c74.wav.ogg.wav:11_0x000f8c74.wav
0x000f8c75.wav.ogg.wav:13_0x000f8c75.wav

Далее запускал ".bat" для переименования: (Код ниже)
echo off
set "names=%dp0\list.txt"
set "files=%
dp0"
powershell -executionpolicy bypass -command "Get-Content '%names%' | foreach {rename-item """%files%$($.split(':')[0])""" """$($.split(':')[1])"""}"
pause
exit

:: Примечание
::
:: В list.txt формат должен быть строго таким:
:: 0x000f8c73.wav.ogg.wav:6_0x000f8c73.wav
:: То есть старое имя файла с расширением, разделитель (обязательно двоеточие) и новое имя файла с расширением

Именно так и получалось итоговое название аудио файлов. (Это долго и не удобно, но сегодня я нашёл более простой способ)

@Rootreck На самом деле ведь совершенно неважно, что будет у вас в начале файла. Может быть хоть 6_0x000f8c73.wav, хоть 0x000f8c73.wav, хоть 111111_0x000f8c73.wav. Главное, чтобы сохранялся id, который используется в w3strings, тогда всегда можно будет сопоставить аудио и текст с помощью id из w3strings, который нужно перевести в шестнадцатеричный формат, как описывали выше. Питоном это очень удобно делать.

Новый способ заключается в следующем:

  1. Скачать "w3utils - proper.rar" - https://github.com/JTGizmo/Extracting-Voice-Over-Audio-from-Witcher-3

  2. Скачать "Lua531_lua_zlib_x64.zip" - https://github.com/hhrhhr/Lua-utils-for-Witcher-3/releases

  3. Скачать "Lua-utils-for-Witcher-3" - https://github.com/hhrhhr/Lua-utils-for-Witcher-3

  4. Создать "Папку" для инструментов - у меня это "Voice"

  5. Распаковать файлы из "w3utils - proper.rar" и "Lua531_lua_zlib_x64.zip" в папку "Voice"

  6. Удалить папку "lua_utils" в папке "Voice" и создать папку "lua"

  7. Распаковать все "lua скрипты" из "Lua-utils-for-Witcher-3" в созданную папку "lua"

  8. В папке "lua" открыть файл "inspect_w3speech.lua" через "Notepad++" и заменить строку "r:idstring("\xA2\x00\x00\x00") -- 162" на "r:uint32()"

  9. В папке "lua" открыть файл "inspect_w3strings.lua" через "Notepad++" и заменить строку "r:idstring("\xA2\x00\x00\x00") -- 162" на "r:uint32()"

  10. Удалить стандартные файлы "Batch extraction.bat" и "Convert to Wav and OGG.bat" в папке "Voice"

  11. В папке "Voice" создать файл "01 Extraction w3speech.bat" (Код ниже)
    Этот шаг распакует все файлы ".w3speech" и сохранить как отдельные файлы ".cr2w и .wav (зашифрованный)" в папке "01_ru_w3speech"

:: Путь до игры
set W3DIR=C:\Games\The_Witcher_3_Wild_Hunt
:: Язык локализации
set W3LANG=ru

mkdir 01_%W3LANG%_w3speech

lua lua/inspect_w3speech.lua "%W3DIR%\content\content0%W3LANG%pc.w3speech" 01_%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\content\content1%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\content\content2%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\content\content3%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\content\content4%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\content\content5%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\content\content6%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\content\content7%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\content\content8%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\content\content9%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\content\content10%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\content\content11%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\content\content12%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\DLC\DLC1\content%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\DLC\DLC2\content%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\DLC\DLC3\content%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\DLC\DLC4\content%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\DLC\DLC5\content%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\DLC\DLC6\content%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\DLC\DLC7\content%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\DLC\DLC8\content%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\DLC\DLC9\content%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\DLC\DLC10\content%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\DLC\DLC11\content%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\DLC\DLC12\content%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\DLC\DLC13\content%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\DLC\DLC14\content%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\DLC\DLC15\content%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\DLC\DLC16\content%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\DLC\ep1\content%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\DLC\bob\content%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\content\patch0%W3LANG%pc.w3speech" 01
%W3LANG%w3speech
lua lua/inspect_w3speech.lua "%W3DIR%\content\patch1%W3LANG%pc.w3speech" 01
%W3LANG%_w3speech

12_0) В папке "Voice" создать файл "02 Convert w3speech to OGG and WAV.bat" или "02 Convert w3speech to OGG.bat"
Этот шаг преобразует все файлы ".cr2w и .wav (зашифрованный)" и сохранит как обычные аудио файлы

12_1) Код файла "02 Convert w3speech to OGG and WAV.bat"
Преобразует ".cr2w и .wav (зашифрованный)" в ".ogg" и сохранит в папке "02_ru_ogg"
Преобразует ".ogg" и сохранит в папке "03_ru_wav"

:: Язык локализации
set W3LANG=ru

del 02_%W3LANG%ogg*.ogg
del 03
%W3LANG%_wav*.wav

mkdir 02_%W3LANG%ogg
mkdir 03
%W3LANG%_wav

cd 01_%W3LANG%w3speech
for %%i in (*.wav) do ..\ww2ogg.exe %%i -o ..\02
%W3LANG%_ogg%%i.ogg --pcb ..\packed_codebooks_aoTuV_603.bin

cd ..\02_%W3LANG%ogg
ren .wav.ogg .ogg
for %%i in (
.ogg) do ..\revorb.exe %%i
for %%i in (
.ogg) do ..\oggdec.exe -w ..\03
%W3LANG%_wav%%i.wav %%i

cd ..\03_%W3LANG%_wav
ren *.ogg.wav *.wav
cd ..

12_2) Код файла "02 Convert w3speech to OGG.bat"
Преобразует ".cr2w и .wav (зашифрованный)" в ".ogg" и сохранит в папке "02_ru_ogg"

:: Язык локализации
set W3LANG=ru

del 02_%W3LANG%_ogg*.ogg

mkdir 02_%W3LANG%_ogg

cd 01_%W3LANG%w3speech
for %%i in (*.wav) do ..\ww2ogg.exe %%i -o ..\02
%W3LANG%_ogg%%i.ogg --pcb ..\packed_codebooks_aoTuV_603.bin

cd ..\02_%W3LANG%_ogg
ren *.wav.ogg .ogg
for %%i in (
.ogg) do ..\revorb.exe %%i

cd ..

  1. В папке "Voice" создать файл "06 Extraction Strings.bat" (Код ниже) - "06", так-как у меня есть файлы " 04 и 05", но они тут не требуются, а "03" это шаг
    преобразования ".ogg" в ".wav" в файле "02 Convert w3speech to OGG and WAV.bat"
    Этот шаг распакует все файлы ".w3strings" и сохранить как отдельные файлы ".txt" в папке "06_ru_w3strings"

:: Путь до игры
set W3DIR=C:\Games\The_Witcher_3_Wild_Hunt
:: Язык локализации
set W3LANG=ru

mkdir 06_%W3LANG%_w3strings

w3unpack.exe -c -l %W3LANG% "%W3DIR%\content\content0" 06_%W3LANG%w3strings\content0%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\content\content1" 06_%W3LANG%w3strings\content1%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\content\content2" 06_%W3LANG%w3strings\content2%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\content\content3" 06_%W3LANG%w3strings\content3%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\content\content4" 06_%W3LANG%w3strings\content4%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\content\content5" 06_%W3LANG%w3strings\content5%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\content\content6" 06_%W3LANG%w3strings\content6%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\content\content7" 06_%W3LANG%w3strings\content7%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\content\content8" 06_%W3LANG%w3strings\content8%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\content\content9" 06_%W3LANG%w3strings\content9%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\content\content10" 06_%W3LANG%w3strings\content10%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\content\content11" 06_%W3LANG%w3strings\content11%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\content\content12" 06_%W3LANG%w3strings\content12%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\dlc\bob\content" 06_%W3LANG%w3strings\dlc_bob%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\dlc\DLC1\content" 06_%W3LANG%w3strings\dlc_DLC1%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\dlc\DLC10\content" 06_%W3LANG%w3strings\dlc_DLC10%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\dlc\DLC11\content" 06_%W3LANG%w3strings\dlc_DLC11%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\dlc\DLC12\content" 06_%W3LANG%w3strings\dlc_DLC12%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\dlc\DLC13\content" 06_%W3LANG%w3strings\dlc_DLC13%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\dlc\DLC14\content" 06_%W3LANG%w3strings\dlc_DLC14%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\dlc\DLC15\content" 06_%W3LANG%w3strings\dlc_DLC15%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\dlc\DLC16\content" 06_%W3LANG%w3strings\dlc_DLC16%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\dlc\DLC2\content" 06_%W3LANG%w3strings\dlc_DLC2%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\dlc\DLC3\content" 06_%W3LANG%w3strings\dlc_DLC3%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\dlc\DLC4\content" 06_%W3LANG%w3strings\dlc_DLC4%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\dlc\DLC5\content" 06_%W3LANG%w3strings\dlc_DLC5%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\dlc\DLC6\content" 06_%W3LANG%w3strings\dlc_DLC6%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\dlc\DLC7\content" 06_%W3LANG%w3strings\dlc_DLC7%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\dlc\DLC8\content" 06_%W3LANG%w3strings\dlc_DLC8%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\dlc\DLC9\content" 06_%W3LANG%w3strings\dlc_DLC9%W3LANG%.w3strings.txt
w3unpack.exe -c -l %W3LANG% "%W3DIR%\dlc\EP1\content" 06_%W3LANG%w3strings\dlc_EP1%W3LANG%.w3strings.txt

  1. В папке "Voice" создать файл "07 Joint TXT" (Код ниже)
    Этот шаг объединит отдельные файлы ".txt" из папки "06_ru_w3strings" в единый файл "07_Joint_TXT_W3LANG.txt"

:: Язык локализации
set W3LANG=ru

copy "06_%W3LANG%w3strings*.txt" 07_Joint_TXT%W3LANG%.txt

15_0) Открыть полученный файл "07_Joint_TXT_W3LANG.txt" (у меня это "07_Joint_TXT_ru.txt") в "Notepad++"
15_1) Открыть окно "Пометки" сочетанием клавиш "Ctrl+M", поставить галочку "Помечать закладкой" и в поле "Найти" вставить "voicetag =" - нажать "Пометить все"
15_2) В поле "Найти" вставить "dialogLine =" - нажать "Пометить все"
15_3) Нажать сверху вкладку "Поиск" -> "Закладки" -> "Удалить все строки Без закладки" -> "Ждать (Это долго и программа может зависнуть - главное её не трогать, чтобы не закрылась)"

16_0) После ожидания будет текст в формате:
voicetag = "BARON BANDIT STRONG 01",
dialogLine = 0x0007d9a9, -- "И снова, сука, льет."
voicetag = "BARON BANDIT STRONG 01",
dialogLine = 0x0007d9ab, -- "Говорят, барон взбесился, снова хочет за насильничанье виселицей наказывать."
voicetag = "BARON BANDIT STRONG 01",
dialogLine = 0x0007d9bf, -- "А вот как наши хотели с девками в деревне развлечься, так против них мужичье вышло."

16_1) Открыть окно "Замена" сочетанием клавиш "Ctrl+H", поставить галочку "Регулярные выражения" и в поле "Найти" вставить "^ " (с пробелом), аполе "Заменить" оставить пустым -

  • нажать "Заменить все" -> Получится следующие (Уберутся пробелы вначале строк)
    voicetag = "BARON BANDIT STRONG 01",
    dialogLine = 0x0007d9a9, -- "И снова, сука, льет."
    voicetag = "BARON BANDIT STRONG 01",
    dialogLine = 0x0007d9ab, -- "Говорят, барон взбесился, снова хочет за насильничанье виселицей наказывать."
    voicetag = "BARON BANDIT STRONG 01",
    dialogLine = 0x0007d9bf, -- "А вот как наши хотели с девками в деревне развлечься, так против них мужичье вышло."

16_2) В поле "Найти" вставить "\r\ndialogLine", а в поле "Заменить" вставить "dialogLine" - нажать "Заменить все" -> Получится следующие
voicetag = "BARON BANDIT STRONG 01",dialogLine = 0x0007d9a9, -- "И снова, сука, льет."
voicetag = "BARON BANDIT STRONG 01",dialogLine = 0x0007d9ab, -- "Говорят, барон взбесился, снова хочет за насильничанье виселицей наказывать."
voicetag = "BARON BANDIT STRONG 01",dialogLine = 0x0007d9bf, -- "А вот как наши хотели с девками в деревне развлечься, так против них мужичье вышло."

16_3) Поставить галочку "Обычный" и в поле "Найти" вставить (voicetag = ") без скобок, а поле "Заменить" оставить пустым - нажать "Заменить все"
16_4) В поле "Найти" вставить (",dialogLine = ) без скобок, а в поле "Заменить" вставить "_" - нажать "Заменить все"
16_5) В поле "Найти" вставить (, -- ) без скобок, а в поле "Заменить" вставить ".ogg|" (Если аудио в формате ".ogg") или вставить ".wav|" (Если аудио в формате ".wav") - нажать "Заменить все"
16_6) Сохраняем временный файл с любым название (у меня это "01_Main.txt) из этого файла будут браться имена конечных аудио файлов -> Получится следующие
BARON BANDIT STRONG 01_0x0007d9a9.ogg|"И снова, сука, льет."
BARON BANDIT STRONG 01_0x0007d9ab.ogg|"Говорят, барон взбесился, снова хочет за насильничанье виселицей наказывать."
BARON BANDIT STRONG 01_0x0007d9bf.ogg|"А вот как наши хотели с девками в деревне развлечься, так против них мужичье вышло."

16_7) Возвращаемся на несколько шагов назад до состояния:
BARON BANDIT STRONG 01",dialogLine = 0x0007d9a9, -- "И снова, сука, льет."
BARON BANDIT STRONG 01",dialogLine = 0x0007d9ab, -- "Говорят, барон взбесился, снова хочет за насильничанье виселицей наказывать."
BARON BANDIT STRONG 01",dialogLine = 0x0007d9bf, -- "А вот как наши хотели с девками в деревне развлечься, так против них мужичье вышло."

16_8) В поле "Найти" вставить (, -- ) без скобок, а в поле "Заменить" вставить ".wav.ogg|" (Если аудио в формате ".ogg") или вставить ".wav.ogg.wav|" (Если аудио в формате ".wav") - нажать "Заменить все"
16_9) В поле "Найти" вставить (",dialogLine = ) без скобок, а в поле "Заменить" вставить "|" (Это будущий разделитель для таблицы) - нажать "Заменить все" и сохраняем
с любым названием (у меня это "02_Temp.txt) из этого файла будут браться имена извлечённых аудио файлов -> Получится следующие
BARON BANDIT STRONG 01|0x0007d9a9.wav.ogg|"И снова, сука, льет."
BARON BANDIT STRONG 01|0x0007d9ab.wav.ogg|"Говорят, барон взбесился, снова хочет за насильничанье виселицей наказывать."
BARON BANDIT STRONG 01|0x0007d9bf.wav.ogg|"А вот как наши хотели с девками в деревне развлечься, так против них мужичье вышло."

17_0) Скачиваем "Advanced Renamer" - https://www.advancedrenamer.com/ (У меня версия Portable)
17_1) Запускаем "Advanced Renamer" и перекидываем аудио файлы из папки "02_ru_ogg или 03_ru_wav" в окно программы
17_2) В окне "Advanced Renamer" выделяем все файлы -> Правый щелчком мыши открываем окно -> Сохранить список -> В CSV файл -> Указываем путь и названия для сохранения
(у меня это "03_Table.csv" и файлы другие для наглядности) -> Получится следующие
0x0002a7e2.wav.ogg;0x0002a7e2.wav.ogg;C:\Users\Root\Desktop\Voice\02_ru_ogg;ОК
0x0004a82b.wav.ogg;0x0004a82b.wav.ogg;C:\Users\Root\Desktop\Voice\02_ru_ogg;ОК
0x0004a82d.wav.ogg;0x0004a82d.wav.ogg;C:\Users\Root\Desktop\Voice\02_ru_ogg;ОК

17_3) Открыть "Microsoft Excel" -> Создать "Пустая книга" -> Перейти во вкладку "Данные" -> Нажать "Из текстового/CSV-файла" и выбрать "01_Main.txt" -> Указать кодировку "65001 UTF-8" и разделитель "|" -> Нажать "Загрузить"
17_4) Перейти во вкладку "Данные" -> Нажать "Из текстового/CSV-файла" и выбрать "02_Temp.txt" -> Указать кодировку "65001 UTF-8" и разделитель "|" -> Нажать "Загрузить"
17_5) Просто открыть "03_Table.csv" через "Excel"
17_6) Скопировать названия файлов "Column2" (Столбец "B") из "02_Temp" в столбец "A" файла "Запускаем "Advanced Renamer"" -> Получится следующие
0x0007d9a9.wav.ogg 0x0002a7e2.wav.ogg C:\Users\Root\Desktop\Voice\02_ru_ogg\ ОК
0x0007d9ab.wav.ogg 0x0004a82b.wav.ogg C:\Users\Root\Desktop\Voice\02_ru_ogg\ ОК
0x0007d9bf.wav.ogg 0x0004a82d.wav.ogg C:\Users\Root\Desktop\Voice\02_ru_ogg\ ОК

17_7) Скопировать названия файлов "Column1" (Столбец "A") из "01_Main" в столбец "B" файла "03_Table.csv" -> Сохранить -> Получится следующие
0x0007d9a9.wav.ogg BARON BANDIT STRONG 01_0x0007d9a9.ogg C:\Users\Root\Desktop\Voice\02_ru_ogg\ ОК
0x0007d9ab.wav.ogg BARON BANDIT STRONG 01_0x0007d9ab.ogg C:\Users\Root\Desktop\Voice\02_ru_ogg\ ОК
0x0007d9bf.wav.ogg BARON BANDIT STRONG 01_0x0007d9bf.ogg C:\Users\Root\Desktop\Voice\02_ru_ogg\ ОК

17_8) Запускаем "Advanced Renamer" и нажимаем "Импорт из CSV" -> Имя файла "03_Table.csv" -> Папка исходных файлов "C:\Users\Root\Desktop\Voice\02_ru_ogg" -> Разделитель ";" -> Кодировка "ANSI" -> Импорт
17_9) Нажимаем "Пакетный запуск" -> Готово

В итоге будет:

  • Таблица "01_Main.txt" с текстом и названиями аудио файлов с кодом говорящего (например "Geralt")
  • Удобно названные аудио файлы по котором можно понять кто именно говорит фразу и легко разделить для дальнейшего создания "Набора данных"

@Rootreck Я сделала датасет на основе вашего и выложила на HuggingFace: https://huggingface.co/datasets/korovsky/witchspeech. Огромное вам спасибо за проделанную работу!

@korovsky Спасибо.
Сейчас я делаю таблицу с сопоставленными данными. Как только проставлю основных персонажей, загружу сюда полный набор данных (63+ тысячи аудиофайлов и таблица Excel). Таблицу буду периодически обновлять, загружая дополненную версию, а старую буду удалять.

Вид таблицы будет примерно такой:
08_3_Mix_ru.xlsx - Excel 06.03.2025 10_37_19.png

Sign up or log in to comment