tegnike / aituber-kit

AITuber Kit
https://aituber-kit.vercel.app
MIT License
259 stars 54 forks source link

変な音声が再生される #91

Closed tegnike closed 3 months ago

tegnike commented 3 months ago

なぜかTTSサービスに「..」という文字列が渡され、変な音声が作成されてしまう事象が発生している。 文字のトリミング処理がうまくいっていない可能性あり。 「..」のような非発音文字列はTTSサービスに渡さないような処理を挟むのが良いかもしれない。

github-actions[bot] commented 3 months ago

Issue分析結果:

[
  {
    "file_path": "src/features/messages/speakCharacter.ts",
    "reason": "このファイルは音声合成機能を提供しており、「..」のような非発音文字列の処理に関係している可能性があります。"
  },
  {
    "file_path": "src/features/lipSync/lipSync.ts",
    "reason": "リップシンク機能を提供するファイルで、音声データの処理に関わっているため、問題の原因が含まれている可能性があります。"
  },
  {
    "file_path": "src/features/chat/aiChatFactory.ts",
    "reason": "AIチャットの応答を生成する部分で、不適切な文字列が含まれる可能性があります。"
  },
  {
    "file_path": "src/pages/api/tts.ts",
    "reason": "Text-to-Speech APIのエンドポイントであり、音声生成の処理に直接関わっています。"
  },
  {
    "file_path": "src/features/koeiromap/koeiromap.ts",
    "reason": "Koeiromapという音声合成APIを使用しており、問題の原因となる可能性があります。"
  },
  {
    "file_path": "src/features/googletts/googletts.ts",
    "reason": "Google Text-to-Speech APIを使用しており、音声生成に関わっています。"
  },
  {
    "file_path": "src/pages/api/stylebertvits2.ts",
    "reason": "StyleBertVITS2という音声合成APIを使用しており、問題の原因となる可能性があります。"
  },
  {
    "file_path": "src/features/messages/synthesizeVoice.ts",
    "reason": "音声合成機能を提供するファイルで、入力テキストの処理に関わっている可能性があります。"
  },
  {
    "file_path": "src/features/messages/synthesizeVoiceGoogle.ts",
    "reason": "Google Text-to-Speech APIを使用した音声合成を行うファイルで、入力テキストの処理に関わっています。"
  },
  {
    "file_path": "src/features/messages/synthesizeStyleBertVITS2.ts",
    "reason": "StyleBertVITS2 APIを使用した音声合成を行うファイルで、入力テキストの処理に関わっています。"
  },
  {
    "file_path": "src/pages/index.tsx",
    "reason": "アプリケーションのメインコンポーネントであり、音声生成処理の呼び出しや、生成された音声の再生を行っている可能性があります。"
  },
  {
    "file_path": "src/components/messageInput.tsx",
    "reason": "ユーザー入力を処理するコンポーネントで、不適切な文字列が入力される可能性があります。"
  },
  {
    "file_path": "src/features/messages/messages.ts",
    "reason": "メッセージの処理や変換を行うファイルで、「..」のような文字列の扱いに関係している可能性があります。"
  },
  {
    "file_path": "src/utils/reduceTalkStyle.ts",
    "reason": "音声の話し方(声色)のパラメーターを制限する機能を提供しており、テキスト処理に関わっている可能性があります。"
  }
]

コード改善案:

コードを分析すると、「..」という文字列が音声に渡される問題は、speakCharacter関数内の文章分割処理に原因がある可能性が高いです。具体的には、src/features/messages/speakCharacter.tsファイルの以下の部分を改善する必要があります。

// 返答を一文単位で切り出して処理する
const sentenceMatch = receivedMessage.match(/^(.+?[。..!?!?\n]|.{20,}[、,])/);
if (sentenceMatch?.[0]) {
  let sentence = sentenceMatch[0];
  // 区切った文字をsentencesに追加
  sentences.push(sentence);
  // 区切った文字の残りでreceivedMessageを更新
  receivedMessage = receivedMessage.slice(sentence.length).trimStart();

  // 発話不要/不可能な文字列だった場合はスキップ
  if (
    !sentence.replace(/^[\s\[\(\{「[(【『〈《〔{«‹〘〚〛〙›»〕》〉』】)]」\}\)\]]+$/g, "")
  ) {
    continue;
  }

  // タグと返答を結合(音声再生で使用される)
  let aiText = `${tag} ${sentence}`;
  // ...
}

この部分を以下のように改善することで、「..」のような非発音文字列を除外できます:

// 返答を一文単位で切り出して処理する
const sentenceMatch = receivedMessage.match(/^(.+?[。..!?!?\n]|.{20,}[、,])/);
if (sentenceMatch?.[0]) {
  let sentence = sentenceMatch[0];
  // 区切った文字をsentencesに追加
  sentences.push(sentence);
  // 区切った文字の残りでreceivedMessageを更新
  receivedMessage = receivedMessage.slice(sentence.length).trimStart();

  // 発話不要/不可能な文字列だった場合はスキップ
  if (
    !sentence.replace(/^[\s\[\(\{「[(【『〈《〔{«‹〘〚〛〙›»〕》〉』】)]」\}\)\]]+$/g, "").trim() ||
    sentence.trim() === ".." || // 「..」をスキップ
    !/\S/.test(sentence) // 空白のみの文字列をスキップ
  ) {
    continue;
  }

  // タグと返答を結合(音声再生で使用される)
  let aiText = `${tag} ${sentence.trim()}`; // 前後の空白を削除
  // ...
}

この改善により、以下の効果が期待できます:

  1. 「..」のような非発音文字列を明示的にスキップします。
  2. 空白のみの文字列をスキップします。
  3. 文章の前後の余分な空白を削除します。

これらの変更により、TTSサービスに渡される文字列がより適切になり、変な音声が再生される問題が解決されるはずです。また、必要に応じて他の非発音文字列もスキップリストに追加することができます。