# 共有画像ビューア 再構築キット これは「共有画像ビューア」(Muse環境内の対話型ページとして動く画像・PDFビューア)を、受け取った側のMuse環境内で再構築するための共有用ファイルです。 ## 使い方 1. このファイル全体を、自分のMuseに渡してください(チャットに内容を渡す、またはファイルとして参照させる)。 2. Museに「このキットの仕様書に従って、共有画像ビューアを再構築してください」と依頼してください。再構築は対話型ページ(Webアーティファクト)として行い、送信・回答・読み上げの経路まで含めて仕様書の受け入れ条件を満たす形にします。 3. 再構築できたら、ビューアを開き、送信先にしたいチャットで、このファイル末尾の「付録: セットアップ用プロンプト」をそのチャットへ貼ってください。そのチャットのIDが分かり、回答待ちとIrodori読み上げ生成待ちの検知(hook)、参照送信の受け側手順、期限切れデータ削除の定期ジョブの設定が行われます。 4. 返ってきたチャットIDを、ビューアの設定(案内ダイアログまたは設定ダイアログ)のチャットID欄に設定してください。 ## 注意 - 完成したページそのものは配布単位ではありません。コピーは所有者ごとに分離し、送信・応答・設定は各所有者のMuse側のものが適用されます。他の所有者のMuseへ送信が届くことはありません。 - Irodori読み上げを使う場合、音声生成の実行系(ユーザーのPC上のIrodori-TTS等)は所有者側の環境に合わせたものになります。 - workspace一時アップロード(仕様書FR-4.9〜FR-4.15、FR-6.5a)を使う場合、アップロード先の基準フォルダ(`~/workspace/viewer-books/`)と、保持期限(約3日・72時間)を過ぎた冊を削除する定期ジョブは、所有者側のMuse環境で用意します。依頼文は末尾のセットアップ用プロンプトに含めています。 - 本キットに含める仕様書は現行版(v0.21)の要件部分のみです。版別の変更サマリー、検証記録(第13章)、変更履歴(付録B)は、共有には不要なため除去しています。 --- # 共有画像ビューア仕様書 | 項目 | 内容 | |---|---| | 版 | v0.21 | | 形式 | Markdown(変更を入れやすいよう、PDFではなく本ファイルで管理する) | | 状態 | 要望受付中。第12章のQ番号で変更を指定できる | | 接続先 | Muse(Claudeではありません) | ## 本書の読み方 - 要件には番号を付けています。変更は「FR-5.1の上限を800%に」のように番号で指定してください。 - 未決事項はすべて第12章の要望受付リスト(Q-1〜Q-18)に集約しています。各項目に仮置き値を置いてあるため、未回答でも初版の動作は決まります。 - 仮置き値は決定事項ではありません。Q番号への回答が優先されます。 ## 1. 概要・目的 ### 1.1 目的 本ビューアの名称は「共有画像ビューア」とします。画像とPDFをWebページ上で閲覧するビューアを提供します。閲覧中に「今のページについて聞く」操作を行うと、表示中のページがMuseへ送られ、翻訳やコメントを受け取れます。接続先はClaudeではなくMuseです。 ### 1.2 方式の要点 - **FR-1.1 半同期方式:** 同期は常時行いません。「今のページについて聞く」を実行した時点で、表示中の1ページだけを送信します。 - **FR-1.2 非自動同期(原則):** 既定では、ページ送りや拡大・縮小だけでは何も送信しません。完全な自動同期は本仕様の対象外です。例外はFR-6.12の「ページ送りごとに聞く」を有効にした場合のみで、その場合も送信対象は移動後の表示中1ページだけです。 - **FR-1.3 閲覧の継続:** 送信後も閲覧は止めません。応答を待つ間もページ送りや拡大・縮小ができます。 - **FR-1.4 前提:** 本ビューアは単体で完結する製品ではなく、Museと組み合わせて使う前提で設計します。 ### 1.3 対象外(初版) - 表示中ページの常時自動追跡・常時自動送信(「ページ送りごとに聞く」FR-6.12は、ユーザーが明示的にオンにした場合の例外として対象内) - 見開き2ページ分を超える複数ページの一括送信(見開き時は2ページを合わせて1枚として送信します。Q-4決定、FR-6.2a) - PDFの見開き表示(見開きはPDF以外が対象です。Q-3決定、FR-5.10) - 注釈の保存(ファイルパスのローカル保存は対象内です。Q-11決定、第9章) - フォルダのドラッグ&ドロップ(v0.17で対象外。フォルダを開く方法はフォルダボタンからの読み込みのみとします。FR-4.5) ## 2. 用語・前提 ### 2.1 用語 | 用語 | 定義 | |---|---| | ページ | 画像1点、またはPDFの1ページ。表示と送信の最小単位 | | 表示中ページ | 現在画面に表示されているページ。送信対象は常にこれ | | 半同期 | ユーザーの明示操作のときだけ、その時点のページを送る方式 | | 用途プリセット | 翻訳、コメント・解説など、送信時に選ぶ依頼の型 | | 見開き | 隣接する2ページを並べて1画面に表示する状態。PDF以外が対象(FR-5.10)。送信時は2ページを合わせて1枚として扱います(FR-6.2a) | | 送信先チャット | ページの送信先となるMuse側のチャット。チャットIDで指定する(表示名は使わない。FR-6.10a)。既定はビューアを開いている/紐付いたチャット。冊ごとに専用サイドチャットへ変更できる。ビューア内には送信先が設定済みかどうかとチャットIDを常時表示する。回答の生成と投稿は、この送信先チャット側が行う(FR-6.10) | | 応答(回答) | 送信に対してMuseから返る翻訳・コメント等のテキスト。行き先は送信先チャットへの投稿を正とし、ビューア側の記録内には返しません。ビューア内には本文を表示しません(FR-6.10) | | 読み上げ | 表示中ページの文章を、Muse側のIrodori-TTSで音声化すること。読み上げリクエストを記録し、送信先チャット側のhook検知を経て生成し、音声ファイルを送信先チャットへ投稿して受け渡す(FR-6.18)。PDFの抽出テキストだけでなく、画像内文章もMuse側の文字起こしを経て対象とする。ふりがなは本文と区別する(FR-6.14、FR-6.14a) | | しおり | 冊とページ位置の組。ローカルに保存し、次回起動時の復元ダイアログに使います(FR-9.4〜FR-9.5) | | フローティングボタン | 中央ペイン上に常駐する円形等のボタン。「Museへ送る」と「読み上げる」の2個だけを置きます(FR-7.6) | ### 2.2 前提 - 利用環境はPCブラウザのみとします(Q-8決定)。完成品の提供形態は「Muse環境内の対話型ページ」経由(非公開)とします。単体のローカルHTMLファイルや外部公開Webページは提供形態として採りません。詳細と配布単位はNFR-10.5〜NFR-10.6に定めます。 - ファイルの内容そのものはビューア側に恒常保存しません。保存するのはファイルパスと設定値のみで、ユーザーのローカル内に限ります(FR-9.4)。 - 応答の生成そのものはMuse側の責務であり、本書では送信内容と応答の扱いだけを規定します。 - 読み上げの音声生成もMuse側の責務です。Muse側にIrodori-TTSの設定が必要です(FR-6.15)。本ユーザーの環境では、生成時にユーザーのPCが起動していてMuseから接続できることが前提です(FR-6.18)。PCに接続できない場合は生成を行わず、ステータスに理由を残します(第11章)。 ## 3. 全体構成 ### 3.1 構成 | 層 | 役割 | |---|---| | 表示層 | ファイル読み込み、ページ表示、拡大・縮小、ページ送り | | 連携層 | 「今のページについて聞く」の送信前確認、送信、再送 | | 応答層 | 回答は、送信先チャット側のMuseが生成し、その送信先チャットへ投稿する(生成と投稿の両方を送信先チャット側の責務とし、投稿を正としてビューア側の記録内へは返さない)。ビューアを開いているチャットが送信先と異なる場合、そのチャットが代理で回答を生成してはいけない。生成・投稿の主たるきっかけは、送信先チャット側に置く1分間隔の定期チェック(cron)であり、ユーザーの発言は不要である。ユーザーが送信先チャットで発言した場合は、その時点でも即時に処理してよい(補助)。即時プッシュではなく、遅延の目安は最大でチェック間隔(1分)+生成時間である(FR-6.10f、Q-16)。ビューア側では送信ステータス(送信済み/チャット回答待ち/チャット回答済み)の表示だけを持ち、記録にはチャット投稿済みかどうかを持たせる | | 読み上げ層 | 「読み上げる」で読み上げリクエスト(対象ページ、読み上げテキスト、キャプション、送信先チャットID)を記録し、ステータスを「Irodori生成待ち」とする。送信先チャット側のhookが生成待ちを検知し、そのチャット側のMuseがユーザーのPC上のIrodori-TTS(PyTorch)で音声を生成して、音声ファイルを送信先チャットへ投稿する。ビューア側は生成待ち/生成中/チャットへ送信済み/生成失敗のステータス表示だけを持ち、音声の即時再生は行わない(FR-6.18) | ### 3.2 データの流れ 1. ユーザーがファイルを開き、ページを表示する(表示層)。 2. ユーザーがフローティングボタン「Museへ送る」またはCtrl+Spaceで「今のページについて聞く」を実行する(連携層)。用途プリセットは設定ダイアログで事前に選択したもの(複数選択可、FR-6.3)を使います。基本画面には大きな送信ボックスは置きません(FR-7.6)。 3. 連携層が表示中ページの画像と抽出テキスト、付随情報を組み立てます。設定で送信前確認がオンの場合のみ、送信前確認を出します(FR-6.7)。 4. 確認がオンの場合はユーザーが確認すると送信し、キャンセルした場合は何も送りません。確認がオフの場合はそのまま送信します。送信先は、既定ではビューアを開いている/紐付いたチャットであり、冊ごとの設定がある場合のみ、設定したチャットIDのサイドチャットです(FR-6.10a)。ビューア内には送信先チャットID(未設定の場合は未設定である旨)が常時表示されます。ビューア側には送信ステータスとリクエスト記録(リクエストID、送信時刻、ページ位置、プリセット、送信先チャットID)が残り、あわせて「回答は送信先チャットに返る」旨の案内を表示します(FR-6.10、FR-6.10b)。 5. 読み上げの流れ: ユーザーがフローティングボタン「読み上げる」を押すと、読み上げダイアログ(FR-6.17)でキャプションを確認し、表示中ページの読み上げリクエストを記録します(ステータス「Irodori生成待ち」。詳細はFR-6.18)。送信先チャット側のhookが生成待ちを検知すると、そのチャット側のMuseが読み上げテキスト(PDFは抽出テキスト、画像ページは文字起こし結果。ふりがなはFR-6.14aの区別を保持)を確定し、ユーザーのPC上のIrodori-TTS(PyTorch)で生成します。長文は音声約30秒を目安に分割して生成し、無音区間を挟んで結合します。生成が終わると音声ファイルを送信先チャットへ投稿し、記録のステータスを「チャットへ送信済み」に更新します。ビューア内では音声を再生しません。 6. 回答は即時にはチャットに現れません。主方式は、送信先チャット側に置いた1分間隔の定期チェック(cron)です。定期チェックはFR-6.10hの統合取得(1回だけ、全文付き)でリクエスト記録を確認し、回答待ちリクエストがあれば、送信先チャット側のMuseが再取得せずにそのチャットの文脈(役割・会話履歴)で回答を生成し、送信先チャットへ投稿します(送信時点のページが分かる形でページ位置を明記)。hook(5秒間隔)で検知する場合も、確認は同じ統合取得1回とします。回答待ちがなければ、定期チェックは何も投稿せず無言で終了します。遅延の目安は、最大でチェック間隔(1分)+生成時間です。ユーザーが送信先チャットで発言した場合は、その発言を補助的なきっかけとして、その時点でも未処理リクエストを即時に処理してよいものとしますが、発言は必須ではありません。回答の生成はビューアを開いているチャットではなく送信先チャット側が行います。ビューアを開いているチャットと送信先チャットが異なる場合、開いている側のチャットが代理で生成・投稿してはいけません。投稿と同時に送信先チャット側のMuseは記録の「チャット投稿済み」を真に更新し、ビューア側の表示は「チャット回答済み」になります(FR-6.10b、FR-6.10f、Q-16)。ビューア側では回答本文は表示しません。その間にユーザーがページを移動していても、回答は送信時点のページのものとして送信先チャット側で扱います。 ## 4. 対応コンテンツ ### 4.1 対応形式 - **FR-4.1 画像:** PNG、JPG、JPEG、WebP、GIFに対応します。JPGとJPEGは同じJPEG形式であり、拡張子 `.jpg` のファイルと拡張子 `.jpeg` のファイルの両方を対応対象とします(v0.15で明示)。拡張子の判定は大文字・小文字を区別しません(`.JPG`、`.JPEG`、`.Jpg` 等も含みます)。MIMEタイプは `image/jpeg` をJPEG形式として扱います。ファイル選択ダイアログの選択可能拡張子、ファイルのドラッグ&ドロップの取り込み判定、フォルダボタンからの読み込み時の再帰走査(FR-4.5)の対象判定のいずれでも、`.jpg` を除外してはいけません。 - **FR-4.2 PDF:** テキスト埋め込みの有無を問わず表示します。テキストが抽出できないページは画像のみで扱います(第6章)。 ### 4.2 読み込み - **FR-4.3 開く方法(ファイルのドラッグ&ドロップは必須要件、フォルダドロップは対象外):** ファイルについては、ファイル選択ダイアログと、画面へのドラッグ&ドロップの両方に対応します。ファイルのドラッグ&ドロップは任意機能や付加機能ではなく、初版の受け入れ必須要件です(付録A)。フォルダについては、フォルダボタンからの読み込みのみに対応し、フォルダのドラッグ&ドロップには対応しません(v0.17、FR-4.5)。次の実装・検証要件をすべて満たすこととします。 - 専用ドロップ領域: ビューア内に明確なドロップ領域(中央ペイン全体、または明示されたドロップゾーン)を設け、その領域に対する `dragover`/`dragenter`/`dragleave`/`drop` の処理を実装します。ドロップ領域外で離した場合の扱いも、無反応ではなく分かる表示とします - ドラッグ中のハイライト: ファイルをドラッグして領域上にある間、領域の枠・背景色等でハイライトし、ドロップ可能であることを視覚的に示します。ハイライトがない状態を完成とみなしません - ブラウザ既定動作の抑止: ウィンドウ全体で `dragover` と `drop` の既定動作を抑止し、ブラウザがファイルそのものを開いてビューアから離脱する事態を防ぎます - ファイルのみを処理する: `DataTransfer` の処理では、通常のファイル(`DataTransfer.files`/`File`)だけを取り込みます。フォルダエントリの走査はドロップ経路では行いません - フォルダがドロップされた場合: 取り込まず、ビューアをクラッシュさせずに現在の表示を維持し、「フォルダはフォルダボタンから開いてください」という趣旨をFR-7.9のトースト通知で表示します。フォルダドロップへの対応を理由に、再帰走査や一括読み込みをドロップ側に実装してはいけません - ドロップ処理のリバート(v0.18で追加): ドロップ側の処理は、フォルダドロップでクラッシュが発生していなかった時点(フォルダドロップの取り込み改修を入れる前の状態)まで戻します。その状態のドロップ処理は、`DataTransfer.files` から得られる通常のファイルだけを対象とし、フォルダの中身は列挙しません。改修後にドロップ側へ追加した、ファイルシステムハンドル経由の再帰走査、`webkitGetAsEntry` 等によるフォルダエントリの走査、フォルダの件数・合計サイズの集計といった列挙処理は、ドロップ経路に残してはいけません。フォルダボタン経由の再帰走査(FR-4.5)は本リバートの対象外であり、変更しません - ドロップ直後の即時フィードバック: ドロップ直後に、読み込み中であること、取り込んだ件数/除外した件数、または失敗した旨を即時に表示します。ドロップしても何も起きない(フィードバックがない)状態は不具合として扱います - 0件時のエラー表示: ドロップされた内容から対応ファイルが0件取得できた場合は、無反応で終わらせず、「対応ファイルが取得できませんでした」等の理由を含むエラー表示を出します。表示はFR-7.9のトースト通知によります - 検証要件: 実機相当の環境で、単一ファイル、複数ファイルの2パターンのドロップをそれぞれ実際に確認してから受け入れます。フォルダについては、フォルダボタンから開けることと、フォルダをドロップしてもクラッシュせず案内トーストが出て現在の表示が維持されることを確認します。ファイル選択ダイアログで開けることをもって、ドラッグ&ドロップの代替確認とはしません - **FR-4.4 複数画像:** 複数の画像を同時に開いた場合は、ファイル名順に並べた1冊として扱い、ページ送りの対象にします。ファイル選択ダイアログ経由でもドラッグ&ドロップ経由でも、同じ扱いとします。 - **FR-4.5 フォルダの読み込み(フォルダボタンのみ。v0.17で改定、v0.18でリバートを明記):** フォルダは、ツールバーのフォルダボタンから開く方法でのみ読み込みます。フォルダのドラッグ&ドロップには対応しません。フォルダボタンで選択されたフォルダは、サブフォルダも含め配下を再帰的に走査し、対応形式のファイルだけを取り込みます。フォルダボタン経由の取り込み処理(並べ替え・形式判定・上限・冊の構築)は、ファイル選択・ファイルドロップと共通の後段処理を通します。フォルダがドロップされた場合の扱いはFR-4.3(取り込まず、現在の表示を維持し、フォルダボタンへの案内をトースト表示)によります。v0.18のリバートはドロップ経路の列挙処理だけを対象とし、本項のフォルダボタン経由の読み込み(JPG合計106MBのフォルダが正常に開けることを実機で確認済み)は変更しません。 - **FR-4.6 フォルダ取り込み時の並び順:** フォルダパス(サブフォルダ階層)→ファイル名の順で並べ、1冊としてページ送りの対象にします。同名ファイルが複数サブフォルダにある場合は、サブフォルダ名で区別して表示します。 - **FR-4.7 フォルダ取り込み時の除外:** 非対応形式のファイルは取り込まず、取り込み後に「対象外として除外した件数」を表示します。空フォルダや対応ファイルが0件の場合は、その旨を表示して開きません(表示はFR-7.9のトースト通知によります)。 - **FR-4.8 非対応形式:** 対応形式以外は開かず、理由を表示します(第11章)。案内する対応形式の一覧にはJPGを明記します(例: PNG / JPG / JPEG / WebP / GIF / PDF)。拡張子 `.jpg` のファイルを「非対応形式」として扱ってはいけません。 ### 4.3 workspace一時アップロード(v0.20で新規、Q-17決定) - **FR-4.9 自動アップロード:** ファイル取り込み(ファイル選択、ファイルのドラッグ&ドロップ、フォルダボタン経由のフォルダ読み込みのいずれでも、冊の構築が完了した時点)で、取り込んだ冊の各ファイルを、Museのworkspace内の基準フォルダ `~/workspace/viewer-books/` 配下へ自動でアップロードを開始します。アップロードは冊の表示や閲覧操作を妨げません。ページ送りや拡大・縮小では追加の送信は行いません(本項のアップロードは取り込み時に限ります)。 - **FR-4.10 原本のまま保存:** アップロードするバイト列は原本そのものとします。解像度の縮小、再圧縮、形式変換は行いません。そのため、保存ファイルのsizeは、ビューアが取り込んだ `File` のsizeと一致します(v0.21でSHA-256による突合は廃止しました。Q-18)。画像の冊は各画像ファイルを、PDFの冊はPDFファイル全体をアップロードします(PDFのページ参照はファイル全体+ページ番号によります。FR-6.5a)。 - **FR-4.11 転送方式:** 転送はファイル単位で順次行い、各ファイル内はチャンクに分割して送ります。1回のリクエストに冊全体やファイル全体を詰めてはいけません。クライアントはファイルごとに `{相対パス, size}` のmanifestを作ります。sizeは `File` のメタデータから得るものとし、ハッシュ算出のためにファイルを読み直しません(v0.21、Q-18)。サーバー側は基準フォルダ配下への書き込みに限定し(相対パスの `..` や絶対パスによる基準外書き込みは許可しません)、一時ファイルへ書き込んで完了時に確定します。サーバー側でもsizeを実測し、クライアント値と一致した場合のみ確定し、receipt(`{相対パス, size}`)を返します。不一致の場合は確定せず失敗として扱います。 - **FR-4.12 進捗とキャンセル:** アップロード中は進捗(対象ファイル数/完了ファイル数、またはバイト割合)をステータス表示で確認できるようにします。アップロードはユーザーがいつでもキャンセルできます。キャンセルした場合は転送を止め、サーバー側の未確定データ(一時ファイルおよびその冊の未完了分)を残しません。キャンセルした冊はアップロード未完了として扱い、FR-6.5aの参照送信の対象にしません。キャンセル操作の表示位置は固定し、進捗表示の有無で他のコントロールの位置がずれないようにします。 - **FR-4.13 保持期限と削除:** アップロードした冊の保持期限は、アップロード完了から約3日(72時間)とします。manifestにはアップロード完了時刻と期限を保持します。期限を経過した冊のデータ(保存ファイルとmanifest)は削除します。削除はMuse側の定期ジョブ(1日1回)が期限切れの冊を対象に行い、ビューア側は期限切れのreceiptを参照送信に使ってはいけません。削除後にその冊を参照送信する必要がある場合は、再取り込みによる再アップロードを要します(従来の画像送信へのフォールバックでも可。FR-6.5a)。 - **FR-4.14 アップロード状態の区別:** 冊ごとに、アップロード中/アップロード済み(receiptあり・期限内)/キャンセル済み/失敗/期限切れ、を区別して保持し、ステータス表示で確認できるようにします。失敗した場合は理由を記録し、再取り込みで再試行できます。アップロードの失敗やキャンセルは、冊の表示・閲覧自体には影響しません。 - **FR-4.15 対象外:** zip等の圧縮ファイルそのものはアップロード対象にしません(クライアントに解凍機能はありません)。対象は取り込み済みの対応形式ファイル(FR-4.1、FR-4.2)の実体のみです。 ## 5. 表示機能 ### 5.1 拡大・縮小 - **FR-5.1 倍率範囲(決定):** 25%〜400%とします(Q-2決定)。 - **FR-5.2 操作:** ボタン、キーボード、マウスホイール(修飾キー併用)で変更できます。 - **FR-5.3 フィット表示と初期表示(決定):** 「ページ全体を表示」と「幅に合わせる」を用意します。ファイルを開いたときの初期表示は100%とします(Q-1決定)。 - **FR-5.4 倍率の保持:** ページを移動しても倍率は保持します。フィット表示を選んでいる場合は、新しいページにも同じフィットを適用します。 ### 5.2 ページ送り - **FR-5.5 前後移動:** 前ページ/次ページボタンとキーボードで移動します(第8章)。 - **FR-5.6 直接移動:** ページ番号を入力して任意のページへ移動できます。 - **FR-5.7 サムネイル:** 右ペイン(ページ一覧、FR-7.1)のサムネイル一覧から任意のページへ移動できます。 - **FR-5.8 端の扱い:** 先頭ページで「前へ」、最終ページで「次へ」を押しても移動せず、その旨が分かる表示にします。ループはしません。 - **FR-5.9 現在位置:** 「現在ページ/総ページ数」を常時表示します。見開き時は「現在ページ〜次ページ/総ページ数」の形で表示します。 ### 5.3 見開き表示(Q-3決定) - **FR-5.10 対象:** 見開き表示に対応します。対象はPDF以外のページ(画像)で、最大2ページまでを並べて表示します。PDFは単ページ表示のみとします。 - **FR-5.11 切り替え:** 単ページ表示と見開き表示をツールバーで切り替えられます。見開き時は現在ページと次のページを並べ、最終ページで次ページがない場合は1ページだけを表示します。 - **FR-5.12 見開き時のページ送り:** 見開き時のページ送りは2ページ単位で進めます。ページ番号入力とサムネイルからの移動では、指定ページを左側(先頭)として見開きを表示します。 - **FR-5.13 見開き時の拡大・縮小:** 倍率とフィット表示は見開き全体(2ページ分)に対して適用します。 ## 6. 「今のページについて聞く」 本章が中心機能です。 ### 6.1 実行方法 - **FR-6.1 実行:** フローティングボタン「Museへ送る」(FR-7.6)、またはキーボードショートカットCtrl+Space(Q-9決定、第8章)で実行します。どちらも同じ動作とします。 - **FR-6.2 対象:** 送信対象は実行時点の表示中ページ1ページのみです。前後のページは送りません。 - **FR-6.2a 見開き時の対象(Q-4決定):** 見開き表示中は、表示中の2ページを合わせて1枚として送信します。この場合も送信は1回分として扱い、見開き以外の複数ページ一括送信は行いません。送信前確認と応答の対応付けも、見開き2ページを1単位として行います。 ### 6.2 用途プリセット - **FR-6.3 プリセット(複数選択可):** 用途プリセットは設定ダイアログ(FR-7.3)で複数選択します。翻訳、コメント・解説、要約の中から1つ以上を同時に選べます(例: 翻訳と要約を一度に実行する)。選択状態は保持し、フローティングボタン/Ctrl+Spaceでの送信は、選択中の全プリセットを対象に実行します。複数選択時でも送信・リクエスト記録・キューは1件にまとめます(FR-6.3a)。プリセット選択UIは基本画面には常駐させません。 - 翻訳 - コメント・解説 - 要約 - **FR-6.3a 複数プリセットは1回のキューでまとめて処理する(v0.16で改定):** プリセットを複数選択している場合でも、1回の「Museへ送る」(フローティングボタン/Ctrl+Space、FR-6.1)で作るリクエスト記録とキュー(回答待ち)は1件だけとします。プリセットごとにリクエスト記録を作ったり、キューをプリセットの数だけ送ったりしてはいけません。 - 1件の中身: その1件のリクエスト記録に、選択中の全プリセット(例: 翻訳とコメント・解説の2件)を全件保持します。あわせてページ画像、ページ位置、質問文、送信先チャットIDもその1件にまとめます(FR-6.5) - キュー信号: 1回の送信でキュー信号の回答待ち件数は1件だけ増えます。プリセットが2件でも回答待ちは2件になりません。hook/定期チェック(FR-6.10f、FR-6.10h)も、その1件を1件として検知・取得します - 処理と結果: 送信先チャット側は、その1件の中で全プリセット分の指示をまとめて処理します。結果はプリセット別に区分して送信先チャット内に表示します(FR-6.9、FR-6.10)。回答の投稿と記録の「チャット投稿済み」への更新も、その1件について1回だけ行います - 「ページ送りごとに聞く」(FR-6.12)で自動送信する場合も同じです。ページ送り1回につきキューは1件だけとし、プリセット数で増やしません - **FR-6.4 質問文:** どのプリセットの組み合わせでも、設定ダイアログで自由記述の質問文を追加できます。質問文のみ(プリセット未選択)で送信する場合は「自由入力」として扱います。 - **FR-6.4a 翻訳の表示形式(Q-7改定):** 翻訳プリセットの結果は、送信先チャット内にテキストで表示します。ビューア内には表示しません。ページへの重ね表示も行いません。 ### 6.3 送信内容 - **FR-6.5 送るもの:** - 表示中ページの画像(見開き時は2ページを合わせた1枚。FR-6.2a) - ページから抽出したテキスト(抽出できる場合のみ) - ファイル名 - ページ位置(現在ページ/総ページ数。見開き時は2ページ分) - 選んだ用途プリセット(複数選択の場合は全件)と質問文 - 送信先チャットの指定(チャットID。FR-6.10aで設定した場合) - **FR-6.6 送らないもの:** 表示中ページ以外のページ、ファイル全体、閲覧履歴。これらは送信内容に含めません。 - **FR-6.5a 参照送信(workspace直接読み。v0.20で新規、Q-17決定):** 表示中ページのファイルがFR-4.9〜FR-4.14のアップロード済み(receiptあり・期限内)である場合は、FR-6.5のページ画像と抽出テキストに代えて、次の参照のみを送ります。 - 送るもの: 冊の識別(冊タイトル)、相対パス、ページ位置(現在ページ/総ページ数。PDFはファイル全体の参照+ページ番号、見開き時は2ページ分の参照)、そのファイルのsize、選んだ用途プリセット(全件)と質問文、送信先チャットの指定(チャットID) - Muse側の確認と読み取り: 送信先チャット側のMuseは、基準フォルダ(`~/workspace/viewer-books/`)+相対パスでファイルを特定し、sizeを実測して参照値と照合します。一致した場合のみ、そのファイル(PDFは該当ページ)を直接読み、送信先チャットの役割で回答を生成してそのチャットへ投稿し、記録を更新します(生成・投稿の主体と帰り経路はFR-6.10、FR-6.10fに従います)。一致しない場合、またはファイルが存在しない場合は、回答を生成せず、その旨を送信先チャットへ知らせ、失敗として記録します。別ファイルを推測で読んで回答してはいけません - 読み取り時の切り出し: 文字が小さいページでは、Muse側はページ全体を読むだけでなく、必要に応じて範囲を切り出して拡大し、読み直してよいものとします。切り出しはMuse側の読み取り手順であり、ビューアからの送信内容は増えません - フォールバック: 対象ページがアップロード未完了・キャンセル済み・失敗・期限切れのいずれかである場合は、参照送信を行わず、従来のFR-6.5の送信(表示中ページの画像、長辺2048px上限・JPEG化)を行います。参照送信と画像送信を同一リクエストで併用しません - 「このページを読み上げる」(第6.7節)も、対象ページがアップロード済みの場合は参照で指定してよいものとします。その場合の文字起こしは、Muse側が直接読んだページから行います ### 6.4 送信前確認 - **FR-6.7 確認表示(設定次第):** 送信前確認を行うかどうかは設定で切り替えられます。設定項目「送信前に確認する」はオン/オフを持ち、既定はオンとします。 - オン: 送信前に、送信するページのプレビューと送信内容の一覧を表示し、ユーザーの確認を得てから送信します。 - オフ: 確認画面を出さず、そのまま送信します。 - **FR-6.8 キャンセル:** 確認画面でキャンセルした場合は送信しません。閲覧状態は変わりません。確認がオフの場合はキャンセルの機会はありません。 - **FR-6.8a 設定の保持(Q-5決定):** 「送信前に確認する」の設定値は保持します。ブラウザを閉じて再度開いた場合も、保持した値が初期値になります。保持先は第9章のローカル保存(FR-9.4)に従います。 ### 6.5 応答の扱い - **FR-6.9 対応付け:** 応答は送信先チャット内で、送信時点のページに対応付けます。チャット側の応答にはページ位置(現在ページ/総ページ数、見開き時は2ページ分)を明記し、どのページへの応答か分かる形とします。ビューア側のリクエスト記録(FR-6.10b)にも同じページ位置が残ります。 - **FR-6.10 回答の行き先と生成主体(Q-6改定、v0.6追加決定、v0.7で生成主体を明確化):** 回答の方式は「回答は送信先チャットに投稿する方式」とします。Q-6の回答の行き先は、ビューア側の記録内ではなく、送信先チャットへの投稿を正とします。加えてv0.7で、回答の生成主体も送信先チャット側であることを明確化します。返答先を変えるのであれば、回答の投稿だけでなく生成も送信先チャットが行うべきである、というユーザーの指摘に基づきます。 - 生成主体: 回答は、送信先チャット側の文脈(そのチャットに設定された役割・口調、会話履歴、設定)を持つMuseが生成します。役割の影響(FR-6.10d)は、この生成主体によって担保されます - 代理生成の禁止: ビューアを開いているチャットと送信先チャットが異なる場合、ビューアを開いているチャットが代理で回答を生成して送信先チャットへ流し込む方式は採りません。リクエストは送信先チャット宛てのものとして扱い、送信先チャット側が記録を読み取り、生成し、投稿します - ユーザーは送信先チャットで回答を読みます。ビューア内には応答ペインを置かず、応答本文も表示しません。ビューア側の記録内に回答本文を返す方式は、完成品の方式としては採りません(現行プロトタイプがそうなっていた事実は13.4に記録します)。ビューア側に残すのはFR-6.10bの送信ステータス表示だけとします。生成・投稿のきっかけ(主方式は送信先チャット側の1分間隔の定期チェック、発言時の即時処理は補助。即時プッシュではないこと)はFR-6.10fに定めます - **FR-6.10a 送信先チャットの設定と既定(Q-6、v0.6で明確化、v0.7で設定UIを改定):** 送信先チャットの既定は「このビューアを開いている/このビューアに紐付いたチャット」です。具体的には、ビューアのカード/ページを開いたチャットが既定の送信先であり、任意の別チャットへ自動で送られることはありません。例えば本仕様の検証プロトタイプの場合、既定の送信先はプロトタイプを開いている現在のチャットです。 - 設定項目はチャットIDの入力のみとします(v0.7決定)。送信先チャットの表示名を入力・保持する欄は設けません。識別はチャットIDで行います - 設定ダイアログ内の説明文は、次の文言のみとします(これ以外の説明文や補足は置きません)。「チャットIDは、Museに「このチャットのIDを教えて」と聞くと分かります。未設定の間は送信できません」 - 冊ごとに専用のサイドチャットを割り当てる設定(FR-7.3の設定ダイアログ)を行った場合は、その設定が既定より優先されます。設定していない冊は、開いているチャットが送信先のままです。 - ビューア内には現在の送信先チャットIDを常時表示します(FR-7.1)。未設定の場合は未設定であることが分かる表示とします。表示はツールバー付近またはステータス表示に置き、送信前確認(FR-6.7)がオンの場合は確認画面にも送信先チャットIDを明記します。ユーザーは送信前に「どのチャットへ届くか」をビューア上で確認できます。表示名による表示は行いません - 送信先の設定は冊ごとに保持します(第9章)。応答の生成・閲覧、追加質問、言い換え依頼などの対話継続はすべて送信先チャット側で行います(帰り経路のモデルはFR-6.10f)。 - **FR-6.10g チャットID未設定で「Museへ送る」を押した場合の案内(v0.8で新規、v0.9で同一ダイアログ内でのチャットID設定を追加、v0.11でコピーを改定):** 送信先チャットIDが未設定(空欄)の状態で、フローティングボタン「Museへ送る」またはCtrl+Space(FR-6.1)を実行した場合は、送信を行いません。代わりに次の案内ダイアログを表示します。本ダイアログは、プロンプト文面の表示・コピーと、チャットIDの直接設定を1つのダイアログで行うものです。設定ダイアログ(FR-7.3)へ移動しなくても、このダイアログだけで設定を完了できます。本ダイアログはFR-6.10aの説明文(設定ダイアログ内の文言)とは別の、未設定時の導入導線です。 - 表示内容: 見出し「送信先チャットが未設定です」、プロンプト文面の全文表示(読み取り専用のテキスト領域/コードブロック。スクロールして全文を確認できること)、コピーボタン、およびチャットID入力欄(次項)だけとします。コピーに関する説明は置きません(次項)。未設定の間は送信できない旨は見出しと送信抑止の動作で示し、コピーの手順・用途を説明する文は置きません - プロンプト文面(表示・コピーの対象は次の文面とし、趣旨を変えない範囲でのみ調整可): > このチャットを共有画像ビューアの送信先にしたいです。 > 1. このチャットのIDを教えてください。 > 2. ビューアの「Museへ送る」の回答待ちキューが溜まっていないかを、5秒間隔のhookで確認する設定を入れてください。回答待ちがあれば、このチャットの役割で回答を生成してこのチャットに投稿し、記録を「回答済み」に更新してください。回答待ちがなければ無言で終了してください。 > 3. 設定ができたら、チャットIDとhookの設定結果を教えてください。返信されたチャットIDをビューアの設定に入力します。 - コピーボタン(v0.11で改定、v0.12で無反応対策を強化。実機で動作しなかった報告あり、13.10/13.11): ラベルは「プロンプトをコピー」とします。押すと上記プロンプト文面の全文(見出しは含めない)が実際にクリップボードへ入り、対象チャット等へそのまま貼り付けられることまでを要件とします。受け入れ必須であり、プロトタイプで動作しなかった事実があるため、通常のクリップボードAPIがビューアの実行環境(対話型ページの埋め込み枠等)で拒否される場合は、文面全体の選択+コピー実行等の代替手段で実際にコピーが成立する実装とします。APIを呼んだことやサンドボックスでの確認をもって完了とはせず、実機でボタンを押した直後に別の入力欄へ貼り付け、文面全文と一致することを確認してから受け入れます(付録A) - 無反応の禁止(v0.12で追加): ボタンを押しても画面上何も起きず、クリップボードにも入らない状態は不具合であり、完了とは扱いません。クリックハンドラがボタン要素に実際に接続されていること、ボタンが他の要素に覆われてクリックを横取りされていないこと、ボタンが無効化されていないことを実装条件とします - ジェスチャ内での実行: コピーは、ボタンのクリックというユーザー操作のジェスチャの範囲内で同期的に開始します。非同期のクリップボードAPIの権限拒否で処理全体が無言で失敗する実装は認めません。主経路が失敗した場合は、そのクリック処理の中で直ちに代替手段(画面外でない一時的なテキスト領域への文面セット、選択、コピー実行等)へ移行します - 失敗時も無言で終わらない: 主経路・代替手段のいずれでもコピーが成立しなかった場合は、無言で終了せず、FR-7.9のトースト通知で失敗した旨を表示します。成功した場合も、反応としてFR-7.9のトースト通知を表示します(次項の「説明は置かない」とは矛盾しません。トーストはダイアログ内の説明文ではありません) - 配布ダイアログの「キットをコピー」等、ビューア内の他のコピーボタンがある場合も、本項の無反応禁止・ジェスチャ内実行・失敗時のトースト表示を同様に適用します - コピーの説明は置きません(v0.11で追加、v0.12で反応の返し方を明確化、ユーザーの指定): ダイアログ内に、コピーの手順・用途・貼り付け先等を説明する文は置きません。ダイアログ内に常駐するコピー成功時の説明表示(「コピーしました」等の文言をダイアログ本文に残す表示)も置きません。v0.8〜v0.10で定めたダイアログ内の成功表示と、手動コピーを促す表示への切り替えは廃止します。ただしv0.12以降、クリックへの反応はFR-7.9のトースト通知(一定時間で消える一時表示)で返します。トーストは説明文の常駐表示ではありません。コピーしてもダイアログは閉じません - チャットIDの直接設定(v0.9で追加): ダイアログ本文内に、ラベル「チャットID」の1行テキスト入力欄を置きます。対象チャットから返信されたチャットIDを貼り付け/入力し、フッターの「保存する」で設定します - 保存先と整合: 保存した値は、設定ダイアログ(FR-7.3)のチャットIDと同一の保存先に、現在開いている冊の送信先として保持します(FR-6.10a、FR-9.4)。本ダイアログで保存した値は設定ダイアログを開いたときにも表示され、設定ダイアログで変更した値も本ダイアログ側と矛盾しません(二重の保存先を持ちません) - 入力の扱い: 前後の空白は取り除いて保存します。空欄のままでは保存できず、「チャットIDを入力してください」とダイアログ内に表示してダイアログを閉じません - 保存後の動作: 保存するとダイアログを閉じ、ビューア内の送信先チャットIDの常時表示(FR-6.10a、FR-7.1)を即時に新しい値へ更新します。あわせて「チャットIDを設定しました」と分かる表示を出します。ブロックされた送信は自動では再送しません。ユーザーが改めて「Museへ送る」(ボタン/Ctrl+Space)を実行すると、設定した送信先へ通常通り送信します - キャンセルの扱い: 「閉じる」でダイアログを閉じた場合は、入力欄の内容を保存しません。送信先は未設定のままです - ダイアログのボタン配置: FR-7.8に従い、左を「閉じる(キャンセル)」、右を「保存する(完了)」とします。コピーボタンは本文領域内に置き、フッターの肯定/否定ボタンとは区別します。v0.8で右ボタンとしていた「設定ダイアログを開く」は、同じダイアログで設定できるようになったため置きません。設定ダイアログ自体(FR-7.3)は従来通りツールバー/Ctrl+,から開けます - 送信抑止の保証: 本ダイアログが表示された送信試行では、リクエスト記録を増やしません(陰性条件)。チャットIDを設定した後の送信は通常通りFR-6.10fの帰り経路で処理します。なお、プロンプトが依頼するhook(5秒間隔)は、FR-6.10f/Q-16の定期チェック(cron、1分間隔)と目的を同じくするキュー確認の自動化であり、対象チャット側でhookが設置された場合はそのhookによる検知が働きます - **FR-6.10b ビューア側の表示は送信ステータスだけ(Q-6改定、v0.6追加決定):** ビューア側に残す表示は、送信ステータスとリクエスト記録など最小限だけとし、応答本文は持ちません。 - 送信ステータス: 送信ステータスは次の3段階を基本とし、現在ページとリクエスト記録上で区別できる表示とします。読み上げリクエストについては、FR-6.18のステータス(Irodori生成待ち/生成中/チャットへ送信済み/生成失敗)を補助的に併記できます - 送信済み: ビューアからMuse側へリクエスト記録が届いた状態 - チャット回答待ち: 送信済みで、まだ送信先チャットへ回答が投稿されていない状態 - チャット回答済み: Museが送信先チャットへ回答を投稿済みの状態(次項の「チャット投稿済み」フラグが真の状態) - 送信失敗は上記とは別の異常として扱い、表示はFR-7.9のトースト通知によります。帯として出し続けません - リクエスト記録の項目: リクエストID、送信時刻、ファイル名、ページ位置、選択プリセット(複数選択時は全件)、送信先チャット、送信ステータス、および「チャット投稿済みかどうか」(真/偽)。記録に回答本文、翻訳文、チャットのログは含めません - ステータスの更新方法: 「チャット回答済み」への遷移は即時プッシュによるものではありません。送信先チャット側の定期チェック(1分間隔。FR-6.10f)または発言時の補助処理で、送信先チャット側のMuseが回答を生成・投稿したときに、記録の「チャット投稿済み」を真に更新し、それに連動してビューア側の表示が「チャット回答済み」になります。投稿されるまでは「チャット回答待ち」のままです。遅延の目安は最大でチェック間隔(1分)+生成時間であり、「チャット回答待ちのままであること」だけをもって送信失敗とは扱いません - 案内表示(v0.12でトースト化): 送信直後に、FR-7.9のトースト通知で次の趣旨を一時表示します(文言は趣旨を変えない範囲で調整可)。「送信しました。回答は送信先チャット(チャットID: (ID))に、そのチャット側で生成されて投稿されます。通常は約1分以内に定期チェックで処理されます」。チャット回答待ちである間、この案内を帯として出し続けてはいけません。回答待ちの状態そのものはステータス表示/記録(本項の送信ステータス)で示します - 応答本文、翻訳文、チャットのログはビューア側に表示しません - **FR-6.10c 正本ルール:** 回答の正本は送信先チャットへの投稿とします。ビューア側のリクエスト記録はステータス管理のための最小限の記録であり、回答の写しではありません。記録が持つのは「チャット投稿済みかどうか」とステータスまでです。ビューアを閉じてもチャット側の投稿は残ります。 - **FR-6.10d 役割の影響:** コメント・解説や要約の口調・観点は、送信先チャットに設定された役割に従います。これは、回答の生成主体が送信先チャット側であること(FR-6.10)によって担保されます。役割の異なるサイドチャットを割り当てれば、同じページでもコメントはその役割に寄ります。ただし翻訳プリセットの訳文そのものには役割を反映しません。役割をプリセットごとにどこまで反映するかの詳細はQ-14で決めます。 - **FR-6.10e 音声の受け渡し(Q-6改定、v0.7で改定、v0.10で改定):** 読み上げで生成された音声は、音声ファイルを送信先チャットへ投稿して受け渡します(FR-6.16、FR-6.18)。v0.7までの「ビューア内で自動再生できる場合はビューアを優先」は、生成が非リアルタイムであるためv0.10で改め、完成形ではビューア内再生を正としません。ビューア側は生成ステータス(生成待ち/生成中/チャットへ送信済み/生成失敗)の表示だけを持ちます。投稿のきっかけは送信先チャット側のhookによる生成待ち検知であり(FR-6.18)、即時再生ではありません。 - **FR-6.10f 帰り経路のモデル(v0.6で新規、v0.7で定期チェック方式を採用):** ビューアとMuseの往復は非対称です。往きと帰りを分けて定めます。帰りの行き先は送信先チャットへの投稿であり、ビューア側の記録内ではありません。帰り経路の自動化の解法はQ-16で決定し、本項を主方式とします。 - 往き(ビューア→Muse): 「Museへ送る」等の操作で、ページ画像・付随情報・リクエスト記録がMuse側の環境に届きます(経路1、第13章で成立を確認)。これはMuseへの一方通行の通知/記録であり、この操作だけでチャットにメッセージが即時投稿されるわけではありません - 帰り・主方式(送信先チャット側の定期チェック): 送信先チャット側に、1分間隔の定期チェック(cron)を置きます。各回の定期チェックは次の通り動作します。確認の取得方法はFR-6.10hの統合取得(1回だけ、全文付き、再確認なし)によります。hook(5秒間隔)で検知する場合も確認手順は同じです - 統合取得(FR-6.10h)で、その送信先チャット宛ての回答待ちリクエスト(「チャット投稿済み」が偽のもの)があるかを調べます - 回答待ちがある場合: 送信先チャット側のMuseが、そのチャットの役割・文脈で回答を生成し、その送信先チャットへ投稿します。投稿後に記録の「チャット投稿済み」を真に更新します(FR-6.10b)。複数の回答待ちがある場合は、古いものから順に処理します - 回答待ちがない場合: 何も投稿せず、無言で終了します。定期チェック自体がチャットに痕跡(チェック実施の通知等)を残してはいけません - 生成と投稿の主体はあくまで送信先チャット側であり、ビューアを開いているチャットが代理で生成することはありません(FR-6.10)。定期チェックは送信先チャットごとに置き、他のチャット宛てのリクエストは処理しません - 遅延の目安: 回答が投稿されるまでの遅延は、最大でチェック間隔(1分)+生成時間です。即時プッシュではないため、送信直後に回答が現れないことは不具合ではありません - 帰り・補助方式(発言時の即時処理): ユーザーが送信先チャットで発言した(例: 「送信しました」)場合は、その時点でも未処理の回答待ちリクエストを確認し、即時に生成・投稿してよいものとします。これは定期チェックを早回しする補助であり、主方式ではありません。v0.6まで主方式としていた「ユーザーの発言をトリガーにする方式」は、v0.7で主方式から外します。ユーザーの発言がなくても、定期チェックにより回答は投稿されます - 現行プロトタイプとの違い(事実): 現行プロトタイプの送信は、どのチャットにも投稿されていませんでした。プロトタイプでは回答が記録経由で記録内に返っており(記録内の回答欄への書き戻し)、送信先チャットへの投稿は行われていません。本方式(チャット投稿を正とする)とは異なるため、プロトタイプの記録内返却をもって「チャットに回答が返った」と扱ってはいけません。詳細は13.4に明記します - 第13章の経路2との違い: 13.1で「成立」とした経路2は、上記の通り検証プロトタイプ内部の応答欄(記録内)への書き戻し表示を確認したものであり、完成品で定めた「回答が送信先チャットへ投稿される」帰り経路とは別物です。帰り経路は本項の定期チェック方式で自動化することとし、方式の記録は13.6に置きます - **FR-6.10h 統合取得による検知→確認の短縮(v0.13で新規):** 検知から内容確認・着手までを短縮するため、ビューア側に統合取得の仕組みを1つ置き、検知側(hook/定期チェック)の確認手順を次の通りとします。従来の「回答待ち一覧とIrodori生成待ち一覧を別々に取得し、必要に応じて再確認し、報告後に生成主体が全文を再取得する」手順は採りません。 - 統合取得の入力: 宛先チャットIDを1つ指定します。対象はそのチャット宛ての未処理だけとし、他チャット宛ては含めません - 統合取得の返却: 回答待ちとIrodori生成待ちの両方を、1回の呼び出しでまとめて返します。各件には、生成・投稿に必要な全文を含めます。回答待ちについては冊名/ファイル名、ページ位置、プリセット、質問文、抽出テキスト/文字起こしテキストの全文を、Irodori生成待ちについては冊名/ファイル名、ページ位置、読み上げ文の全文とキャプションを含めます。要約や概要だけで返してはいけません - 確認手順(検知側): キュー信号で検知した後の確認は、統合取得を1回だけ呼ぶこととします。その結果をそのまま即時に生成主体へ報告し、確認のための再取得(未フィルタでの再照会、信号との突き合わせのための再取得等)は行いません。信号側の件数と統合取得の件数が食い違う場合も、再取得はせず、統合取得で確認できた件を処理対象として報告します - 生成主体側の再取得の省略: 報告に全文が含まれるため、生成主体(送信先チャット側のMuse)は回答生成/音声生成に着手するにあたり、一覧や全文を改めて取得し直しません。書き戻し(回答済み/生成完了・失敗の記録更新)のための呼び出しは本項の対象外です - 性能の目安: 検知→着手(確認結果の報告を受けて生成に着手できるまで)は10〜15秒程度を目安とします。内訳として残るのは、信号のポーリング待ち(hook 5秒間隔の場合は0〜5秒)と、検知側エージェントの起動および統合取得1回の時間です。ポーリング間隔そのものは本項では変更しません - 適用範囲: 本項は「Museへ送る」の回答待ちと、FR-6.18のIrodori生成待ちの両系統に適用します。検知のきっかけがhook(5秒間隔)でも定期チェック(FR-6.10f、1分間隔のcron)でも、確認手順は同じく統合取得1回とします - **FR-6.11 再送:** 送信に失敗した場合は、同じ内容で再送できます(第11章)。 ### 6.6 「ページ送りごとに聞く」 - **FR-6.12 チェックボックス(配置は設定ダイアログ):** 「ページ送りごとに聞く」のオン/オフは設定ダイアログ(FR-7.3)内の項目とし、基本画面やツールバーには常駐させません。既定はオフです。設定値は保持します。 - **FR-6.13 有効時の動作:** オンにすると、ページ送りで表示中ページが変わるたびに、移動後の1ページについて自動で「今のページについて聞く」を実行します。 - 用途プリセット(複数選択を含む)と質問文は、設定ダイアログで選択・入力した設定をそのまま使います。見開き時は、移動後の2ページを合わせて1枚として送信します(FR-6.2a)。 - 拡大・縮小、フィット切り替え、同一ページ内での操作では実行しません。 - 送信前確認がオン(FR-6.7)の場合は、ページ送りのたびに確認画面が出ます。連続して聞きたい場合は、送信前確認をオフにする運用を想定します。 - オフに戻すと、それ以降のページ送りでは実行しません。実行済みの送信と応答履歴は消えません。 - これはFR-1.2の例外であり、チェックボックスをオンにしたユーザーの明示的意思表示を根拠とします。常時自動同期とは扱いません。 ### 6.7 「このページを読み上げる」 - **FR-6.14 読み上げボタン(フローティング):** フローティングボタン「読み上げる」(FR-7.6)を置きます。押すと表示中ページの文章を読み上げ対象としてMuseへ送ります。ツールバーや基本画面の常駐パネルには置きません。読み上げ対象はPDFでも画像でも「ページ内の文章そのもの」とし、形式による差はテキストの取得方法だけとします。 - PDF(テキスト埋め込みあり): 抽出テキストを対象とします。 - PDF(テキスト埋め込みなし/スキャン画像ページ)および画像ページ: ページ画像をMuseへ送り、Muse側で画像内文章を文字起こし(OCR)して読み上げ対象テキストとします。画像だから読み上げ対象外とはしません。ユーザーの要望は「画像内の文章も読み上げて欲しい」であり、これを正式な要件とします - 見開き時: 表示中の2ページ分を対象とし、ページ順(左→右)に読み上げます - 読み上げできず、その旨を表示するのは、画像/PDFから文章が取得できない場合(無地、文章のないイラストのみ等)、およびMuse側で文字起こしに失敗した場合に限ります。その旨の表示には理由(文章が検出できない/文字起こし失敗/Irodori-TTS未設定)を含めます - **FR-6.14a ふりがなの区別(v0.6で新規):** 日本語の文章にふりがな(ルビ)がある場合、本文とふりがなを区別して扱います。 - ふりがなは本文とは別の要素として識別します。ふりがなだけを独立した文章として読み上げたり、本文とふりがなの両方を重ねて読み上げたりしてはいけません(二重読みの禁止) - 原則の読み方: 本文を、ふりがなが示す読みで読み上げます。つまり漢字等の本文はふりがな通りの読みで発音し、ふりがな自体は別途発音しません - PDFでテキスト情報にふりがなと本文が分離して含まれる場合も、画像から文字起こしする場合も、同じ原則を適用します。文字起こし側では、ふりがなを本文の読み情報として対応付け、本文文字列へ混入させません - ふりがなの対応付けに失敗した場合の扱い(本文の通常読みで読む/読み上げを止めて知らせる等)、ふりがなの一部だけが取得できた場合の扱い、縦書き・小書き文字等の詳細はQ-15で決めます。Q-15が未決の間は上記の原則(二重読み禁止、ふりがな通りの読みを優先)だけを必須とします - **FR-6.15 Muse側の前提(Irodori-TTS):** 音声生成はMuse側で行います。そのためMuse側にIrodori-TTSの設定が必要です。画像ページの文字起こし(OCR)もMuse側の責務とし、ビューア側ではOCRは行いません。生成条件の既定(v0.10で確定)は次の通りとし、読み上げダイアログ(FR-6.17)で変更できる項目はキャプションだけとします。 - 実行系: ユーザーのPC上のIrodori-TTS(PyTorch)で生成します。生成時にPCが起動し、Museから接続できることが前提です - 声: Museの声を既定とします。参照音声は double_sample.wav、seedは180563です - キャプション: 読み上げダイアログで指定した値を使います。未指定(空欄)の場合のデフォルトは「キャプションなし」とします(v0.7までの「デフォルトのキャプションを使う」はv0.10で改めます) - 絵文字注釈: Museの声は既定で無感情とし、Irodori-TTSの絵文字注釈は付けません。ささやき場面等でユーザーが個別に指定した場合だけ、ピンポイントで付けます - 所有者ごとの再構築(NFR-10.6)では、参照音声・seed・実行系はその所有者のMuse側の設定に置き換わります - **FR-6.16 受け渡しと再生の扱い(v0.7で改定、v0.10で改定):** 生成された音声の受け渡しは、送信先チャットへの音声ファイル投稿を正とします。生成には実績目安で音声28.5秒あたり約51秒に加えてモデル読み込み時間がかかり、即時再生には適さないため、ビューア内での自動再生は完成形の要件としません(v0.7までの第一優先/代替の優先順位は廃止します)。 - 投稿する音声ファイルには、対象が分かる情報(冊名/ファイル名、ページ位置、使ったキャプションの有無)を添えます。形式はWAVとします - ユーザーは送信先チャット側で音声ファイルを再生します。ビューア側に再生UIは置きません - ビューア側では生成待ち/生成中/チャットへ送信済み/生成失敗のステータス表示を行い、生成中も閲覧を継続できることを要件とします。生成待ちになったこと等の発生通知はFR-7.9のトースト通知で一時表示し、生成待ちの帯を出し続けません。状態そのものはステータスバー/記録で確認できる形に残します - ダイアログで画像を覆わないこと: 読み上げダイアログはリクエスト登録後は閉じ、モーダル背景でページ画像を見えなくしません。生成の進捗はステータス表示(ステータスバー/記録)だけで示します。進捗を帯で常時表示しません - **FR-6.17 読み上げダイアログ(「このページを読み上げる」ダイアログ。Q-13、v0.7で内容を整理、v0.10で確定):** 「読み上げる」実行時のダイアログおよび読み上げに関する設定は、通常の設定ダイアログとは別の「読み上げダイアログ」に分けます。本ダイアログは未検証です(13.5)。監査環境での表示確認(13.1)をもって実機で検証済みとは扱いません。内容は次の通りとします。 - Irodori-TTSのキャプション入力欄を置きます。キャプションを指定しない(空欄の)場合は、キャプションなしで生成します(FR-6.15) - 「読み上げ対象」の項目は置きません。読み上げ対象は表示中ページ(見開き時は2ページ)で固定であり、ダイアログで選ばせません(対象の定義はFR-6.14) - 受け渡し先の表示: 音声は生成後に送信先チャットへ音声ファイルとして投稿される旨と、生成に時間がかかる旨(非リアルタイム。目安はFR-6.16)をダイアログ内に表示します。送信先チャットIDが未設定の場合は読み上げリクエストを登録できず、その旨を表示します(送信先はFR-6.10aと共通) - 声の表示: 使う声はMuseの声(FR-6.15)で固定とし、ダイアログでは参照音声・seedの変更項目は置きません - ダイアログ背景で画像を覆わないこと: リクエスト登録後はダイアログを閉じます(FR-6.16) - Muse側にIrodori-TTSの設定があるかどうか(設定済み/未設定)の状態表示を含みます。未設定の場合は、その旨と、Muse側で設定が必要である旨を表示します - フッターのボタン配置はFR-7.8に従い、左をキャンセル、右を完了(読み上げを依頼する)とします。完了で読み上げリクエストを登録し、ダイアログを閉じます - ふりがなの扱いの詳細設定(Q-15)を置く場合は、このダイアログの項目とします - **FR-6.18 Irodori生成パイプライン(v0.10で新規):** 読み上げの実装は、次の流れを正とします。ブラウザ内蔵の音声合成(ブラウザ再生)で代替してはいけません。 - リクエスト登録: 「読み上げる」の完了で、読み上げリクエストを記録します。記録項目は、リクエストID、登録時刻、冊名/ファイル名、ページ位置(見開き時は2ページ分)、読み上げテキストの取得方法(PDF抽出/画像の文字起こし)、キャプション(未指定の場合は「なし」)、送信先チャットID、ステータスです。登録直後のステータスは「Irodori生成待ち」とします。読み上げテキスト本文そのものは、生成に必要な範囲でMuse側が扱い、ビューア側の記録には保持しません - 検知: 送信先チャット側に置くhookが、生成待ちリクエストの新規登録を検知して、そのチャット側のMuseを起こします(「Museへ送る」のキュー検知と同方式。検知対象に読み上げリクエストを含めます)。hookが使えない環境では、定期チェック(FR-6.10f)が生成待ちを拾う代替経路とします。生成待ちがない場合は無言で終了します。検知後の確認はFR-6.10hの統合取得(回答待ちと合わせて1回だけ、読み上げ文の全文付き、再確認なし)により、生成主体は再取得せずに着手します - テキスト確定: Muse側で読み上げテキストを確定します。PDFは抽出テキスト、画像ページとテキストのないPDFはページ画像からの文字起こし結果を使います。ふりがなはFR-6.14aに従い、本文へ混入させず読み情報として使い、二重読みをしません。文字起こし結果の《》等の区別記号は発音しません - 分割: 1回の生成で作る音声は約30秒を目安とし、読み上げテキストを文の切れ目で分割します。各部を順に生成し、部と部の間に短い無音(目安0.8秒)を挟んで1つのWAVファイルに結合します - 生成: FR-6.15の条件(ユーザーのPC上のIrodori-TTS(PyTorch)、Museの声、seed 180563、キャプションはダイアログ指定値または「なし」)で生成します。生成開始時に記録のステータスを「生成中」に更新します。PCに接続できない場合は生成に入らず、ステータスを「生成失敗」とし、理由(PC未接続)を記録します - 投稿と完了: 生成したWAVファイルを送信先チャットへ投稿し、記録のステータスを「チャットへ送信済み」に更新します。投稿には冊名/ファイル名とページ位置を添えます。ビューア側の表示はこのステータス遷移だけを反映し、音声ファイル自体はビューア側に保持しません - 失敗と再試行: 文字起こし失敗、Irodori-TTS未設定、PC未接続、生成失敗のいずれも、ステータスを「生成失敗」とし理由を記録します。失敗したリクエストは、同じ内容で再依頼(再登録)できます。生成待ちの登録、生成開始、生成失敗の発生通知はFR-7.9のトースト通知で一時表示し、帯として出し続けません。理由を含む状態は記録側に残します - 重複抑止: 同じページ・同じキャプションの生成待ち/生成中リクエストがある間は、同一内容の新規登録を抑止します ### 6.8 制約 - 1回の実行で送れるのは1ページだけです。ただし見開き時は、表示中の2ページを合わせて1枚として送ります(Q-4決定、FR-6.2a)。それを超える複数ページの一括送信は行いません。 - 応答待ちの間も閲覧操作はできますが、同じページへの連続実行は応答が返るまで抑止します。「ページ送りごとに聞く」がオンの場合も、同一ページへの重複送信は抑止します。 - 読み上げも1回の実行で対象は表示中ページ(見開き時は2ページ)だけです。生成待ち/生成中の同一内容リクエストの重複登録は抑止します(FR-6.18)。 ## 7. 画面構成 - **FR-7.1 領域(中央+右ペイン構成):** 画面は次の領域で構成します。応答表示用の左ペインは置きません(Q-6改定)。 - ツールバー(1行): 開く、倍率、ページ移動、単ページ/見開き切り替え、設定(設定ダイアログを開く)等の閲覧操作のみを置きます。送信・読み上げの操作はツールバーには置きません(FR-7.6) - 中央ペイン(画像表示): 表示中ページ。フローティングボタンをこの上に重ねて表示します(FR-7.6)。レイアウトの中心とします - 右ペイン(ページ一覧): サムネイルによるページ一覧。中央ペインとは別にスクロールします - ステータス表示(最小限): 送信ステータスとリクエスト記録(FR-6.10b)を表示する最小限の領域。専用の大きなペインにはせず、ステータスバーや記録ダイアログ等の小さい表示に収めます。応答本文はここにも表示しません。あわせて、現在の送信先チャットID(FR-6.10a、未設定の場合はその旨)を常時表示し、送信がどのチャットへ届くかをユーザーが送信前に確認できるようにします。送信先の表示名は表示しません - **FR-7.1a ペインの縮小:** 中央ペイン(画像表示)以外のペイン(右ペイン=ページ一覧)は、必要のないときに縮小(折りたたみ)できることとします。縮小したペインは再び展開でき、縮小時は中央ペインがその分広がります。縮小・展開の操作はペインの境界付近に置きます。 - **FR-7.2 状態の明示:** 読み込み中、送信中、応答待ち、エラーは、それぞれ画面上で区別できる表示にします。一時的な通知(エラー、送信完了、Irodori生成待ち等)の出し方はFR-7.9のトースト通知とし、帯として出し続けません。継続する状態(応答待ち、生成中等)そのものはステータスバー/記録の最小限の表示で示します。 - **FR-7.3 設定ダイアログ(Q-9):** 設定ダイアログを用意し、ツールバーの設定ボタンとショートカットCtrl+,(第8章)の両方から呼び出せます。基本画面に常駐させない設定・入力はすべてこのダイアログに集約します。含む項目は次の通りです。 - 用途プリセットの複数選択(翻訳/コメント・解説/要約。FR-6.3)と自由記述の質問文(FR-6.4) - 「ページ送りごとに聞く」のオン/オフ(FR-6.12) - 送信前に確認する(オン/オフ。保持されます。FR-6.7、FR-6.8a) - 送信先チャットの設定(冊ごとの割り当てを含む。FR-6.10a)。入力項目はチャットIDのみとし、表示名の入力欄は設けません。説明文は「チャットIDは、Museに「このチャットのIDを教えて」と聞くと分かります。未設定の間は送信できません」のみを表示します。なお、未設定のまま「Museへ送る」を押したときに出る案内ダイアログ(プロンプト文面、コピーボタン、チャットID入力欄)はFR-6.10gで別に定め、本ダイアログ内の説明文の制約の対象外とします。案内ダイアログで保存したチャットIDは本ダイアログと同一の保存先を共有し、本ダイアログを開いたときにその値が表示されます(FR-6.10g) - 読み上げダイアログへの入り口(FR-6.17) - その他、送信・読み上げに関する設定項目(基本画面に常駐させないもの) - **FR-7.4 ベースデザイン(Q-12決定):** ダークモードの切り替えは設けません。代わりに、ベースデザイン自体を暗めの配色とします。 - **FR-7.5 起動時の堅牢性(v0.4で追加):** ローカルストレージへアクセスできない環境でも、ビューアは起動して表示できることとします。ストレージ読み書きの失敗は起動の失敗にしません。万一起動時にエラーが発生した場合は、画面を真っ黒にせず、エラーの理由と再読み込みの手段を表示します。読み込み中はプレースホルダを表示します。根拠は第13章の実機事象です。 - **FR-7.6 基本画面の常駐操作とフローティングボタン:** 基本画面に常駐する送信・読み上げ系の操作は、フローティングボタン2個だけとします。大きな「今のページについて聞く」ボックス(プリセット選択、質問文入力、各種チェックボックス等をまとめた常駐パネル)は基本画面に置きません。 - フローティングボタン1: 「Museへ送る」。設定ダイアログで選択中の用途プリセット(複数選択可)で送信します。Ctrl+Spaceでも同じ動作をします(FR-6.1) - フローティングボタン2: 「読み上げる」。表示中ページの読み上げを実行します(FR-6.14) - 2個のボタンは中央ペイン上に重ねて常駐表示し、ページ画像の閲覧操作(スクロール、拡大・縮小、ページ送り)を妨げない位置・大きさとします - **FR-7.7 ツールバーのアイコン(16px、1行、外部フォント依存禁止):** ツールバーは1行にまとめ、2行にしません。アイコンのデザイン系統はMaterial Icons(https://fonts.google.com/icons)とし、表示サイズは16pxとします。ただし実装方式として、外部のアイコンフォント(Webフォント)の読み込みに依存してはいけません。実機でフォントが読み込めず、アイコン名の文字列(例: `settings`、`folder_open` 等のリガチャ名)がそのまま表示される事象が発生したためです(13.4)。アイコンは次のいずれかの自己完結方式で実装します。 - インラインSVGとしてページ内に埋め込む方式(推奨。Material IconsのSVGパスを使用する) - アイコン画像をデータURI等でページ内に同梱する方式 - 外部フォントを使う場合でも、読み込み失敗を検出してSVG/画像へ自動で切り替える方式(この場合も最終的な表示は外部読み込みなしで成立すること) - フォールバック必須: いかなる理由でアイコン描画に失敗しても、アイコン名の文字列を素のまま表示してはいけません。各ボタンには、アイコンが表示されない場合でも機能が識別できるテキストラベルまたは代替表示(ツールチップだけでなく、視認できる短いラベル、または失敗時にラベルへ切り替える表示)を必ず備えます。アイコン単独で意味を担わせません。 - 検証条件: ネットワーク遮断時およびフォント読み込みを無効化した状態でも、ツールバーの全アイコンが表示されるか、アイコンの代わりに機能名ラベルが表示されることを確認します(付録A)。 - **FR-7.8 ダイアログのボタン配置(統一):** すべてのダイアログで、肯定(完了/はい)と否定(キャンセル/いいえ)のボタンの位置を一貫させます。基本は左がキャンセル/いいえ、右が完了/はいとします。 - 対象: 設定ダイアログ、読み上げダイアログ、送信前確認、しおり復元ダイアログ(FR-9.5)、その他の確認ダイアログすべて - 左から右へ「キャンセル/いいえ」→「完了/はい」の順に並べ、ダイアログごとに左右を入れ替えません - **FR-7.9 トースト通知(トースター。v0.12で新規):** 一時的な通知は、画面隅等に短時間だけ現れて自動で消えるトースト通知(トースター)で表示します。画面上部・下部等に帯状の表示(バナー/帯)を常駐させる方式は採りません。 - 対象: エラー(ファイルを開けない、ドロップ失敗、送信失敗、コピー失敗、読み上げ対象が取得できない等、第11章の各エラー)、送信完了の案内(FR-6.10b)、コピーの成否(FR-6.10g)、Irodori生成待ち(プロトタイプで「再生待ち」と表示される場合を含む)/生成中/生成失敗等の読み上げに関する一時通知(FR-6.16、FR-6.18)、その他、発生した瞬間に知らせるだけで足りる一時的な状態変化すべて - 自動消去: トーストは表示後、一定時間で自動的に消えます。目安は通常通知5秒、エラー通知8秒とし、ユーザーが何もしなくても消えることを必須とします。エラーであっても、帯のように残り続けて画面を占有してはいけません。再送・再依頼等の次の操作は、トーストが消えた後もステータス表示/記録や再送操作(FR-6.11、FR-6.18)から行えることとし、トースト自体に操作を閉じ込めません - 手動消去: トーストはクリック/閉じる操作でも消せることとします。複数が重なった場合は重ねて表示し、古いものから順に消えます。同時表示は最大3件程度に抑え、それを超える場合は古いものから消します - 閲覧の妨げ禁止: トーストはページ画像の閲覧操作(スクロール、拡大・縮小、ページ送り)を妨げない位置・大きさとし、モーダルにはしません。表示中も閲覧を継続できます - 状態の残し方との分離: トーストが消えても、継続する状態(チャット回答待ち、Irodori生成待ち/生成中、生成失敗の記録等)はステータスバー/リクエスト記録の最小限の表示に残します(FR-6.10b、FR-6.18、FR-7.1)。「通知は消えるが、状態確認の手段は残る」形とし、逆に状態が続くことを理由に帯を残してはいけません - 永続表示の禁止範囲: エラー帯、Irodori再生待ち/生成待ちの帯、その他これらに類する帯状の一時通知を、解消操作をするまで出し続ける実装は要件を満たしません。入力を必須とするダイアログ(送信前確認、案内ダイアログ、しおり復元ダイアログ等)はトーストの対象外であり、本項で消す対象ではありません ## 8. 操作仕様 | 操作 | キー | |---|---| | 次ページ | → / PageDown | | 前ページ | ← / PageUp | | 拡大 | + | | 縮小 | - | | フィット表示 | 0 | | 今のページについて聞く(Museへ送る) | Ctrl+Space(Q-9決定。フローティングボタン「Museへ送る」と同じ動作、FR-6.1) | | 設定ダイアログを開く | Ctrl+, | キー割り当てはQ-9で決定済みです。設定ダイアログはツールバーの設定ボタンからも開けます(FR-7.3)。 ## 9. 状態管理・履歴 - **FR-9.1 閲覧状態:** 開いているファイル、現在ページ、倍率を保持します。 - **FR-9.2 リクエスト記録と応答履歴:** ビューア側では、送信したページとステータスの組(リクエスト記録、FR-6.10b)をファイルを開いている間保持します。応答本文の履歴はビューア側では保持せず、応答の正本は送信先チャット側です(FR-6.10c)。過去の応答はチャット側で参照します。 - **FR-9.3 終了時:** ファイルを閉じると閲覧状態は破棄します。ただし下記FR-9.4の保存対象は破棄しません。 - **FR-9.4 ファイルパスのローカル保存(Q-11決定):** 開いたファイルおよびフォルダのパスを、ユーザーのローカル内に保存します。保存したパスは、最近開いた冊の一覧としおり(冊とページ位置)のために使います。しおりは次回起動時に自動で読み込むためではなく、FR-9.5の復元ダイアログのために使います。 - 保存先はユーザーの手元の環境内とし、Museへは送信しません(送信内容はFR-6.5の範囲のみ)。 - FR-4.9のworkspace一時アップロードでMuse側に置かれるファイルとmanifestは、本項のローカル保存とは別の、一時的な保存です。保持期限と削除はFR-4.13によります。 - 「送信前に確認する」などの設定値(FR-6.8a)と、冊ごとの送信先チャット設定(FR-6.10a)も、同じローカル保存に保持します。 - 注意: ブラウザのセキュリティ制約により、保存したパスだけでファイルを自動で開き直せない場合があります。その場合はパスを一覧表示し、ユーザーにファイル/フォルダの再選択を求める形とします。 - **FR-9.5 再オープン時のしおり復元ダイアログ(Q-11決定):** ビューアを再度開いた(起動した)ときに、保存済みのしおり(冊とページ位置)があれば、前のファイルを読み込むかどうかを尋ねるダイアログを出します。しおりがなければダイアログは出しません。 - 「はい」(右): 前のファイルを読み込み、しおりのページ位置を表示します。ブラウザ制約でパスだけでは開き直せない場合は、ファイル/フォルダの再選択を求め、再選択後にしおりのページ位置へ移動します(FR-9.4の注意) - 「いいえ」(左): 前のファイルは読み込まず、空の状態で開始します - ボタン配置はFR-7.8に従い、左が「いいえ」、右が「はい」とします。自動で無言に読み込むことはしません ## 10. 非機能要件 - **NFR-10.1 性能目安:** ページ送りと拡大・縮小は、操作に対して即時に反応することを目安とします。具体的な数値目標は要望に応じて追加します。 - **NFR-10.2 プライバシー:** 送信は「今のページについて聞く」の実行時、「このページを読み上げる」の実行時、および「ページ送りごとに聞く」がオンの状態でのページ送り時に限ります。それ以外の操作でページ内容を外部(Muse)へ送りません。例外はFR-4.9のworkspace一時アップロードです。これはユーザーの決定(v0.20、Q-17)によるもので、ファイル取り込み時に限り、取り込んだ冊のファイルを原本のままMuseのworkspaceへ一時的に(保持期限は約3日、FR-4.13)アップロードします。アップロードはキャンセル可能であり(FR-4.12)、閲覧だけの操作(ページ送り・拡大・縮小)では行いません。 - **NFR-10.3 オフライン閲覧:** ネットワークが使えない場合でも、表示・ページ送り・拡大・縮小は使えます。送信だけがエラーになります(第11章)。 - **NFR-10.4 対応環境:** PCブラウザのみとします(Q-8決定)。 - **NFR-10.5 提供形態(Q-8決定):** 完成品の提供形態は「Muse環境内の対話型ページ」経由(非公開)に決定します。ビューアは所有者のMuse環境内に置かれ、その所有者のMuseとだけ送受信します。単体のローカルHTMLファイルとして開く形態や、Webページとして外部に公開する形態は採りません。 - 検証結果との関係(第13章): 同期検証が成立した検証プロトタイプは、本項で決定したものと同じ「Muse内に置く対話型ページ(非公開)」の形態で構築しました。経路1(送信)の成立はこの形態に基づきます。ローカルHTML単体ではMuseと通信する経路がないため、完成品の形態としては採用しません。 - **NFR-10.6 配布の形(完成品の配布):** 完成品は、他のMuseユーザーがそれぞれ自分のMuseと共有できる形で配布できるよう整えます。配布単位は完成したページそのものではなく、本仕様書と再構築(ビルド)手順の組とします。 - 受け取った側では、その人のMuseが、その人の環境内でビューアを対話型ページとして再構築します(NFR-10.5の提供形態)。再構築されたコピーは所有者ごとに分離し、送信・応答・設定・Irodori-TTS設定は所有者自身のMuse側のものが適用されます。他の所有者のMuseへ送信が届くことはありません。 - 再構築手順には、少なくとも次を含めます: 本仕様書への参照、実装に必要な構成要素の一覧、所有者のMuse環境内で再構築する手順、再構築後に経路1(送信)・経路2(応答)を確認する手順。 - 静的なページだけを公開リンク等で共有しても、記録と応答の往復は働かず、半同期は成立しません。そのため公開リンクによる完成ページの配布は配布方法として扱いません。 ## 11. エラー処理 本章の各エラーおよび一時的な状態通知の表示は、原則としてFR-7.9のトースト通知(一定時間で自動消去)によります。エラー帯やIrodori生成待ちの帯を画面に出し続けてはいけません。理由や再送・再依頼に必要な情報は、トーストに加えてステータス表示/記録側にも残し、トーストが消えた後も確認・再操作できるようにします。 | 状況 | 扱い | |---|---| | 非対応形式を開いた | 開かず、対応形式を案内する | | PDFが破損している | 開かず、読み込めなかった旨を表示する | | テキスト抽出ができない | 画像のみで送信し、その旨を確認画面に表示する | | 送信に失敗した | 閲覧は継続でき、同じ内容で再送できる | | 応答が返らない | 応答待ちのままにせず、タイムアウト後に再送できる状態にする | | フォルダボタンから取り込んだが対応ファイルが0件 | 開かず、その旨と除外件数を表示する(FR-4.7) | | フォルダがドロップされた | 対応対象外として取り込まない。クラッシュさせず現在の表示を維持し、フォルダボタンから開くよう案内するトーストを表示する(FR-4.3、FR-4.5) | | 読み上げ対象の文章が取得できない(画像/PDFとも) | 読み上げを行わず、理由(文章が検出できない/文字起こし失敗)を含めてその旨を表示する(FR-6.14) | | 回答がチャットに現れない | まず遅延の範囲内かどうかを確認する。帰り経路は即時プッシュではなく、送信先チャット側の定期チェック(1分間隔)が主方式のため、最大でチェック間隔(1分)+生成時間までは不具合とは扱わない。その目安を超えても現れない場合は、定期チェックが動作しているか、送信先チャットIDが正しいかを確認する(FR-6.10b、FR-6.10f、Q-16) | | アイコンが表示されない/アイコン名の文字列が表示される | 外部フォント依存の失敗として扱う。フォールバックのラベル表示へ切り替え、アイコン名を素のまま表示しない(FR-7.7) | | Muse側のIrodori-TTSが未設定で読み上げできない | 読み上げを行わず、Muse側の設定が必要な旨を表示する(FR-6.15)。状態は読み上げダイアログでも確認できる(FR-6.17) | | 読み上げ生成時にユーザーのPCへ接続できない | 生成に入らず、読み上げリクエストのステータスを「生成失敗」とし、理由(PC未接続)を記録する。PCが接続できる状態で同じ内容を再依頼できる(FR-6.18) | | 読み上げの生成に失敗した | ステータスを「生成失敗」とし理由を記録する。閲覧は継続でき、同じ内容で再依頼できる(FR-6.18) | | 読み上げで送信先チャットが未設定 | 読み上げリクエストを登録せず、その旨を読み上げダイアログに表示する(FR-6.17) | | ファイルをドロップしても取り込まれない | 無反応で終わらせない。ドロップ直後に失敗の旨と理由を表示する。取得できた対応ファイルが0件の場合もエラー表示を出す(FR-4.3)。ファイル選択ダイアログでの代替を促す場合も、ドラッグ&ドロップ自体の不具合として記録する。フォルダのドロップは対応対象外であり、本行の対象としない(FR-4.5) | | 送信先チャットが未設定 | 送信しない(リクエスト記録も増やさない)。「Museへ送る」実行時はFR-6.10gの案内ダイアログを出し、5秒間隔のhook検知の設置とチャットID確認を依頼するプロンプト文面と「プロンプトをコピー」ボタンを表示する。同じダイアログ内のチャットID入力欄から、その場でチャットIDを入力・保存できる(保存先は設定ダイアログと共通。空欄では保存できない)。設定ダイアログ内の説明文は「チャットIDは、Museに「このチャットのIDを教えて」と聞くと分かります。未設定の間は送信できません」のみとする(FR-6.10a、FR-6.10g) | | 読み上げ音声の受け渡し | ビューア内再生は行わない。生成した音声ファイルは送信先チャットへ投稿し、チャット側で再生する(FR-6.16、FR-6.18) | | PDFで見開きを選んだ | PDFは見開き対象外のため、単ページ表示のままとしてその旨を表示する(FR-5.10) | | 保存したファイルパスから開き直せない | パスを一覧表示し、ファイル/フォルダの再選択を求める(FR-9.4)。しおり復元ダイアログで「はい」を選んだ場合も同様に再選択を求め、再選択後にしおり位置へ移動する(FR-9.5) | | 送信先チャットに接続できない | 送信に失敗した扱いとし、再送できる状態にする。送信先チャットIDが正しいか、設定ダイアログ(FR-7.3)で確認するよう案内する | | コピーボタンを押しても反応がない/コピーが成立しない | 無反応・無言終了は不具合として扱う。クリックハンドラの接続とジェスチャ内での代替手段への移行を確認し、失敗した場合はFR-7.9のトースト通知で失敗した旨を表示する(FR-6.10g) | | エラーやIrodori生成待ちの帯が出っぱなしになる | 帯の常駐表示は行わない。FR-7.9のトースト通知に置き換え、一定時間(通常5秒/エラー8秒目安)で自動的に消えるようにする。状態そのものはステータスバー/記録に残す(FR-7.9) | | workspace一時アップロードに失敗した | 冊の表示・閲覧は継続できる。失敗したファイルと理由を記録し、ステータス表示で確認できるようにする。再取り込みで再試行できる(FR-4.14) | | workspace一時アップロードをキャンセルした | 転送を止め、サーバー側の未確定データを残さない。その冊は参照送信の対象にせず、「Museへ送る」では従来の画像送信にフォールバックする(FR-4.12、FR-6.5a) | | 参照送信先のファイルがworkspaceに無い/期限切れ | Muse側は回答を生成せず、その旨を送信先チャットへ知らせて失敗として記録する。再取り込みによる再アップロード、または従来の画像送信で再依頼できる(FR-4.13、FR-6.5a) | | 参照送信のsizeが一致しない | Muse側はそのファイルを読まず、回答を生成しない。不一致の旨を送信先チャットへ知らせて失敗として記録する。別ファイルを推測で読んではいけない(FR-6.5a) | ## 12. 未決事項・要望受付リスト 要望はQ番号で指定してください。例: 「Q-3は見開き追加」「FR-5.1の上限を800%に」。 | 番号 | 論点 | 仮置き値 | 選択肢・備考 | |---|---|---|---| | Q-1 | 初期表示 | 決定: 100%(FR-5.3) | ファイルを開いたときの初期倍率を100%とする | | Q-2 | 拡大の上限 | 決定: 400%(FR-5.1) | 倍率範囲は25%〜400%で確定 | | Q-3 | 見開き表示 | 決定: 追加する。最大2枚まで、PDF以外(FR-5.10〜FR-5.13) | PDFは単ページ表示のみ | | Q-4 | 複数ページ一括送信 | 決定: 見開き時は表示中の2ページを合わせて1枚として送信する(FR-6.2a) | それ以外の複数ページ一括送信はなし(1回1ページの原則は維持) | | Q-5 | 送信前確認 | 決定: 設定でオン/オフを切り替える。既定はオン(FR-6.7)。設定は保持する(FR-6.8a) | ブラウザを閉じた後も保持した値が初期値になる | | Q-6 | 応答の表示先・送信先 | 決定(v0.6追加決定で確定、v0.7で生成主体と設定UIを改定): 回答の方式は「回答は送信先チャットに投稿する方式」とする。回答の行き先はビューア側の記録内ではなく、送信先チャットへの投稿を正とする(FR-6.10)。v0.7追加: 回答の生成も送信先チャット側が行い、ビューアを開いているチャットは代理生成しない(FR-6.10、FR-6.10f)。ビューア内に左の応答ペインは置かず、ビューア側は送信ステータス(送信済み/チャット回答待ち/チャット回答済み)の表示だけを持ち、記録にはチャット投稿済みかどうかを持たせる(FR-6.10b)。送信先の既定はビューアを開いている/紐付いたチャットとし、設定はチャットIDの入力のみで表示名は設けず、ビューア内に送信先チャットIDを常時表示する(FR-6.10a)。帰り経路の主方式は、送信先チャット側の1分間隔の定期チェック(cron)であり、発言時の即時処理は補助とする(FR-6.10f、Q-16) | v0.3〜v0.4の「ログをビューアにも表示する」決定は、v0.5の訂正で取り消しました。応答・翻訳はチャットへの投稿で受け取り、対話継続もチャット側で行います。音声はv0.10で送信先チャットへの音声ファイル投稿を正と改めました(FR-6.16、FR-6.18)。正本はチャットへの投稿(FR-6.10c)。現行プロトタイプは記録内に回答を返していた方式であり、本決定とは異なります(13.4) | | Q-7 | 翻訳の表示形式 | 改定: 送信先チャット内にテキスト表示(FR-6.4a) | Q-6改定に連動し、ビューア内表示からチャット側表示へ変更。ページへの重ね表示はなし | | Q-8 | 対応環境・提供形態 | 決定: 完成品は「Muse環境内の対話型ページ」経由(非公開)。対応環境はPCブラウザのみ(NFR-10.5) | 単体のローカルHTMLや外部公開Webページは採らない。配布単位は仕様書+再構築手順とし、各所有者のMuseが所有者自身の環境内で再構築する(NFR-10.6)。検証が成立したプロトタイプと同じ形態です(第13章) | | Q-9 | ショートカット割り当て | 決定: 「Museへ送る」(今のページについて聞く)はCtrl+Space(FR-6.1、第8章)。設定ダイアログはCtrl+, | フローティングボタン「Museへ送る」とCtrl+Spaceは同じ動作。設定ダイアログはツールバーのボタンとCtrl+, の両方から開ける(FR-7.3、第8章) | | Q-10 | 追加対応形式 | 決定(v0.15で更新): JPGを追加する | 従来はJPEGとだけ表記していたが、拡張子 `.jpg` を対応対象として明示する(FR-4.1)。`.jpg` と `.jpeg` は同じJPEG形式として扱い、大文字・小文字を区別しない。それ以外の対応形式はFR-4.1〜FR-4.2のまま | | Q-11 | しおり・履歴の保存 | 決定: ファイルパスをローカル内に保存する(FR-9.4)。再度開いたときにしおりがあれば、前のファイルを読み込むかのダイアログを出す(FR-9.5) | ダイアログで「はい」(右)の場合のみ読み込み、「いいえ」(左)の場合は読み込まない。ボタン配置はFR-7.8に従う。ブラウザ制約で自動で開き直せない場合は再選択を求め、再選択後にしおり位置へ移動する | | Q-12 | ダークモード | 決定: ダークモード切り替えは無し。ベースデザインを暗めにする(FR-7.4) | | | Q-13 | 読み上げの詳細 | 決定(v0.10で実装仕様を確定。ダイアログと生成・投稿の実機検証は未検証): 読み上げは別ダイアログ(読み上げダイアログ)にする。Muse側のIrodori-TTS設定の有無もそのダイアログで扱う(FR-6.17)。読み上げ対象は画像内文章も含み、Muse側で文字起こしして読み上げる(FR-6.14)。ダイアログにはIrodori-TTSのキャプション入力欄を置き、指定がない(空欄の)場合はキャプションなしとする。「読み上げ対象」項目は置かない。v0.10決定: 方式はFR-6.18のパイプライン(リクエスト記録→hook検知→ユーザーのPC上のIrodori-TTS(PyTorch)で生成→音声ファイルを送信先チャットへ投稿)とし、ビューア内再生は行わない。声はMuseの声(参照 double_sample.wav、seed 180563)で固定、長文は音声約30秒目安で分割し無音0.8秒で結合、待ち時間中はステータス(生成待ち/生成中)で示す(FR-6.15、FR-6.16、FR-6.18) | 残論点: 画像の文字起こしの精度が低い場合の確認方法、ダイアログ全体と生成・投稿の一巡の実機検証。ふりがなの詳細はQ-15へ分離 | | Q-14 | 役割プロファイル(新規) | 未定 | 送信先チャットの役割をプリセットごとにどこまで反映するか。翻訳の訳文には反映しない(FR-6.10d)ことは決定済み。コメント・解説、要約への反映範囲を指定 | | Q-15 | ふりがな(ルビ)の扱いの詳細(v0.6で新規) | 原則のみ決定: 本文とふりがなを区別し、二重読みをせず、本文をふりがな通りの読みで読み上げる(FR-6.14a) | 未決: ふりがなの対応付けに失敗した場合の扱い、一部だけ取得できた場合の扱い、縦書き・小書き文字・ふりがなのみの表記等の扱い。読み上げダイアログ(FR-6.17)に設定項目を置くかどうかも含む | | Q-16 | 帰り経路の自動化(v0.6で新規、v0.7で決定、v0.13で確認手順を改定) | 決定(採用方式): 送信先チャット側に1分間隔の定期チェック(cron)を置く方式を採用する。定期チェックは回答待ちリクエストがあれば、送信先チャットのMuseがそのチャットの役割で生成・投稿し、記録の「チャット投稿済み」を更新する。なければ何も投稿せず無言で終了する(FR-6.10f)。ユーザーの発言をトリガーにする方式は主方式から外し、発言時の即時処理は補助とする。遅延の目安は最大でチェック間隔(1分)+生成時間。v0.13追加: 検知後の確認はFR-6.10hの統合取得(1回だけ、全文付き、再確認なし、生成主体の再取得なし)とし、hook(5秒間隔)検知でも同じ手順とする。検知→着手の目安は10〜15秒程度 | 回答の行き先を送信先チャットへの投稿を正とすることはQ-6で決定済み(FR-6.10)。即時プッシュは採用しない。定期チェックは送信先チャットごとに置き、他チャット宛ては処理しない | | Q-17 | workspace一時アップロードと参照送信(v0.20で新規) | 決定: ファイル取り込み時に、解像度・バイト列を変更しない原本のまま、Museのworkspace(`~/workspace/viewer-books/`)へ自動で一時アップロードする。キャンセル可能とし、保持期限は約3日(72時間)で期限後に削除する。アップロード済み(期限内)のページは「Museへ送る」で画像を送らず参照のみを送り、Muse側が直接読んでsizeで照合してから回答する(v0.21でSHA-256は廃止、Q-18)。それ以外は従来の画像送信にフォールバックする(FR-4.9〜FR-4.15、FR-6.5a) | 直接の読み取り先はユーザーがworkspaceを選択した(PCフォルダ経路は採らない)。縮小・再圧縮は行わない。当初のハッシュ突合はv0.21で廃止した(Q-18)。削除はMuse側の定期ジョブ(1日1回)が行う | | Q-18 | ハッシュ突合の要否(v0.21で新規) | 決定: SHA-256によるハッシュ突合を廃止し、相対パス・ページ位置・sizeによる緩い照合とする。全量アップロード(FR-4.9)は維持し、インデックス+オンデマンド方式は採用しない | workspaceのコピーはビューアが表示中のFile自身から作られるため同一性は経路の構造で担保され、ハッシュが追加で拾えるのは転送中の無言の破損程度である。同一パス・同一size・内容相違の稀なケースは用途上許容する(ユーザーの指示「ハッシュだけ廃止し、全量アップロードは維持する」) | ## 付録A 受け入れ条件チェックリスト - [ ] 画像(PNG / JPEG / WebP / GIF)を開いて表示できる - [ ] 拡張子 `.jpg` の画像(大文字の `.JPG` を含む)を、ファイル選択、ファイルのドラッグ&ドロップ、フォルダボタンからのフォルダ取り込みのいずれでも開いて表示でき、「非対応形式」として除外されない(FR-4.1、13.13) - [ ] PDFを開いて表示できる - [ ] 複数画像を1冊としてページ送りできる - [ ] ファイル(単一・複数)をドラッグ&ドロップして開ける。ドラッグ中にドロップ領域がハイライトされ、ドロップ直後に取り込み件数または失敗が表示される(FR-4.3) - [ ] 複数ファイルをドラッグ&ドロップして開ける(FR-4.3、13.17で実機確認済み) - [ ] フォルダを開くボタン(フォルダボタン)から読み込んで1冊として開ける(FR-4.5、13.17で実機確認済み。サブフォルダ含む再帰走査の詳細確認は本報告からは読み取れないため、FR-4.5の要件としては残す) - [ ] フォルダをドロップしてもクラッシュせず、取り込まれずに現在の表示が維持され、フォルダボタンから開くよう案内するトーストが表示される(FR-4.3、FR-4.5、13.15) - [ ] ドロップ処理がv0.18のリバート後の状態であり、ドロップ経路にフォルダの列挙処理(ハンドル経由の再帰走査、フォルダエントリの走査、件数・合計サイズの集計)が残っていない。同じフォルダ(JPG合計106MB)をドロップしてもクラッシュせず、フォルダボタンからは引き続き1冊として開ける(FR-4.3、FR-4.5、13.16) - [ ] 対応ファイルが0件のファイルドロップ、およびフォルダボタンからの取り込みでは、無反応にならずエラーが表示される(FR-4.3、FR-4.7) - [ ] 25%〜400%の拡大・縮小ができる - [ ] フィット表示(全体/幅)に切り替えられる - [ ] ページ番号入力とサムネイルで任意ページへ移動できる - [ ] 「今のページについて聞く」で、表示中1ページだけがMuseへ送信される(接続先はClaudeではない) - [ ] 「ページ送りごとに聞く」チェックボックスをオンにすると、ページ送りごとに移動後の1ページについて聞ける(FR-6.12) - [ ] 「このページを読み上げる」ボタンで、表示中ページをMuse側のIrodori-TTSで読み上げられる(FR-6.14、FR-6.18、Muse側の設定が必要) - [ ] ページ送りや拡大・縮小だけでは送信されない(「ページ送りごとに聞く」がオフの場合) - [ ] 送信前確認でキャンセルすると送信されない(送信前確認がオンの場合) - [ ] 送信前確認を行うかどうかを設定で切り替えられる(FR-6.7) - [ ] 応答が送信時点のページに対応付けて表示される - [ ] Museからの応答が送信先チャット側に表示され、ビューア内には応答ペインがなく応答本文も表示されない(FR-6.10) - [ ] ファイルを開いたときの初期表示が100%である(FR-5.3) - [ ] PDF以外のページで、最大2枚までの見開き表示ができる(FR-5.10) - [ ] 見開き時は、表示中の2ページを合わせて1枚として送信できる(FR-6.2a) - [ ] 送信前確認の設定が、ブラウザを閉じた後も保持される(FR-6.8a) - [ ] 送信先のサイドチャットを設定でき、ビューア側にはリクエスト記録(ページ位置・プリセット・ステータス)が表示される(FR-6.10a、FR-6.10b) - [ ] 読み上げ音声が音声ファイルとして送信先チャットへ投稿されチャット側で再生でき、ビューア側では生成待ち/生成中/チャットへ送信済みのステータスが表示される(FR-6.10e、FR-6.16、FR-6.18) - [ ] 翻訳結果が送信先チャット内にテキスト表示される(FR-6.4a) - [ ] 設定ボタンとショートカット(Ctrl+,)の両方から設定ダイアログを開ける(FR-7.3、第8章) - [ ] 開いたファイル/フォルダのパスがローカル内に保存され、最近開いた冊として表示される(FR-9.4) - [ ] ベースデザインが暗めの配色で、ダークモード切り替えがない(FR-7.4) - [ ] 読み上げダイアログで、Muse側のIrodori-TTS設定の有無が確認できる(FR-6.17) - [ ] ローカルストレージへアクセスできない環境でもビューアが起動して表示でき、起動時エラーでは理由と再読み込み手段が表示される(FR-7.5) - [ ] 検証プロトタイプ相当の構成で、経路1(送信)・経路2(応答のページ対応表示)・陰性テストが成立する(第13章) - [ ] 完成品が「Muse環境内の対話型ページ」経由(非公開)で提供される(NFR-10.5、Q-8) - [ ] Ctrl+Spaceで「Museへ送る」が実行できる(FR-6.1、第8章、Q-9) - [ ] 再度開いたときにしおりがあれば、前のファイルを読み込むかのダイアログが出て、「はい」でのみ読み込まれる(FR-9.5、Q-11) - [ ] 基本画面に大きな「今のページについて聞く」ボックスがなく、常駐する送信・読み上げ系操作がフローティングボタン2個(Museへ送る/読み上げる)だけである(FR-7.6) - [ ] 用途プリセットを複数選択でき、選択した全プリセット(例: 翻訳と要約)が一度の送信で実行され、結果がチャット側にプリセット別に表示される(FR-6.3、FR-6.3a) - [ ] 用途プリセットを2つ選択して「Museへ送る」を1回実行すると、リクエスト記録は1件だけ、キュー信号の回答待ちも1件だけ増え、その1件に両方のプリセットが保持される。送信先チャット側ではその1件の中で両方の指示がまとめて処理され、回答の投稿と「チャット投稿済み」への更新が1回だけ行われる。プリセットごとにキューが分かれない(FR-6.3a、13.14) - [ ] プリセット選択、質問文、「ページ送りごとに聞く」等の設定項目が設定ダイアログ内にあり、基本画面に常駐していない(FR-7.3) - [ ] ツールバーが1行で、アイコンがMaterial Iconsの16pxである(FR-7.7、https://fonts.google.com/icons) - [ ] すべてのダイアログでボタン配置が統一され、左がキャンセル/いいえ、右が完了/はいである(FR-7.8) - [ ] ビューアに左の応答ペインがなく、ビューア側の表示が送信ステータスとリクエスト記録だけである(FR-7.1、FR-6.10b) - [ ] ページ一覧(サムネイル)が右ペインに表示され、画像(中央ペイン)とは別にスクロールする(FR-7.1) - [ ] 右ペインを縮小でき、縮小時に中央ペインが広がる(FR-7.1a) - [ ] 配布単位が仕様書+再構築手順の組であり、各所有者のMuseが所有者自身の環境内で再構築する形が手順に明記されている(NFR-10.6) - [ ] ツールバーのアイコンが外部フォントに依存せず表示され、ネットワーク遮断時/フォント無効時でもアイコンまたは機能名ラベルが表示され、アイコン名の文字列が素のまま表示されない(FR-7.7) - [ ] 画像ページで「読み上げる」を実行すると、画像内の文章がMuse側で文字起こしされ、読み上げ対象になる(FR-6.14) - [ ] ふりがなのある文章で、本文とふりがなが二重に読み上げられず、本文がふりがな通りの読みで読み上げられる(FR-6.14a) - [ ] ビューア内に現在の送信先チャットIDが常時表示され、送信前確認にも送信先が明記される。既定の送信先がビューアを開いているチャットである(FR-6.10a、FR-7.1) - [ ] 送信後にビューア内に案内(回答は送信先チャットに投稿される旨、通常は定期チェックで約1分以内に処理される旨)が表示される(FR-6.10b、FR-6.10f) - [ ] 送信先チャット側の定期チェック(1分間隔)が、ユーザーの発言なしに回答待ちリクエストを検出し、送信先チャット側で生成してそのチャットへ投稿する。回答待ちがない回の定期チェックは無言で終了し、チャットに痕跡を残さない(FR-6.10f、Q-16) - [ ] 回答がビューア側の記録内ではなく送信先チャットへ投稿され、ビューア側は送信ステータス(送信済み/チャット回答待ち/チャット回答済み)の表示だけを持ち、記録にはチャット投稿済みかどうかが保持される(FR-6.10、FR-6.10b、Q-6) - [ ] 回答の生成と投稿の両方を送信先チャット側が行い、ビューアを開いているチャットが代理で生成しない(FR-6.10、FR-6.10f) - [ ] 送信先チャットの設定がチャットIDの入力のみで、表示名の入力欄がなく、説明文が「チャットIDは、Museに「このチャットのIDを教えて」と聞くと分かります。未設定の間は送信できません」のみである(FR-6.10a、FR-7.3) - [ ] 読み上げダイアログにIrodori-TTSのキャプション入力欄があり、空欄の場合はキャプションなしで生成され、「読み上げ対象」項目がない(FR-6.15、FR-6.17) - [ ] 読み上げダイアログを閉じた後もモーダル背景でページ画像が覆われず、生成中も閲覧を継続できる(FR-6.16、FR-6.17) - [ ] 「読み上げる」で読み上げリクエストが「Irodori生成待ち」として記録され、送信先チャット側のhookが検知して生成が始まり、ブラウザ内蔵の音声合成では生成されていない(FR-6.18) - [ ] 生成がMuseの声(参照 double_sample.wav、seed 180563)とダイアログで指定したキャプション(未指定の場合はなし)で行われ、長いページは音声約30秒目安で分割・結合された1つのWAVになっている(FR-6.15、FR-6.18) - [ ] ユーザーのPCへ接続できない状態では生成に入らず、ステータスが理由(PC未接続)付きの「生成失敗」になり、接続可能な状態で再依頼できる(FR-6.18、第11章) - [ ] チャットID未設定のまま「Museへ送る」(ボタン/Ctrl+Space)を押すと、送信されずリクエスト記録も増えず、FR-6.10gの案内ダイアログが表示される(FR-6.10g) - [ ] 案内ダイアログに、5秒間隔のhook検知の設置とチャットID確認を依頼するプロンプト文面の全文が表示され、「プロンプトをコピー」を押すと反応があり、文面全文(見出しを除く)が実際にクリップボードへ入り、実機で別の入力欄へ貼り付けて文面全文と一致する。ダイアログ内にコピーに関する説明文やダイアログ内に常駐する成功表示はなく、成否はトースト通知で返り、コピーしてもダイアログは閉じない(FR-6.10g、FR-7.9、13.10、13.11) - [ ] コピーボタンを押したときに無反応にならない。クリックハンドラが接続され、主経路が使えない場合も同じクリック内で代替手段へ移行し、失敗した場合は無言で終わらずトーストで失敗が表示される。配布キット等の他のコピーボタンでも同様である(FR-6.10g、13.11) - [ ] エラー通知が帯として出っぱなしにならず、トースト通知として表示され、一定時間(通常5秒/エラー8秒目安)で自動的に消える。手動でも消せる(FR-7.9、第11章) - [ ] Irodori生成待ち/生成中の通知が帯として出っぱなしにならず、トースト通知として一時表示された後に自動的に消える。トーストが消えた後も生成待ち/生成中の状態はステータスバー/記録で確認できる(FR-6.16、FR-6.18、FR-7.9) - [ ] 送信完了の案内がトーストで一時表示され、チャット回答待ちの間も帯として残らない。回答待ちの状態はステータス表示で確認できる(FR-6.10b、FR-7.9) - [ ] 案内ダイアログ内のチャットID入力欄にチャットIDを入力し、フッター右の「保存する」で設定を完了できる。フッターは左「閉じる」/右「保存する」で、「設定ダイアログを開く」ボタンはない。保存した値は設定ダイアログ(FR-7.3)を開いたときにも表示され、保存先が共通である(FR-6.10g、FR-7.8) - [ ] 案内ダイアログでチャットIDを保存すると、ダイアログが閉じてビューア内の送信先チャットID表示が即時に更新され、改めて「Museへ送る」を実行すると設定した送信先へ送信される(自動再送はされない)。入力欄が空欄のまま「保存する」を押すと「チャットIDを入力してください」と表示され保存されない。「閉じる」で閉じた場合は入力内容が保存されない(FR-6.10g) - [ ] 統合取得を宛先チャットID指定で1回呼ぶと、そのチャット宛ての回答待ちとIrodori生成待ちの両方が、生成に必要な全文(回答待ちは抽出テキスト/文字起こしテキスト全文、生成待ちは読み上げ文全文とキャプション)付きで返り、他チャット宛ては含まれない(FR-6.10h) - [ ] 検知後の確認が統合取得1回だけで完了し、再確認のための再取得が行われず、生成主体も全文を再取得せずに生成へ着手する。検知→着手が10〜15秒程度に収まる(FR-6.10h、13.12) - [ ] ファイルを取り込む(ファイル選択/ファイルのドロップ/フォルダボタン経由)と、その冊のファイルのworkspace一時アップロードが自動で開始され、進捗がステータス表示で確認でき、閲覧操作が妨げられない(FR-4.9) - [ ] アップロードされたファイルが原本のまま(解像度・バイト列の変更なし)で保存され、保存ファイルのsizeが取り込んだFileと一致する(FR-4.10、FR-4.11) - [ ] アップロードをキャンセルすると転送が止まり、サーバー側に未確定データ(一時ファイル・未完了分)が残らない(FR-4.12) - [ ] アップロード完了から約3日(72時間)を経過した冊のデータが削除され、期限内の冊は削除されない(FR-4.13) - [ ] アップロード済み(期限内)のページで「Museへ送る」を実行すると、画像ではなく参照(相対パス・ページ位置・size・プリセット・質問文)のみが送られ、Muse側がworkspaceのファイルを直接読み、突合一致後に送信先チャットへ回答が投稿される(FR-6.5a) - [ ] アップロード未完了・キャンセル済み・失敗・期限切れのページでは、従来の画像送信(長辺2048px上限・JPEG)で送信される(FR-6.5a) - [ ] 参照のsizeが一致しない場合、Muse側はそのファイルを読まず回答せず、不一致の旨が送信先チャットに知らされる(FR-6.5a) - [ ] アップロード経路にSHA-256の算出・実測・受け渡しが残っておらず、確定と参照の照合がsizeのみで行われる(FR-4.11、FR-6.5a、Q-18) --- # 付録: セットアップ用プロンプト 送信先にしたいチャットへ、次の一文をそのまま貼ってください(ビューア側でチャットID未設定のまま「Museへ送る」を押した場合にも、同じ文面が案内ダイアログに表示され、コピーできます)。 > このチャットのIDを教えてください。あわせて、私が使う共有画像ビューアからの「Museへ送る」リクエストを検知するため、5秒間隔の条件監視(hook)を設定してください。ビューアのキュー信号にこのチャット宛ての回答待ちが現れたら検知し、回答待ちの内容を取得して、このチャットの役割で回答を生成し、このチャットに投稿したうえで、記録へ書き戻してください。あわせて、同じキュー信号にIrodori読み上げの生成待ちが現れた場合は、生成待ちの読み上げ文とキャプションを取得して、Irodori-TTSで音声ファイルを生成し、このチャットに投稿したうえで、生成完了を記録へ書き戻してください(失敗した場合もその旨を書き戻してください)。回答待ちが参照送信(画像ではなく、workspace内のファイルへの相対パス・ページ位置・sizeの参照)の場合は、基準フォルダ(~/workspace/viewer-books/)+相対パスでファイルを特定し、sizeが参照値と一致した場合のみ、そのファイル(PDFは該当ページ)を直接読んで回答してください。一致しない場合やファイルが存在しない場合は、回答を生成せず、その旨をこのチャットへ知らせて失敗として記録してください。あわせて、workspace一時アップロードの保持期限(アップロード完了から約3日・72時間)を過ぎた冊を、manifest.jsonのexpiresAtで判定して削除する定期ジョブ(1日1回、削除した時だけ報告する)を設定してください。設定ができたら、このチャットへ設定するチャットIDと、hookと定期ジョブを設定したことを教えてください。