Skip to content

文字送り中は領域内Busyを表示し、完了後の最終文字列だけを翻訳する #651

Description

@Freeesia

概要

領域内Busyを、対象領域が表示可能な結果を待っていることを示す状態として扱う。

今回の対応では、文字送り中を新しいBusy要因として追加する。

文字送りが始まった場合は、途中の短い文字列に対する翻訳を表示せず、領域内Busyへ切り替える。文字送りの進行が終了した後に最終文字列を決定し、その文字列だけを翻訳する。

文字送り末尾でOCR結果が揺れる場合も、文字送りBusyが継続し続けないよう、最終文字列を決定して翻訳へ進む。

目的

  • 文字送り中に途中の短い翻訳が表示され続ける問題を解消する
  • 文字送りの途中文字列ごとの翻訳要求を防ぐ
  • 文字送り中であることを領域内Busyで示す
  • 文字送り末尾で認識が揺れても最終文字列を決定する
  • 領域内Busyを将来ほかの待機理由にも利用できる状態として整理する

方針

領域内Busy

  • 領域内Busyは、対象領域が表示可能な結果を待っている状態を表す
  • 既存の翻訳待ちでは、引き続き領域内Busyを表示する
  • 文字送り中を新しいBusy要因として追加する
  • Busy状態は論理トラックごとに管理する
  • Busyを開始した理由と、現在もBusyを継続する理由を判別できる状態にする

文字送りの開始

  • 同じ論理トラックで文字列が段階的に構築されている場合、文字送り開始と判断する
  • 文字送り開始時点で、現在表示中の翻訳を非表示にする
  • 対象領域を領域内Busyへ切り替える
  • 文字送り開始前の確定文字列と翻訳は、復帰可能な状態として保持する

文字送り中

  • 文字送り中は、OCRの最新候補と進行状態を追跡する
  • 途中の文字列は翻訳対象にしない
  • 途中の文字列に対応する翻訳は表示しない
  • 領域内Busyを継続する
  • 文字列が前進するたびに、最終文字列の候補を更新する
  • 文字送り中に一時的な誤認識や後退が発生しても、直前までの進行状態を維持する

文字送りの終了

文字送りの進行が停止した場合、文字送り終了と判断する。

終了時は、次の情報を使用して最終文字列を決定する。

  • 文字送り中に到達した最も進行した候補
  • 末尾で繰り返し観測された候補
  • 直近の候補履歴
  • 既存のOCR文字列安定化による評価

同じ文字列が安定して観測された場合は、その文字列を最終文字列として採用する。

末尾のOCR結果が複数候補間で揺れる場合は、直近の候補履歴から最も妥当な候補を選択し、最終文字列として確定する。

文字送り終了の判定と、通常の文字列確定条件を分離し、末尾の認識揺れだけを理由に文字送りBusyを継続し続けない。

文字送り終了後

  • 決定した最終文字列だけを翻訳対象にする
  • 最終文字列が確定した時点で、文字送り待ちから通常の翻訳待ちへ移行する
  • 翻訳結果が得られるまでは領域内Busyを継続する
  • 最終文字列の翻訳キャッシュが存在する場合は、キャッシュを表示する
  • 翻訳結果を表示した時点で領域内Busyを終了する
  • 最終文字列を確定した後の単発のOCR揺れは、既存の文字列安定化で処理する

元の文字列へ戻った場合

文字送り中のOCR結果が、文字送り開始前の確定文字列へ戻った場合は、文字送りを取り消す。

  • 文字送りBusyを終了する
  • 保持していた以前の翻訳を再表示する
  • 通常の安定状態へ戻す

想定動作

正常に安定する文字送り

OCR観測:    H → He → Hel → Hello → Hello
表示:       翻訳 → Busy → Busy → Busy → Busy → 翻訳
翻訳要求:   H                              Hello

末尾で認識が揺れる文字送り

OCR観測:    H → He → Hel → Hello → Hell0 → Hello → Hell0
状態:       確定 → 文字送り中 ─────────────→ 終了判定
表示:       翻訳 → Busy ──────────────────→ 翻訳待ち → 翻訳
最終文字列:                                  Hello
翻訳要求:   H                                Hello

HelloHell0が揺れても、直近の候補履歴から最終文字列を決定し、翻訳へ進む。

元の文字列へ戻る場合

OCR観測:    Menu → Menu... → Menu
表示:       翻訳 → Busy    → 翻訳

文字送り開始前の文字列へ戻った場合は、保持していた翻訳を再表示する。

通常の文字列変更

OCR観測:    Menu → Game → Game
確定文字列: Menu → Menu → Game
表示:       翻訳 → 翻訳 → 翻訳待ち → 翻訳

文字送りに該当しない文字列変更は、既存の文字列安定化処理で扱う。

受け入れ条件

  • 領域内Busyが、待機理由を持つ論理トラック単位の状態として扱われる
  • 既存の翻訳待ちで領域内Busyが表示される
  • 文字送り開始時に、現在の翻訳表示が領域内Busyへ切り替わる
  • 文字送り中の途中文字列が翻訳されない
  • 文字送り中の途中文字列に対応する翻訳が表示されない
  • 文字送り中に到達した候補と直近の候補履歴が保持される
  • 文字送りの進行が停止した時点で終了判定が行われる
  • 末尾のOCR結果が揺れていても最終文字列が決定される
  • 文字送り末尾の認識揺れが継続しても翻訳処理へ移行する
  • 文字送り終了後は、決定した最終文字列だけが翻訳される
  • 最終文字列の翻訳結果が得られるまでは通常の翻訳待ちBusyが継続する
  • 最終文字列のキャッシュが存在する場合はキャッシュが表示される
  • 翻訳結果の表示時に領域内Busyが終了する
  • 文字送り開始前の確定文字列へ戻った場合は以前の翻訳が再表示される
  • 一部の領域が文字送り中でも、ほかの領域の表示と翻訳が継続する
  • 文字送り完了後の認識揺れは既存の文字列安定化で抑制される
  • 通常の文字列変更は既存の確定処理で更新される
  • 領域内Busyへ将来別の待機理由を追加できる

完了条件

文字送り開始時に対象領域がBusy表示となり、途中文字列を翻訳せず、文字送り終了時に最終文字列を決定して翻訳へ進むこと。

文字送り末尾でOCR結果が揺れる場合も、最終文字列を選択して翻訳処理へ移行できること。

領域内Busyが、翻訳待ちと文字送り待ちを区別しながら、論理トラック単位で管理されていること。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions