Logo Signal From The Stars

Lipsynchronisatie

Wat zeg je ?

Martin avatar
  • Martin
  • 2 min read
Pixels + Beweging + Sound = Leven

Realistischer maken

Er zijn een aantal personages die gaan praten en op dit moment zie je alleen een tekstballon. Nu had ik de mogelijkheid al om ook audio te gebruiken maar het zag er nog niet mooi uit. Wanneer iemand praat moet de mond bewegen, vandaar dat ik heb uitgezocht hoe ze dit nu doen bij tekenfilms.

Lang verhaal kort, met minimaal 6 tot 9 verschillende afbeeldingen van de mond kun je het laten lijken of deze echt praat. Hiervoor zijn verschillende programma’s die audio omzetten naar welke afbeelding getoond moet worden.

Audio input > programma > [ABBFGG] output.

Vervolgens zal in het spel voor iedere letter een andere frame van het hoofd getoond worden.

    -- convert csv to a lua table
    local libSyncTable = {}
    for line in csvData:gmatch("[^\r\n]+") do
        local a, b = line:match("(%S+)\t(%w)")
        local framekey
        if b == "A" then
            framekey = 1
        elseif b == "B" then
            framekey = 2
        elseif b == "C" then
            framekey = 3
        elseif b == "D" then
            framekey = 4
        elseif b == "E" then
            framekey = 5
        elseif b == "F" then
            framekey = 6
        -- elseif b == "G" then
        --     framekey = 7
        -- elseif b == "H" then
        --     framekey = 8
        -- elseif b == "X" then
        --     framekey = 9
        end
        table.insert(libSyncTable, {a, framekey})
    end

Er zijn verschillende programma’s die dit doen, maar ik heb gekozen voor het gratis programma https://github.com/DanielSWolf/rhubarb-lip-sync.

if not os.path.exists(audioPath_lsc):
    print(f"create lcs {audioPath} with text {text}")
    with open("../temp/lipsync.txt", 'w') as file:
    file.write(text)

    command = [
        "../src/lib-dev/rhubarb/rhubarb",  # Het pad naar het rhubarb-programma
        audioPath_ogg,                     # SOUND_FILE
        "--recognizer", "pocketSphinx",    # Recognizer instellen
        "--exportFormat", "tsv",           # Export formaat instellen
        "--dialogFile", f"../temp/lipsync.txt",  # TEMP_DIR voor dialogFile
        "--output", audioPath_lsc,          # OUTPUT_FILE
        "--datFrameRate", "60",            # Data frame rate
        "--extendedShapes", "ABCDEF"       # Extended shapes
    ]
    result = subprocess.run(command, check=True)
    if result.returncode != 0:
        print("error")