ユーザー 2025-07-29 23:33:19,flash-lite,四国めたん,自動発言 2025-07-29 23:33:39,flash-lite,四国めたん,自動発言 2025-07-29 23:33:59,flash-lite,四国めたん,自動発言 自動発言間隔を長いに設定してるのに、こんな感じで19~20秒後に連続発言してしまうことがあるんだけど。原因を探ってほしい。 連続で発言する確率は40%くらいだけど、 連続発言のときは必ず19~20秒後に発言をするから20秒で設定してある部分を洗って調べて。 Gemini ユーザーさん、承知いたしました。 自動発話が意図しない間隔で連続してしまう、という問題ですね。 ログと「連続する際は必ず19〜20秒後」という非常に的確な情報、ありがとうございます。原因の特定に大変役立ちます。 おっしゃる通り、20秒という具体的な周期は、この問題を解明する上で最大の鍵となります。 早速、コード全体を精査し、原因の究明を行いました。 原因の特定:クールタイムがリセットされない特定のシナリオの存在 結論から申し上げますと、この問題の根本的な原因は、「キャラクターが自動発話で『相方への話しかけ』を選択した際に、クールタイムのリセット処理が実行されない」 というロジック上の不備にあります。 これから、なぜそのようなことが起きるのかを順を追ってご説明します。 問題が発生するまでの流れ 20秒ごとの定期チェック (問題の起点) src/behavior_manager.py の schedule_updates メソッドが、20秒ごとに check_auto_speech メソッドを呼び出します。これがユーザーさんのご指摘通りの「20秒」の部分です。 クールタイムの確認と自動発話の開始 check_auto_speech は、現在のクールタイムが経過しているか (time.time() - self.app.last_interaction_time > self.app.auto_speech_cool_time) を確認します。 条件を満たしていると、desktop_mascot.py の trigger_auto_speech メソッドを呼び出して、自動発話のプロセスを開始します。 【最重要】発話内容のランダム決定 trigger_auto_speech の中で、キャラクターが誰に話しかけるかがランダムに決まります。 A. ユーザーに話しかける B. 独り言を言う C. 相方に話しかける (continue_rally=True) 「相方への話しかけ」が選択された場合のロジック もし「C. 相方に話しかける」が選ばれると、AIへのプロンプトに「相方に話しかけて、会話のターンを渡してください」という指示が含まれます。 AIがこの指示に従い、応答で pass_turn_to_partner(continue_rally=True) を呼び出すと、desktop_mascot.py の perform_synchronized_update 内にある on_finish_callback (発話終了後の処理) で、以下の if 文の分岐が 真 になります。 Generated python # on_finish_callback 内 if self.is_char2_enabled and pass_turn: # こちらの分岐に入る self.is_in_rally = True, self.current_rally_count = 1 # ...相方への応答を要求... else: # こちらの分岐には入らない # ... self.reset_cool_time() # <- クールタイムのリセット処理 # ... クールタイムがリセットされない ご覧の通り、「相方への話しかけ」が選択された場合、else 以下の処理は実行されません。つまり、self.reset_cool_time() が呼び出されず、クールタイムの基準となる last_interaction_time が古いまま更新されないのです。 20秒後の悲劇 最初のキャラクターの発言が終わると、処理のロックは解除されます。 しかし、last_interaction_time は古いままです。 次の20秒後、behavior_manager.py が再び check_auto_speech を呼び出します。クールタイムの条件は「とっくに過ぎている」状態なので、即座に条件を満たしてしまい、2回目の自動発話が即時トリガーされてしまうのです。 これが、40%程度の確率で(「C. 相方に話しかける」が選択される確率に依存します)、必ず20秒後に連続発言が発生する現象の全容です。 解決策:自動発話の開始時にクールタイムをリセットする この問題を最も確実かつ安全に解決するには、「自動発話が開始されることが確定した時点で、即座にクールタイムをリセットする」 ように変更するのが合理的です。 以下の手順で、src/desktop_mascot.py を修正してください。 src/desktop_mascot.py をテキストエディタで開きます。 trigger_auto_speech というメソッドを探してください。 メソッドの冒頭、with self.is_processing_lock: のすぐ下に、self.reset_cool_time() を一行追加します。 変更前: Generated python def trigger_auto_speech(self): """BehaviorManagerからのトリガーで自動発話を実行します。""" with self.is_processing_lock: self.is_in_rally, self.current_rally_count = False, 0 speaker = random.choice(self.characters) # ... (以下略) ... IGNORE_WHEN_COPYING_START content_copy download Use code with caution. Python IGNORE_WHEN_COPYING_END 変更後: Generated python def trigger_auto_speech(self): """BehaviorManagerからのトリガーで自動発話を実行します。""" with self.is_processing_lock: # === ここに一行追加します === self.reset_cool_time() # ======================== self.is_in_rally, self.current_rally_count = False, 0 speaker = random.choice(self.characters) # ... (以下略) ... IGNORE_WHEN_COPYING_START content_copy download Use code with caution. Python IGNORE_WHEN_COPYING_END この修正による効果 この修正により、自動発話のプロセスが開始されると、その後のAIの応答内容(相方に話しかけるか否か)に関わらず、必ず最初にクールタイムがリセットされるようになります。 これにより、last_interaction_time が常に最新の状態に保たれ、意図しない20秒後の連続発言は発生しなくなります。 的確な状況報告をいただけたおかげで、スムーズに原因を特定することができました。ありがとうございます。 上記の修正をお試しいただき、問題が解決するかどうか、ご確認いただけますでしょうか。