Наша новая игра 8 сентября в раннем доступе на steam



Озвучивание событий в 3ds Max с помощью SoX

Обновление (02.08.2014): выложил скрипт, который анимирует досочки паркета и добавляет звук. Скачать этот скрипт можно отсюда.

Это продолжение статьи о генерации звуков в 3ds Max.

Создаём командный файл для SoX.

Чтобы создать командный файл DOS для SoX достаточно создать новый текстовый файл создатель-бздыньков.txt (НЕ word-файл), а потом переименовать его в создатель-бздыньков.bat. Теперь его можно открыть виндовым блокнотом Notepad (хотя я пользуюсь бесплатным, но отличным Notepad++ с подсветкой синтаксиса и другими рюшечками) и начать редактировать, создавая строчки кода.

создатель-бздыньков.bat:

sox бздыньк.wav промежуточный-бздыньк.wav pad %1s
sox -m -v 0.2 промежуточный-бздыньк.wav -v 1 результат.wav промежуточный-результат.wav
del результат.wav
ren промежуточный-результат.wav результат.wav

Итак, полагаем, что у вас уже есть файл результат.wav (это может быть как просто звук тишины, так и какой-то трек для музыкального фона вашей анимации). Также у вас уже есть звук бздыньк.wav, который вы хотите замиксовать с музычкой в фоне, скажем, на второй секунде (что эквивалентно 88200 семплам, при частоте дискретизации звука 44100 Гц). Чтобы это сделать достаточно выполнить в командной строке такую команду:

создатель-бздыньков 88200

Расшифровываю, что значит каждая строчка в командном файле:

  1. создаётся временная копия звука бздыньк с добавлением тишины в начале. Длина тишины определяется переменной %1, которая представляет собой первый параметр, который находится в командной строке (в примере выше - это 88200);
  2. получаем микс из двух файлов промежуточный-бздыньк.wav и результат.wav и этот микс записывается в промежуточный-результат.wav. Параметр -v перед каждым исходным файлом определяет их громкость в результирующем миксе;
  3. удаляется старый результат.wav;
  4. промежуточный-результат.wav переименовывается в результат.wav.

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

Более того, можно вставить множество бздыньков в разных местах музычки, запустив командный файл столько раз, сколько нужно:

создатель-бздыньков 5600
создатель-бздыньков 88200
создатель-бздыньков 254000

А этот запуск в свою очередь также может быть автоматизирован созданием еще одного командного файла с этими строчками внутри.

Взаимодействие с 3ds Max.

Наиболее простой метод взаимодействия 3ds Max с SoX - это через MAXScript.

Если вы совсем незнакомы с работой скриптов внутри 3ds Max, то ничего страшного. Сначала ознакомьтесь со статьёй, где я доступно рассказываю о написании скриптов в 3ds Max и можете смело продолжать чтение этого урока.

В моём примере с досточками, я просто написал скрипт, который в хаотическом порядке выбирает паркетинку из заданного мной выделения и переворачивает её. Как результат я знаю точное время, когда этот переворот случился и точную координату досочки, которая в данный момент времени переворачивается.

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

...
stroka = "echo call dobavka_zvuka " + (((myFrameNumber) * (44100/24)) as string) + " >> D:\desktop\fail_zvukov.bat"
DOSCommand stroka
...

Досочка падает на пол в момент времени myFrameNumber. Множитель 44100/24 определяет сколько семплов содержится в одном кадре анимации при скорости 24 кадра в секунду.

После выполнения первой строчки кода, переменная stroka будет содержать такое значение "echo call dobavka_zvuka 42000 >> D:\desktop\fail_zvukov.bat".

Команда as string сказала Максу, что результат умножения нужно превратить в текст (она преобразовала число в текст).

Вторая строчка кода запускает выполнение команды, содержащейся внутри переменной stroka. Т.е. команда echo говорит Максу "Напечатай текст call dobavka_zvuka 42000 в текстовый файл D:\desktop\fail_zvukov.bat".

Теперь, каждый раз, когда Макс анимирует досочку, он прибавляет в мой fail_zvukov.bat (который будет создан в папке D:\desktop\) новую строчку кода. После того, как вся анимация досочек, покрывающих пол, готова, я имею на выходе fail_zvukov.bat, который содержит такой список команд:

call dobavka_zvuka 2310
call dobavka_zvuka 9600
call dobavka_zvuka 42000
call dobavka_zvuka 67500
call dobavka_zvuka 74320
call dobavka_zvuka 83250
...

Всё что теперь осталось - это создать финальный микс, просто запустив командный файл fail_zvukov.bat. Каждая строчка кода в этом файле будет вставлять нужный звук в нужное место на аудио дорожке, чтобы соответствовать анимации. Результат будет такой, как показан на втором видео в первой части статьи. Я его для удобства продублирую тут еще раз:

Добавляем реализма.

В примере выше звук получился абсолютно неживым, монотонным и неприятным слуху. Чтобы добавить реализма, я дописал в скрипт несколько дополнительных строчек кода, которые формируют такой код:

call dobavka_zvuka 16533 0.636172 0.730065 0.869443 185 129
call dobavka_zvuka 18370 0.991783 0.726184 0.835618 173 129
call dobavka_zvuka 20207 1.04784 0.714123 0.793614 161 129
call dobavka_zvuka 22044 0.82246 0.720484 0.856228 181 127
call dobavka_zvuka 23881 1.30767 0.713917 0.819717 169 127
call dobavka_zvuka 25718 0.959634 0.70992 0.842029 177 124
call dobavka_zvuka 27555 1.32945 0.701057 0.803222 165 124
...

Расшифрую каждое значение по очереди

  1. время вывода звука;
  2. число выбранное наугад из диапазона 0.6 - 1.4, которое нужно мне для вариации звучания удара досточки об пол;
  3. громкость звука в правом канале (это и следующее число учитывает также удалённость планочки от камеры, т.е. чем дальше от камеры, тем тише звук);
  4. громкость звука в левом канале (чем дальше звук от камеры в левую сторону, тем громче он в левом канале и тише в правом);
  5. задержка звука в правом канале (в реальной жизни, если звук идёт справа, то он попадает в левое ухо с некоторой задержкой относительного правого уха; именно для этого я ввёл эту и следующую задержи);
  6. задержка звука в левом канале.

Командный файл dobavka_zvuka теперь будет немного сложнее, чем в примере выше создатель-бздыньков.bat:

rem Модифицируем скорость звука, чтобы он звучал немножко не так как другие:
sox zvuk.wav temp-zvuk-speed.wav speed %2

rem Изменяем громкость левого и правого канала и добавляем нужное количество тишины перед звуком из предыдущего шага:
sox temp-zvuk-speed.wav temp-zvuk.wav pad %1s remix 1v%4 2v%3

rem Добавляем задержку для левого канала:
sox temp-zvuk.wav leftcomp.wav remix 1v1 1v0 pad %6s

rem Добавляем задержку для правого канала:
sox temp-zvuk.wav rightcomp.wav remix 2v0 2v1 pad %5s

rem Объединяем правый и левый каналы в один файл newoutput.wav и миксуем его с output.wav:
sox -m -v 1 output.wav -v 0.5 leftcomp.wav -v 0.5 rightcomp.wav newoutput.wav

rem Удаляем старый output.wav и переименовываем newoutput.wav в output.wav:
del output.wav
ren newoutput.wav output.wav

Вот и всё!

Обалденная экономия времени! Реалистичный звук, да еще и генерируется автоматически!

Это, конечно же, не все возможности. Можно озвучивать, к примеру, падение осколков вокруг камеры, выводя звуковой эффект на 6 каналов (звук 5.1). Можно привязывать разные звуки к разным объектам, а потом создавать motion graphics сразу с озвучкой. И так далее.

Более того, такое взаимодействие возможно не только между SoX и 3ds Max, но также можно использовать любой другой 3D пакет, который умеет выводить информацию в текстовый файл.



Подпишитесь на обновление блога (вот 3 причины для этого).
Введите ваш e-mail:


Будут вопросы, спрашивайте в комментариях - объясню :).




Вам понравилась статья? Хотите отблагодарить автора? Расскажите о ней друзьям.
Или подпишитесь на обновление блога по E-Mail.

Введите ваш e-mail (используется только для отправления обновлений блога):

комментариев 8 к статье “Озвучивание событий в 3ds Max с помощью SoX, часть 2”

  1. Спасибо, классный урок! Давно искал способ автоматического озвучивания как в FoleyStudio от BoomerLabs. А можно поподробнее о коде скрипта? Какой код писать чтобы генерировались параметры для добавления реализма (громкость, задержка)?
    И еще вопрос, можно таким способом реализовать, например, перемещающуюся по сцене музыку, т.е. один длинный звуковой трек?

    • Перемещающуюся по сцене музыку реализовать можно, но, как по мне, то это быстрее можно сделать в обычном звуковом редакторе. Нужно просто указанные промежутки трека (между ключевыми точками, которые связаны с анимацией в 3ds Max) приглушать в одном канале и/или увеличивать громкость другого канала.

    • По-поводу того какой скрипт писать, чтобы генерировались параметры для изменения громкости, задержки. Это просто зависимость расстояния источника звука от камеры.

      Я делал так. Брал координаты самого дальнего объекта от камеры и назначал ему самую тихую громкость (какая мне нужна). Потом брал самый близкий источник звука и назначал этой координате самую большую громкость. А все объекты, расстояние от которых до камеры было между этими экстремальными значениями, озвучивал пропорционально.

  2. А если камера движется в сторону самой дальней точки? тогда получается же, что звук от дальней точке всё равно будет тихим как бы близко мы к ней небыли?

    • Расстояние до камеры определяется в каждом кадре. Поэтому такой проблемы не будет.

  3. Спасибо за статью!
    Если кому то будет интересно, попробовал сделать на основе данной статьи озвучивание столкновений между частицами mParticles в Particle Flow:
    https://www.dropbox.com/s/ir4x6c2h6bc2m8o/mParticles%20collision%20sounds.7z?dl=0
    Просто распаковать папку Render в корень диска С, открыть файл «mParticles collision sounds.max», отрендерить анимацию. Потом открыть Particle View, включить оператор «mP Collision», включить и выключить оператор Del old collision File (если нужно удалить старую версию), нажать на Play Animation и подождать пока ползунок не достигнет конца анимации, нажать на Go to Start и выключить оператор «mP Collision». Тоже самое сделать с «mP InterCollision».
    В папке c:\Render\SoX\ запустить файл !!!RUN.bat, после завершения процесса в этой же папке появиться готовый микс «!mix.wav» который можно наложить на анимацию.
    Особо не тестировал, могут быть глюки..

    • О, спасибо! А есть где на результат посмотреть? (может видео на youtube?)

      • Видео на YouTube: http://youtu.be/kJ_5EjZ6Lhc
        Раскрасил в разные цвета при столкновениях, для наглядности.
        Заметил баг: если открыть файл и запустить симуляцию два раза подряд, то вторая симуляция и последующие будут отличаться от первой. Возможно еще в каких то случаях физика может начать просчитываться по другому, так что с этим надо быть осторожней, иначе звуки могут не совпасть с анимацией.

Извините, в данный момент комметарии закрыты.

© 2008 - 2018 3dyuriki.com
Для связи со мной 3dyuriki@gmail.com