One language setting; localized in-memory speech per language
This commit is contained in:
@@ -25,7 +25,7 @@ from .pack import Pack
|
||||
from .paths import catalog_dir, package_data, user_dir
|
||||
from .wad import Wad
|
||||
|
||||
FIELDS = ["archive", "target", "name", "aliases", "group", "category", "bank", "character",
|
||||
FIELDS = ["archive", "target", "name", "aliases", "group", "category", "bank", "language", "character",
|
||||
"characters_inferred", "seconds", "rate", "channels", "size", "sha1", "notes"]
|
||||
SCAN_VERSION = 2
|
||||
|
||||
@@ -39,6 +39,7 @@ class Sound:
|
||||
group: str = "Unknown"
|
||||
category: str = "Unknown"
|
||||
bank: str = "" # BANK sounds: the soundbank holding it (name); WAD sounds: ''
|
||||
language: str = "" # BANK sounds: language of a localized speech line ('' = any language)
|
||||
character: str = "" # verified speaker(s), '; '-separated (curated catalog)
|
||||
characters_inferred: str = "" # characters/roles mentioned by the name (hint)
|
||||
seconds: float = 0.0
|
||||
@@ -98,7 +99,8 @@ def read_csv(path):
|
||||
for r in csv.DictReader(open(path, encoding="utf-8", newline="")):
|
||||
out.append(Sound(archive=r["archive"], target=r["target"], name=r["name"],
|
||||
aliases=tuple(a for a in r["aliases"].split("|") if a), group=r["group"],
|
||||
category=r["category"], bank=r.get("bank") or "", character=r["character"],
|
||||
category=r["category"], bank=r.get("bank") or "", language=r.get("language") or "",
|
||||
character=r["character"],
|
||||
characters_inferred=r["characters_inferred"], seconds=float(r["seconds"] or 0),
|
||||
rate=int(r["rate"] or 0), channels=int(r["channels"] or 0), size=int(r["size"] or 0),
|
||||
sha1=r["sha1"], notes=r["notes"]))
|
||||
@@ -216,7 +218,7 @@ def bank_sounds(sc, characters=None):
|
||||
name, bank = names[m]
|
||||
rate, ch, secs = _hdr(e["head"])
|
||||
s = Sound(banks.ARCHIVE, "%08X" % m, name, ("%s/%08X" % (bank, m),), bank=bank,
|
||||
seconds=secs, rate=rate, channels=ch,
|
||||
language=banks.media_language(sc, m), seconds=secs, rate=rate, channels=ch,
|
||||
size=min(l.size for l in sc.locations if l.media == m) if len(e["sha1"]) > 1 else e["size"],
|
||||
sha1=next(iter(e["sha1"])) if len(e["sha1"]) == 1 else "")
|
||||
s.group, s.category = classify.classify(name, bank=bank)
|
||||
@@ -263,18 +265,23 @@ def scan_banks(game, progress=None, characters=None, visit=None):
|
||||
|
||||
|
||||
def subtitle_links(game, sc, speech_names):
|
||||
"""{speech event name: {language: WAD sound key}}: event -> actions -> containers -> sounds -> the
|
||||
per-language media of the streamed speech line (exact, no name matching)."""
|
||||
"""{speech event name: {language: sound key}}: event -> actions -> containers -> sounds -> the
|
||||
per-language media of the line (exact, no name matching). The media is a streamed WAD sound, or an
|
||||
in-memory BANK sound of a localized bank."""
|
||||
ev = banks.event_media(sc)
|
||||
want = {m for n in speech_names for m in ev.get(n, ())}
|
||||
owners = media_owners(game, sc, want)
|
||||
owners = {m: (k.split(":")[0], k) for m, k in media_owners(game, sc, want).items()} # m -> (lang, key)
|
||||
for m in want - set(owners):
|
||||
lang = banks.media_language(sc, m) if m in sc.media else ""
|
||||
if lang:
|
||||
owners[m] = (lang, "%s:%08X" % (banks.ARCHIVE, m))
|
||||
out = {}
|
||||
for n in speech_names:
|
||||
keys = {}
|
||||
for m in ev.get(n, ()):
|
||||
k = owners.get(m)
|
||||
if k:
|
||||
keys.setdefault(k.split(":")[0], k)
|
||||
if m in owners:
|
||||
lang, key = owners[m]
|
||||
keys.setdefault(lang, key)
|
||||
if keys:
|
||||
out[n] = keys
|
||||
return out
|
||||
@@ -385,6 +392,9 @@ class Catalog:
|
||||
for l in ls:
|
||||
if l.kind == banks.PREFETCH_HEAD and l.sound:
|
||||
self.heads.setdefault(l.sound, []).append(l)
|
||||
# localized in-memory speech: only the languages loaded here (all of them if none is)
|
||||
langs = [a for a in self.archives if a in game.languages] or None
|
||||
bank_sounds_ = [s for s in bank_sounds_ if not s.language or not langs or s.language in langs]
|
||||
for a in self.archives:
|
||||
self.sounds += bank_sounds_ if a == banks.ARCHIVE else load_archive(game, a, progress)
|
||||
self.by_key = {s.key: s for s in self.sounds}
|
||||
|
||||
Reference in New Issue
Block a user