Đồng bộ khẩu hình

Bạn nói gì cơ?

Điểm ảnh + Chuyển động + Âm thanh = Sự sống

Làm cho chân thực hơn

Có một số nhân vật sẽ nói chuyện, và hiện tại bạn chỉ thấy một bong bóng thoại. Tôi đã có thể dùng âm thanh rồi, nhưng trông vẫn chưa đẹp. Khi ai đó nói, miệng phải cử động, vì vậy tôi đã tìm hiểu cách người ta làm trong phim hoạt hình.

Nói ngắn gọn, chỉ cần ít nhất 6 đến 9 hình miệng khác nhau là bạn đã có thể làm như nhân vật thật sự đang nói. Có nhiều chương trình chuyển âm thanh thành hình nào cần hiển thị.

Âm thanh đầu vào > chương trình > đầu ra [ABBFGG].

Sau đó trong trò chơi, mỗi chữ cái sẽ hiển thị một khung hình đầu khác nhau.

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

Có nhiều chương trình làm được việc này, nhưng tôi đã chọn chương trình miễn phí 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")