Sincronização labial
O que você disse?

Deixando mais realista
Há alguns personagens que vão falar, e por enquanto você só vê um balão de fala. Eu já tinha a opção de usar áudio, mas ainda não ficava bonito. Quando alguém fala, a boca tem que se mexer, por isso pesquisei como isso é feito nos desenhos animados.
Resumindo, com pelo menos 6 a 9 imagens diferentes da boca dá para fazer parecer que ela está falando de verdade. Existem vários programas que convertem o áudio na imagem que deve ser mostrada.
Entrada de áudio > programa > saída [ABBFGG].
Depois, no jogo, é mostrado um frame diferente da cabeça 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
Há vários programas que fazem isso, mas escolhi o 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")