Sincronización labial

¿Qué dices?

Píxeles + Movimiento + Sonido = Vida

Hacerlo más realista

Hay varios personajes que van a hablar, y ahora mismo solo ves un bocadillo de texto. Ya tenía la opción de usar audio, pero todavía no quedaba bonito. Cuando alguien habla, la boca tiene que moverse, así que investigué cómo lo hacen en los dibujos animados.

Resumiendo, con al menos 6 a 9 imágenes distintas de la boca puedes hacer que parezca que habla de verdad. Hay varios programas que convierten el audio en la imagen que hay que mostrar.

Entrada de audio > programa > salida [ABBFGG].

Después, en el juego se muestra un fotograma distinto de la cabeza para cada letra.

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

Hay varios programas que hacen esto, pero yo elegí el programa gratuito 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")