Læbesynkronisering

Hvad siger du?

Pixels + Bevægelse + Lyd = Liv

Gøre det mere realistisk

Der er nogle personer, der skal tale, og lige nu ser man kun en taleboble. Jeg kunne allerede bruge lyd, men det så ikke pænt ud endnu. Når nogen taler, skal munden bevæge sig, så jeg undersøgte, hvordan man gør i tegnefilm.

Kort fortalt kan man med mindst 6 til 9 forskellige billeder af munden få det til at se ud, som om den virkelig taler. Der findes forskellige programmer, der omsætter lyd til, hvilket billede der skal vises.

Lyd-input > program > [ABBFGG] output.

Derefter vises der i spillet et andet frame af hovedet for hvert bogstav.

    -- 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

Der er forskellige programmer, der kan det, men jeg har valgt det gratis program 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")