overlay: 大ログにトランスリテレーション(ルビ)対応を追加し描画/APIを拡張

- controller/model: transliteration_message / transliteration_translation を伝搬するよう変更し、createOverlayImage* 呼び出しの引数を更新
- overlay: createTextboxLargeLogWithRubyTokens を実装し、大ログでのトークン単位ルビ描画(フォールバックロジック、外側パディング、行間等)を追加
- overlay: 小型ログAPI/呼び出しを transliteration_* 名に合わせて修正・簡素化
- docs: overlay_ruby.md に大ログ向け仕様と使用例を追記
This commit is contained in:
misyaguziya
2025-10-23 14:41:37 +09:00
parent 66d3c09a0d
commit 0a9cb9952b
4 changed files with 305 additions and 113 deletions

View File

@@ -944,38 +944,30 @@ class Model:
self.speaker_energy_recorder.stop()
self.speaker_energy_recorder = None
def createOverlayImageSmallLog(self, message:Optional[str], your_language:Optional[str], translation:list, target_language:Optional[dict], translation_transliteration_tokens: Optional[list] = None) -> object:
def createOverlayImageSmallLog(self, message:Optional[str], your_language:Optional[str], translation:list, target_language:Optional[dict], transliteration_message:Optional[dict] = None, transliteration_translation:Optional[list] = None) -> object:
self.ensure_initialized()
# Normalize target_language dict -> list
target_language_list = []
if isinstance(target_language, dict):
target_language_list = [data["language"] for data in target_language.values() if data.get("enable") is True]
# Prepare transliteration tokens only if we have an original message string.
transliteration_tokens = []
if isinstance(message, str) and message.strip():
try:
# Always request both romaji + hiragana for ruby (per spec: romaji upper, hiragana lower)
transliteration_tokens = self.convertMessageToTransliteration(message, hiragana=True, romaji=True)
except Exception:
transliteration_tokens = []
errorLogging()
# Fetch ruby settings from config (with safe defaults if missing)
ruby_font_scale = config.OVERLAY_SMALL_LOG_SETTINGS.get("ruby_font_scale", 0.5)
ruby_line_spacing = config.OVERLAY_SMALL_LOG_SETTINGS.get("ruby_line_spacing", 4)
# 翻訳行ルビ (任意) が指定されていれば渡す。後方互換のため None / 不正型は空リストに。
if not isinstance(translation_transliteration_tokens, list):
translation_transliteration_tokens = []
if not isinstance(transliteration_message, list):
transliteration_message = []
if not isinstance(transliteration_translation, list):
transliteration_translation = [[] for _ in translation]
return self.overlay_image.createOverlayImageSmallLog(
message,
your_language,
translation,
target_language_list,
transliteration_tokens=transliteration_tokens,
translation_transliteration_tokens=translation_transliteration_tokens,
transliteration_message=transliteration_message,
transliteration_translation=transliteration_translation,
ruby_font_scale=ruby_font_scale,
ruby_line_spacing=ruby_line_spacing,
)
@@ -1031,13 +1023,13 @@ class Model:
if (self.overlay.settings[size]["ui_scaling"] != config.OVERLAY_SMALL_LOG_SETTINGS["ui_scaling"]):
self.overlay.updateUiScaling(config.OVERLAY_SMALL_LOG_SETTINGS["ui_scaling"], size)
def createOverlayImageLargeLog(self, message_type:str, message:Optional[str], your_language:Optional[str], translation:list, target_language:Optional[dict]=None):
def createOverlayImageLargeLog(self, message_type:str, message:Optional[str], your_language:Optional[str], translation:list, target_language:Optional[dict]=None, transliteration_message:Optional[list]=None, transliteration_translation:Optional[list]=None) -> object:
self.ensure_initialized()
# normalize target_language dict -> list of language strings
target_language_list = []
if isinstance(target_language, dict):
target_language_list = [data["language"] for data in target_language.values() if data.get("enable") is True]
return self.overlay_image.createOverlayImageLargeLog(message_type, message, your_language, translation, target_language_list)
return self.overlay_image.createOverlayImageLargeLog(message_type, message, your_language, translation, target_language_list, transliteration_message, transliteration_translation)
def createOverlayImageLargeMessage(self, message):
self.ensure_initialized()