Исправление русской озвучки Half-Life 2 и Эпизодов

Half-Life 2 собрала более 35 наград в номинации 'Игра года' и разошлась тиражом более 4 млн экземпляров.
Сообщение
Автор
Аватара пользователя
Vit_amiN
Супермодератор
Супермодератор
Сообщения: 2509
Зарегистрирован: 01.02.2007
Откуда: Over Old Hills
Благодарил (а): 15 раз
Поблагодарили: 91 раз

#16 Сообщение 25.07.2015, 20:08

wowks
wowks » 25 июл 2015, 19:23 писал(а):Он нужен потому что я пока точно не знаю брать ли мне длину звука из текста фонемы или реальную длину звука. Они, эти длины, отличаются и может быть так и должно быть и тут есть какая-то закономерность. Мне действительно куда проще самому высчитывать длину звука из заголовка аудио, чем лишний лезть за ней в текст фонемы или править ком строку в батнике.
Ещё раз. В ASCII-данных записана фонетическая длина (продолжительность речи). Продолжительность .WAV >= продолжительность речи. Временные метки лицевых анимаций, что логично, привязаны к временной шкале аудиоданных, т.о., они нормируются по новой продолжительности .WAV, и только так.
wowks » 25 июл 2015, 19:23 писал(а):ты имеешь в виду только саму фонему с её маленьким заголовком?
Нет. Я имею в виду результирующий .WAV со вшитой фонемой.
wowks » 25 июл 2015, 19:23 писал(а): к тому же вопрос в целесообразности пакетной обработки.
Пакетная проверка будет хороша хотя бы тем, что можно задать порог срабатывания "с этой фразой что-то не так" - либо по относительной шкале (например, фраза длиннее на 21% при пороге в 20%), либо по абсолютной (аналогично, фраза длиннее на 2,6 секунды при пороге в 2,5). А уж проверять речь в игре, нужно ли её исправлять - дело десятое. Ложные срабатывания - это не страшно, плохо если наоборот.
Изображение

Мои русификаторы и другие полезные файлы здесь
ЗАПОМНИТЕ, ПОИСК — БЛИЖАЙШИЙ ПУТЬ К ИСТИНЕ!

Аватара пользователя
wowks
Майор
Майор
Сообщения: 525
Зарегистрирован: 09.12.2008
Благодарил (а): 67 раз
Поблагодарили: 37 раз

#17 Сообщение 26.07.2015, 11:47

Vit_amiN
Vit_amiN » Сб июл 25, 2015 6:08 pm писал(а):Ещё раз. В ASCII-данных записана фонетическая длина (продолжительность речи)
всё, теперь понял.
SonySoundForge не добавляет тишину при растяжении или сжатии. Для этого есть отдельный инструмент "Insert Silience"
но если я допустим указываю сжать с 10.000 до 7.000 то могу получить 6.950 или 7.020, но это не проблема и видимо так и должно быть

значит можно делать так: высчитывать процент длины речи по отношению к длине самого аудио. Допустим длина речи короче длины аудио на 5%
отнимать эти 5% от длины уже укороченного аудио и на основе полученного времени ретаймить текст фонемы.

но как быть с таким? Вот текст фонемы для английской версии gman_mono02.wav
Скрытый текст
VERSION 1.0
PLAINTEXT
{
I realize this moment may not be the most convenient for a heart to heart.
}
WORDS
{
WORD I 0.480 0.640
{
593 ay 0.480 0.591 1
105 iy 0.591 0.655 1
}
WORD realize 0.640 1.408
{
633 r 0.655 0.800 1
105 iy 0.800 0.895 1
652 ah 0.895 0.951 1
108 l 0.951 1.056 1
593 ay 1.056 1.208 1
105 iy 1.208 1.311 1
122 z 1.311 1.408 1
}
WORD this 1.408 1.776
{
240 dh 1.408 1.488 1
618 ih 1.488 1.568 1
115 s 1.568 1.776 1
}
WORD moment 1.776 2.496
{
109 m 1.776 1.888 1
111 ow 1.888 2.048 1
109 m 2.048 2.128 1
601 ax 2.128 2.228 1
110 n 2.228 2.336 1
116 t 2.336 2.496 1
}
WORD may 2.496 2.656
{
109 m 2.496 2.544 1
101 ey 2.544 2.656 1
}
WORD not 2.656 2.992
{
110 n 2.656 2.736 1
593 aa 2.736 2.880 1
116 t 2.880 2.992 1
}
WORD be 2.992 3.120
{
98 b 2.992 3.008 1
105 iy 3.008 3.120 1
}
WORD the 3.120 3.216
{
240 dh 3.120 3.200 1
652 ah 3.200 3.216 1
}
WORD most 3.216 3.968
{
109 m 3.216 3.344 1
111 ow 3.344 3.488 1
115 s 3.488 4.047 1
}
WORD convenient 4.288 4.976
{
107 k 4.260 4.320 1
601 ax 4.320 4.368 1
110 n 4.368 4.444 1
118 v 4.444 4.512 1
105 iy 4.512 4.615 1
110 n 4.615 4.692 1
106 y 4.692 4.744 1
601 ax 4.744 4.813 1
110 n 4.813 4.896 1
116 t 4.896 4.976 1
}
WORD for 4.976 5.264
{
102 f 4.976 5.100 1
596 ao 5.100 5.172 1
633 r 5.172 5.233 1
}
WORD a 5.264 5.312
{
652 ah 5.233 5.312 1
}
WORD heart 5.312 5.744
{
104 hh 5.312 5.415 1
593 aa 5.415 5.520 1
633 r 5.520 5.584 1
116 t 5.584 5.744 1
}
WORD to 5.888 6.000
{
116 t 5.888 5.920 1
117 uw 5.920 6.000 1
}
WORD heart 6.000 6.448
{
104 hh 6.000 6.080 1
593 aa 6.080 6.240 1
633 r 6.240 6.300 1
116 t 6.300 6.448 1
603 eh 6.715 6.748 1
}
}
EMPHASIS
{
}
OPTIONS
{
voice_duck 1
}
в "WORD I 0.480 0.640" 0.480 соответствует началу первой фонемы этого слова, а 0.640 уже нет.
в "WORD realize 0.640 1.408" тоже не соответствие
а в "WORD this 1.408 1.776" полное соответствие

программа в стадии глубокой доработки (хочу парсить текст фонемы в сложную структуру для простоты дальнейшего её изменения. избавился от команды -r и добавляю команду -o), поэтому хотелось бы учесть сразу все нюансы и сделать всё зашибись :)
и есть пара минусов
если в текущей версии программы попытаться растянуть с 9.000 до 10.000, то ей не хватит памяти, тк под новую фонему выделяется столько же памяти как и под старую.
она не умеет исправлять время в таких словах "WORD realize 0.640 1.408"

Аватара пользователя
Vit_amiN
Супермодератор
Супермодератор
Сообщения: 2509
Зарегистрирован: 01.02.2007
Откуда: Over Old Hills
Благодарил (а): 15 раз
Поблагодарили: 91 раз

#18 Сообщение 26.07.2015, 15:24

wowks » 26 июл 2015, 11:47 писал(а):значит можно делать так: высчитывать процент длины речи по отношению к длине самого аудио. Допустим длина речи короче длины аудио на 5%. отнимать эти 5% от длины уже укороченного аудио и на основе полученного времени ретаймить текст фонемы.
Зачем? 5% до и после - относительные. 5% от 10 секунд и 5% от 8-ми, например, - одинаковые абсолютные значения? :crazy: Ну поделишь ты 95% старого времени на 95% нового, неужто получишь другое значение, чем поделив 100% на 100%?
wowks » 26 июл 2015, 11:47 писал(а): в "WORD I 0.480 0.640" 0.480 соответствует началу первой фонемы этого слова, а 0.640 уже нет.
в "WORD realize 0.640 1.408" тоже не соответствие
а в "WORD this 1.408 1.776" полное соответствие
Не заморачивайся. Это пики максимума анимации, используемые при линейной интерполяции положения костей между соседними фонемами. Просто пересчитывай их, используя полученный коэффициент, - ты масштабируешь звук равномерно по всей продолжительности, так что метки тоже изменяются линейно, растянувшись/сжавшись в указанное число раз.
Изображение

Мои русификаторы и другие полезные файлы здесь
ЗАПОМНИТЕ, ПОИСК — БЛИЖАЙШИЙ ПУТЬ К ИСТИНЕ!

Аватара пользователя
wowks
Майор
Майор
Сообщения: 525
Зарегистрирован: 09.12.2008
Благодарил (а): 67 раз
Поблагодарили: 37 раз

#19 Сообщение 27.07.2015, 19:52

Vit_amiN
я так понимаю секция CLOSECAPTION не используется. Её содержимое написано в TODO описании формата. Но там же написано что все секции должны быть даже если они пусты.
пока отлаживаю код, проверяю его на фонемах различных звуков и пока эту секцию не встречал

и вот ещё пример фонемы где есть значения в секции EMPHASIS
Скрытый текст
'VERSION 1.0
PLAINTEXT
{
Huh.
}
WORDS
{
WORD Huh 0.448 1.120
{
104 hh 0.484 0.636 1
652 ah 0.636 0.809 1
603 eh 1.670 1.706 1
104 hh 1.706 1.777 1
}
}
EMPHASIS
{
0.186364 0.000000
2.150000 0.000000
}
OPTIONS
{
voice_duck 1
}

и <time> <normalised value> содержат 6 знаков после запятой
1. я сделал эти 6 знаков фиксированными. Не знаю может ли попасться значение с бОльшим количеством знаков.
2. также фиксировано и обычное время где в отличии от EMPHASIS значений точность до миллисекунды, то бишь до 3-х знаков после запятой, но с этим вроде всё ясно

EMPHASIS значения (если они есть) ведь тоже нужно пересчитывать при изменении интервалов фонем?

Аватара пользователя
Vit_amiN
Супермодератор
Супермодератор
Сообщения: 2509
Зарегистрирован: 01.02.2007
Откуда: Over Old Hills
Благодарил (а): 15 раз
Поблагодарили: 91 раз

#20 Сообщение 27.07.2015, 20:25

wowks
wowks » 27 июл 2015, 19:52 писал(а):я так понимаю секция CLOSECAPTION не используется. Её содержимое написано в TODO описании формата. Но там же написано что все секции должны быть даже если они пусты.
пока отлаживаю код, проверяю его на фонемах различных звуков и пока эту секцию не встречал
Эта секция вместе с содержимым, вероятно, ещё поддерживается движком, но поскольку она идёт вразрез с концепцией локализации ресурсов в Source, она не рекомендована к использованию. Вживую я её ни разу не видел.
wowks » 27 июл 2015, 19:52 писал(а):я сделал эти 6 знаков фиксированными. Не знаю может ли попасться значение с бОльшим количеством знаков.
Для числа с плавающей точкой одинарной точности (по стандарту IEEE 754-2008) количество значащих разрядов чуть больше 7 (≈7,225). Все разряды сверх того непредставимы и являются избыточной информацией (мусором).
wowks » 27 июл 2015, 19:52 писал(а):EMPHASIS значения (если они есть) ведь тоже нужно пересчитывать при изменении интервалов фонем?
Да, пересчёт нужен для всех временны́х значений.
Изображение

Мои русификаторы и другие полезные файлы здесь
ЗАПОМНИТЕ, ПОИСК — БЛИЖАЙШИЙ ПУТЬ К ИСТИНЕ!

Аватара пользователя
wowks
Майор
Майор
Сообщения: 525
Зарегистрирован: 09.12.2008
Благодарил (а): 67 раз
Поблагодарили: 37 раз

#21 Сообщение 28.07.2015, 17:34

Vit_amiN
ну всё, наваял новую версию программы (это уже 3-я версия по счёту)
взял за основу описание формата из твоей ссылки https://developer.valvesoftware.com/wik ... ata_format
в кратце о коде
1. загрузка куска с фонемой в структуру типа RAW_PHONEME функцией LoadRawPhoneme(...) из wav файла:

Код: Выделить всё

typedef struct {
    char		VDAT[4]; // "VDAT"
    uint32_t 	size; // длина текста
} VDATCHUNK;

typedef struct {
    VDATCHUNK   vdat_chunk;
    char *      text;
} RAW_PHONEME;
2. RAW_PHONEME переводится посредством RawPhonemeToPhoneme(...) вот в такую удобную структуру PHONEME:

Код: Выделить всё

typedef struct {
    uint16_t     id;
    char         name[8];
    double       start_time;
    double       end_time;
    char         _1;
} PHONEME_ENTRY;

typedef struct {
    char *       text;
    double       start_time;
    double       end_time;

    uint32_t     num_phonemes;
    PHONEME_ENTRY * phoneme;
} WORD_ENTRY;

typedef struct {
    double       time;
    double       normalised_value;
} EMPHASIS_ENTRY;



typedef struct {
    VDATCHUNK vdat_chunk;

    char * version;

    struct {
        char * text;
    } PLAINTEXT;

    struct {
        uint32_t num_words;
        WORD_ENTRY * word;
    } WORDS;

    struct {
        uint32_t     num_emphasis;
        EMPHASIS_ENTRY * emphasis;
    } EMPHASIS;

    // struct {
    //
    // } CLOSECAPTION; // не используется

    struct {
        char voice_duck;
    } OPTIONS;

} PHONEME;
и дальше уже с PHONEME можно делать что угодно. Например вот такой огромный код ретайминга
Скрытый текст

Код: Выделить всё

void RetimePhoneme( _in_out_ PHONEME * phoneme,
                    _in_ const double old_wave_duration, _in_ const double new_wave_duration )
{
#define ___retime(time) time = (time * new_wave_duration) / old_wave_duration;

    // WORD
    for (register size_t w = 0; w < phoneme->WORDS.num_words; w++) {
        ___retime(phoneme->WORDS.word[w].start_time);
        ___retime(phoneme->WORDS.word[w].end_time);
        // PHONEME
        for (register size_t p = 0; p < phoneme->WORDS.word[w].num_phonemes; p++) {
            ___retime(phoneme->WORDS.word[w].phoneme[p].start_time);
            ___retime(phoneme->WORDS.word[w].phoneme[p].end_time);
        }
    }

    // EMPHASIS
    for (register size_t e = 0; e < phoneme->EMPHASIS.num_emphasis; e++) {
        ___retime(phoneme->EMPHASIS.emphasis[e].time);
        // phoneme->EMPHASIS.emphasis[e].normalised_value наверное не надо трогать
    }

    return;
}


3. после всех махинаций PHONEME переводится обратно в новую RAW_PHONEME функцией RawPhonemeToPhoneme(...). Теперь память выделяется в зависимости от новой фонемы и новая может быть больше старой (например растянули с 7.000 до 20.000) или меньше или какой угодно. :)

4. новая RAW_PHONEME сохраняется в целевой файл через SaveRawPhoneme(...)

PS
также убрал ожидание нажатия ENTER по завершении работы программы (это было сделано для того чтоб вызывать программу в цикле)
и функция основного потока main() возвращает теперь 1 в случае ошибки и 0 в случае успеха (для проверки кода выхода программы в том же цикле например)
описание новых команд в шапке темы
только пока в EMPHASIS <normalised_value> не ретаймится (но это и не время, как я понимаю), тк не знаю нужно ли

Аватара пользователя
Vit_amiN
Супермодератор
Супермодератор
Сообщения: 2509
Зарегистрирован: 01.02.2007
Откуда: Over Old Hills
Благодарил (а): 15 раз
Поблагодарили: 91 раз

#22 Сообщение 28.07.2015, 22:16

wowks
wowks » 28 июл 2015, 17:34 писал(а):в EMPHASIS <normalised_value> не ретаймится (но это и не время, как я понимаю)
Согласно описанию, это безразмерный коэффициент, пересчитывать его не нужно.
Изображение

Мои русификаторы и другие полезные файлы здесь
ЗАПОМНИТЕ, ПОИСК — БЛИЖАЙШИЙ ПУТЬ К ИСТИНЕ!

Аватара пользователя
wowks
Майор
Майор
Сообщения: 525
Зарегистрирован: 09.12.2008
Благодарил (а): 67 раз
Поблагодарили: 37 раз

#23 Сообщение 28.07.2015, 23:07

Vit_amiN
Vit_amiN &raquo; Вт июл 28, 2015 8:16 pm писал(а): это безразмерный коэффициент, пересчитывать его не нужно.
отлично. ну всё, теперь можно начинать править звук!

Аватара пользователя
wowks
Майор
Майор
Сообщения: 525
Зарегистрирован: 09.12.2008
Благодарил (а): 67 раз
Поблагодарили: 37 раз

#24 Сообщение 11.08.2015, 04:31

11.08.2015
- исправлена вся озвучка Half-Life 2 Episode Two. Версия - 1.0

описание внутри архива с исправлением.
ссылка на архив в шапке

weinstreizeR
Эксперты no-Steam
Эксперты no-Steam
Сообщения: 2105
Зарегистрирован: 30.08.2011
Благодарил (а): 32 раза
Поблагодарили: 760 раз
Контактная информация:

#25 Сообщение 11.08.2015, 05:46

wowks
Полезно. Решил с «конца» начать, так сказать? HL2, HL2:EP1 и HL2:LC будут? :-)

Аватара пользователя
wowks
Майор
Майор
Сообщения: 525
Зарегистрирован: 09.12.2008
Благодарил (а): 67 раз
Поблагодарили: 37 раз

#26 Сообщение 11.08.2015, 13:42

weinstreizeR
weinstreizeR &raquo; Вт авг 11, 2015 3:46 am писал(а):Решил с «конца» начать, так сказать?
да, с самого сложного. :)
weinstreizeR &raquo; Вт авг 11, 2015 3:46 am писал(а):HL2, HL2:EP1 и HL2:LC будут?
сам надеюсь, но когда не знаю
ещё думаю про Portal. Если помнишь там сначала тоже была такая проблема, но потом Бука исправила, и как мне помнится они там ускорили невписывающиеся фразы. В Портал (не проверял) кажется нет фонем за ненадобностью. Думаю взять старую озвучку Портал и проанализировать на предмет того, можно ли её исправить лучше.

У кого-нибудь есть самая старая озвучка Портал прямиком с диска Orange Box?

Аватара пользователя
Vit_amiN
Супермодератор
Супермодератор
Сообщения: 2509
Зарегистрирован: 01.02.2007
Откуда: Over Old Hills
Благодарил (а): 15 раз
Поблагодарили: 91 раз

#27 Сообщение 11.08.2015, 15:38

wowks
С Portal Бука сделала проще - там растянута продолжительность сцен (.vcd). WAV-файлы там не менялись, вроде как.
Изображение

Мои русификаторы и другие полезные файлы здесь
ЗАПОМНИТЕ, ПОИСК — БЛИЖАЙШИЙ ПУТЬ К ИСТИНЕ!

Аватара пользователя
AHTOHOB
Лейтенант
Лейтенант
Сообщения: 131
Зарегистрирован: 05.10.2009
Благодарил (а): 3 раза
Контактная информация:

#28 Сообщение 17.08.2015, 16:34

wowks

А субтитры редактировались в соответствии с вырезанными участками, или вы только звуковые файлы правили?
Изображение

Аватара пользователя
wowks
Майор
Майор
Сообщения: 525
Зарегистрирован: 09.12.2008
Благодарил (а): 67 раз
Поблагодарили: 37 раз

#29 Сообщение 17.08.2015, 22:41

AHTOHOB, спасибо за вопрос. Я как раз хотел прояснить ситуацию с субтитрами.
нет субтитры пока что не правились тк озвучка в приоритете. С субтитрами есть одна проблема, возникшая в некоторых местах в результате исправления.
Я поясню на примере диалога Аликс и повстанца по прибытии в Белую Рощу:
повстанец (reb_silo_youwereclose.wav) :
"Мы так и поняли, что это вы, когда Пес встрепенулся и помчался куда-то." (англ. "We had a feeling you were close when we saw Dog take off like that.")
на что Аликс отвечает (al_silo_neversoglad01.wav):
"А я была рада ему, как никогда в жизни." (англ. "I was never so glad to see him, believe me.")
здесь 2 ошибки - 1) кривой перевод с отсебятиной в обеих фразах; 2) Аликс отвечает не дав ему закончить тк фраза повстанца слишком длинная.
У меня не получилось вырезать лишнее слово "встрепенулся", тк меняется интонация, а если ускорить фразу то это звучит жутко. Поэтому пришлось расширить фонему <sil> (тишина)
в начале фразы Аликс, и добавить столько же тишины в начале аудио длиной около 1 сек.
Но субтитры, как писал Vit_amiN выше, показываются в зависимости от продолжительности самого аудио а не от фонемы и это теперь выглядит жутко когда появляется фраза в субтитрах а через какое-то время уже начинает звучать.
Мне трудно представить, что кто-то играет с русской озвучкой и со включёнными русскими субтитрами
Учитывая всё это рекомендуемые варианты комбинаций озвучки и субтитров таковы:
1. русская озвучка
2. английская озвучка
3. английская озвучка + русские субтитры
тк англ. озвучка не исправлялась, то и субтитры будут всплывать в такт.
AHTOHOB &raquo; Пн авг 17, 2015 2:34 pm писал(а):редактировались в соответствии с вырезанными участками
Их, вырезаний, и добавлений крупных пауз (мелкие есть но не заметны) мало - можно по пальцам пересчитать и поправить местами субтитры тоже не проблема, НО,
учитывая корявый перевод самой озвучки (уж какая есть) и отсебятину, лучше всего править все субтитры в соответствии с английской озвучкой, забыв про русский перевод от Буки. Таким макаром будет достигнуто максимальное качество перевода.
Исправления же как правило касаются наложений и обрываний, а исправить отсебятину и неточный перевод в озвучке можно только полной переозвучкой.

Исправление субтитров дело не хитрое и нужны лишь, на мой взгляд, базовые знания английского языка. Поэтому это дело я оставил на самый конец, когда озвучка будет исправлена так, что не к чему будет придраться.

Аватара пользователя
Vit_amiN
Супермодератор
Супермодератор
Сообщения: 2509
Зарегистрирован: 01.02.2007
Откуда: Over Old Hills
Благодарил (а): 15 раз
Поблагодарили: 91 раз

#30 Сообщение 22.08.2015, 15:00

wowks
Кстати, не заменяй оригинальные .VPK локализации, запакуй в новые .VPK только изменённые файлы и положи в папку <moddir>\custom (где <moddir> – это hl2, episodic, ep2 и т.д.). Содержимое этой папки подключается автоматически и имеет приоритет выше, чем у оригинальных файлов. Тогда валидация/обновление файлов игры никак не повлияет на исправление озвучки, да и размер исправления будет ощутимо меньше. Единственное требование – на вкладке «Язык» в свойствах игры должен быть выбран «Русский» (чтобы не получилось мешанины из русских и, например, английских фраз).
P.S. И файл ReadMe гораздо лучше делать в формате RTF.
Изображение

Мои русификаторы и другие полезные файлы здесь
ЗАПОМНИТЕ, ПОИСК — БЛИЖАЙШИЙ ПУТЬ К ИСТИНЕ!

Ответить