Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Google TTS Error: Could not load the default credentials #178

Closed
shilik opened this issue Oct 14, 2024 · 11 comments
Closed

Google TTS Error: Could not load the default credentials #178

shilik opened this issue Oct 14, 2024 · 11 comments

Comments

@shilik
Copy link

shilik commented Oct 14, 2024

@tegnike

ご指示の通りにgoogle cloud でcredentials.jsonを生成し、aituber-kit に入れると、以下のようなエラーが出てきました。
⨯ Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information. at GoogleAuth.getApplicationDefaultAsync (/home/ilik/aituber-kit/node_modules/google-auth-library/build/src/auth/googleauth.js:292:15) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async GoogleAuth._GoogleAuth_determineClient (/home/ilik/aituber-kit/node_modules/google-auth-library/build/src/auth/googleauth.js:839:32) at async GoogleAuth.getClient (/home/ilik/aituber-kit/node_modules/google-auth-library/build/src/auth/googleauth.js:703:20) at async GrpcClient._getCredentials (/home/ilik/aituber-kit/node_modules/google-gax/build/src/grpc.js:145:24) at async GrpcClient.createStub (/home/ilik/aituber-kit/node_modules/google-gax/build/src/grpc.js:318:23) { page: '/api/tts' }

どうすればいいか、教えていただけないようでしょうか

Copy link

Issue分析結果:

[
  {
    "file_path": "src/pages/api/tts.ts",
    "reason": "このファイルはGoogle TTSを使用して音声を生成するAPIルートを定義しています。エラーメッセージにあるGoogle TTSの認証問題に直接関連している可能性が高いです。"
  },
  {
    "file_path": "src/features/googletts/googletts.ts",
    "reason": "このファイルはGoogle Cloud Text-to-Speech APIを使用して音声合成を行う機能を提供しています。認証エラーの原因がこのファイルの実装にある可能性があります。"
  },
  {
    "file_path": ".env",
    "reason": "環境変数ファイルにGoogle Cloud認証情報が正しく設定されていない可能性があります。credentials.jsonのパスや他の認証関連の変数がここで設定されているかもしれません。"
  },
  {
    "file_path": "package.json",
    "reason": "@google-cloud/text-to-speechパッケージが依存関係に含まれているか、またはバージョンが適切かを確認する必要があります。"
  },
  {
    "file_path": "src/pages/index.tsx",
    "reason": "メインページコンポーネントでGoogle TTSの初期化や使用が行われている可能性があり、認証エラーの原因となる箇所が含まれているかもしれません。"
  },
  {
    "file_path": "src/features/messages/speakCharacter.ts",
    "reason": "このファイルは音声合成機能を提供しており、Google TTSを使用している可能性があります。認証エラーはここから発生している可能性があります。"
  },
  {
    "file_path": "src/components/settings.tsx",
    "reason": "設定コンポーネントでGoogle TTSの設定やAPIキーの入力が行われている可能性があり、認証情報の取り扱いに問題がある可能性があります。"
  },
  {
    "file_path": "next.config.js",
    "reason": "Next.jsの設定ファイルで、環境変数やGoogle Cloud認証に関する設定が行われている可能性があります。"
  },
  {
    "file_path": ".gitignore",
    "reason": "credentials.jsonファイルが.gitignoreに含まれているか確認する必要があります。含まれていない場合、誤ってリポジトリにコミットされる可能性があります。"
  },
  {
    "file_path": "src/features/chat/aiChatFactory.ts",
    "reason": "AIチャットファクトリーでGoogle関連のサービスの初期化や設定が行われている可能性があり、認証エラーの原因となる箇所が含まれているかもしれません。"
  },
  {
    "file_path": "src/features/chat/googleChat.ts",
    "reason": "Google関連のチャット機能を実装しているファイルで、認証処理が含まれている可能性があります。同様の認証メカニズムがTTSにも使用されているかもしれません。"
  },
  {
    "file_path": "Dockerfile",
    "reason": "Dockerfileで環境変数やGoogle Cloud SDKのセットアップが行われている場合、認証情報の取り扱いに問題がある可能性があります。"
  },
  {
    "file_path": "src/utils/buildUrl.ts",
    "reason": "URL構築ユーティリティがGoogle Cloud関連のURLを生成している可能性があり、認証エラーの原因となる不正なURLが生成されているかもしれません。"
  },
  {
    "file_path": "src/features/constants/systemPromptConstants.ts",
    "reason": "システムプロンプトの定数定義にGoogle TTSの使用や設定に関する情報が含まれている可能性があります。"
  },
  {
    "file_path": "src/components/menu.tsx",
    "reason": "メニューコンポーネントでGoogle TTSの設定や切り替えが行われている可能性があり、認証情報の取り扱いに問題がある可能性があります。"
  }
]

コード改善案:

このIssueは、Google Cloud Text-to-Speech APIの認証に関する問題を報告しています。エラーメッセージから、デフォルトの認証情報が正しく読み込まれていないことがわかります。コードを分析した結果、以下の点が問題の原因として考えられます:
  1. 環境変数の設定が不適切または不足している可能性があります。
  2. Google Cloud SDKの初期化処理が適切に行われていない可能性があります。
  3. credentials.jsonファイルの配置場所や読み込み方法が正しくない可能性があります。

また、全体的なコード構造を見ると、環境変数の管理や外部サービスの設定に改善の余地があります。

1. 環境変数の設定と管理の改善 説明: 現在の.envファイルには、Google Cloud関連の環境変数が不足しています。GOOGLE_APPLICATION_CREDENTIALSを追加することで、認証情報のファイルパスを明示的に指定できます。

改善後のコード例:

# .env
GOOGLE_APPLICATION_CREDENTIALS=/path/to/your/credentials.json
GOOGLE_CLOUD_PROJECT=your-project-id
  1. Google Cloud SDKの初期化処理の追加
    説明: アプリケーションの起動時にGoogle Cloud SDKを適切に初期化することで、認証の問題を回避できる可能性があります。

    改善後のコード例:

    // src/features/googletts/googletts.ts
    import { TextToSpeechClient } from '@google-cloud/text-to-speech';
    
    let client: TextToSpeechClient;
    
    export function initializeGoogleTTS() {
      client = new TextToSpeechClient();
    }
    
    export async function googleTts(message: string, ttsType: string) {
      if (!client) {
        throw new Error('Google TTS client is not initialized');
      }
    
      // 既存のコード...
    }
  2. エラーハンドリングの改善
    説明: 現在のコードでは、Google TTSのエラーが適切に処理されていません。エラーをキャッチし、より詳細な情報をログに記録することで、デバッグが容易になります。

    改善後のコード例:

    // src/features/messages/speakCharacter.ts
    export const fetchAudioGoogle = async (
      talk: Talk,
      ttsType: string
    ): Promise<ArrayBuffer> => {
      try {
        const ttsVoice = await synthesizeVoiceGoogleApi(talk.message, ttsType);
        const uint8Array = new Uint8Array(ttsVoice.audio.data);
        return uint8Array.buffer;
      } catch (error) {
        console.error('Google TTS error:', error);
        throw new Error('Failed to fetch audio from Google TTS');
      }
    };
  3. 認証情報の動的読み込み
    説明: credentials.jsonファイルを動的に読み込むことで、開発環境と本番環境で異なる設定を使用できるようになります。

    改善後のコード例:

    // src/features/googletts/googletts.ts
    import { TextToSpeechClient } from '@google-cloud/text-to-speech';
    import fs from 'fs';
    
    export function getGoogleTTSClient() {
      const credentialsPath = process.env.GOOGLE_APPLICATION_CREDENTIALS;
      if (credentialsPath && fs.existsSync(credentialsPath)) {
        const credentials = JSON.parse(fs.readFileSync(credentialsPath, 'utf8'));
        return new TextToSpeechClient({ credentials });
      }
      return new TextToSpeechClient(); // デフォルトの認証を使用
    }
  4. Docker環境での認証情報の取り扱い改善
    説明: Dockerコンテナ内で認証情報を安全に扱うために、ビルド時に認証情報をコピーするのではなく、実行時にマウントする方法を採用します。

    改善後のコード例:

    # Dockerfile
    FROM node:20
    
    WORKDIR /app
    
    COPY package*.json ./
    RUN npm ci
    COPY . .
    RUN npm run build
    
    EXPOSE 3000
    
    CMD ["npm", "start"]
    
    # docker-compose.yml
    version: '3'
    services:
      app:
        build: .
        ports:
          - "3000:3000"
        volumes:
          - ./credentials.json:/app/credentials.json:ro
        environment:
          - GOOGLE_APPLICATION_CREDENTIALS=/app/credentials.json
これらの改善を実施することで、Google Cloud Text-to-Speech APIの認証問題が解決される可能性が高くなります。環境変数の適切な設定、Google Cloud SDKの初期化、エラーハンドリングの強化、そして認証情報の安全な取り扱いにより、アプリケーションの安定性と保守性が向上します。

特に、認証情報の動的読み込みと Docker 環境での改善は、開発環境と本番環境の差異を吸収し、セキュリティを向上させる効果があります。これらの変更により、開発者はより効率的にアプリケーションを開発・デプロイできるようになり、認証関連の問題のデバッグも容易になるでしょう。

最後に、これらの改善はGoogle Cloud サービスの利用に限らず、他の外部サービスとの連携にも応用できる汎用的なアプローチです。これにより、プロジェクト全体のコード品質と保守性が向上することが期待されます。

@shilik
Copy link
Author

shilik commented Oct 14, 2024

⨯ Error: 3 INVALID_ARGUMENT: Requested language code 'en-US' doesn't match the voice 'ja-JP-Neural2-C''s language code 'ja-jp'. Either pick a different voice, or change the requested language code to ja-jp. at callErrorFromStatus (/home/shilik/aituber-kit/node_modules/@grpc/grpc-js/build/src/call.js:31:19) at Object.onReceiveStatus (/home/shilik/aituber-kit/node_modules/@grpc/grpc-js/build/src/client.js:193:76) at Object.onReceiveStatus (/home/shilik/aituber-kit/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:360:141) at Object.onReceiveStatus (/home/shilik/aituber-kit/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:323:181) at /home/shilik/aituber-kit/node_modules/@grpc/grpc-js/build/src/resolving-call.js:129:78 at process.processTicksAndRejections (node:internal/process/task_queues:77:11) for call at at ServiceClientImpl.makeUnaryRequest (/home/shilik/aituber-kit/node_modules/@grpc/grpc-js/build/src/client.js:161:32) at ServiceClientImpl.<anonymous> (/home/shilik/aituber-kit/node_modules/@grpc/grpc-js/build/src/make-client.js:105:19) at /home/shilik/aituber-kit/node_modules/@google-cloud/text-to-speech/build/src/v1/text_to_speech_client.js:210:29 at /home/shilik/aituber-kit/node_modules/google-gax/build/src/normalCalls/timeout.js:44:16 at repeat (/home/shilik/aituber-kit/node_modules/google-gax/build/src/normalCalls/retries.js:82:25) at /home/shilik/aituber-kit/node_modules/google-gax/build/src/normalCalls/retries.js:125:13 at OngoingCallPromise.call (/home/shilik/aituber-kit/node_modules/google-gax/build/src/call.js:67:27) at NormalApiCaller.call (/home/shilik/aituber-kit/node_modules/google-gax/build/src/normalCalls/normalApiCaller.js:34:19) at /home/shilik/aituber-kit/node_modules/google-gax/build/src/createApiCall.js:112:30 at process.processTicksAndRejections (node:internal/process/task_queues:95:5) { code: 3, details: "Requested language code 'en-US' doesn't match the voice 'ja-JP-Neural2-C''s language code 'ja-jp'. Either pick a different voice, or change the requested language code to ja-jp.", metadata: Metadata { internalRepr: Map(0) {}, options: {} }, note: 'Exception occurred in retry method that was not classified as transient', page: '/api/tts' } POST /api/tts/ 500 in 172ms
どうやって language code を指定できるでしょうか

@shilik shilik closed this as completed Oct 14, 2024
@tegnike
Copy link
Owner

tegnike commented Oct 14, 2024

すみません、こちらクローズされていますが解決されたということで問題ないでしょうか?

@shilik
Copy link
Author

shilik commented Oct 14, 2024

Issue分析結果に基づいて
認証情報のファイルパスを明示的に指定することによって

.env

GOOGLE_APPLICATION_CREDENTIALS=/path/to/your/credentials.json
GOOGLE_CLOUD_PROJECT=your-project-id
言語選択はstandardの種類を選択すれば、例えば ja-JP-Standard-A
予想通りに音声が出てきます。

ところで
言語モデルは下記のURLから選択してください。
https://cloud.google.com/text-to-speech/docs/voices
上のURLを直接にクリックする代わりに、ブラウザーにコピペで言語モデルを見ることができます。
そうでなければ Service Unavailable になってしまいました。

https://cloud.google.com/text-to-speech/docs/voices

@tegnike
Copy link
Owner

tegnike commented Oct 14, 2024

理解しました。ご指摘ありがとうございます。

@shilik
Copy link
Author

shilik commented Oct 14, 2024

同じくTTSの問題ですが、Voicevoxをubuntu(AIVtuberも同じサーバー)にインストールしてから、サーバーのIPからhttp プロトコールでVoicevoxへ音声生成させようとしたら、ずっと拒否され、失敗しました。CORSにかかわっているのを知っていますが、VOICEVOX側の、CorsPolicyMode.allやallow_originにサーバーのIPを入れたりしてみましたが、全部ダメになりました。
以上のような問題は良い解決策があるのでしょうか。

@tegnike
Copy link
Owner

tegnike commented Oct 14, 2024

VOICEVOXは、デフォルトのURLのみしか許可していないので、直接コードを修正する必要があります。

const VOICE_VOX_API_URL = 'http://localhost:50021'

自前のVOICEVOXサーバーであってもパラメータ等は変わらないはずなので、ここを修正すれば疎通できるはずです。
もし失敗してしまう場合は、AITuberKitからではなく直接curlなどでVOICEVOXから適切なレスポンスが返るか確認してみてください。

@shilik
Copy link
Author

shilik commented Oct 14, 2024

VOICE_VOX_API_URL内容の編集は結果がダメになってしまいました。
https://github.com/VOICEVOX/voicevox_engine/blob/master/README.md
からのHTTP リクエストで音声合成するサンプルコードを借りてipを変えて試しましたが、空っぽなファイルしか生成しなかったのです。

@tegnike
Copy link
Owner

tegnike commented Oct 14, 2024

すみません、ちょっと状況が理解できませんでした。
まず確認ですが、ご自身で用意したVOICEVOXサーバーにAITuberKit以外からリクエストした場合に適切なレスポンスは受け取れましたか?

@shilik
Copy link
Author

shilik commented Oct 14, 2024

すみません、ちょっと状況が理解できませんでした。 まず確認ですが、ご自身で用意したVOICEVOXサーバーにAITuberKit以外からリクエストした場合に適切なレスポンスは受け取れましたか?

やはり全部拒否された結果となりました。これはおそらくvoicevoxのCORS設定による問題だと思います。
先週末までずっとCORSの問題に悩まされて、今うまく行っているのはGoogle TTSとElevenLabsのみです。
ちなみに、選択肢の項目名なんですが、"ElevenLabs"でなく、"Using ElevenLabs"は何か理由があるますか。

@tegnike
Copy link
Owner

tegnike commented Oct 14, 2024

なるほど、となるとVOICEVOXサーバーに問題がありそうですね。
その問題を解決したあとにAITuberKitでもトライしてみるとよいかと思います。

"ElevenLabs"でなく、"Using ElevenLabs"は何か理由があるますか。

おっと気づきませんでした。直しておきます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants