Closed13

GeminiのLive APIを試す

sugar-catsugar-cat

gemini-2.5-flash-native-audio-preview-12-2025
https://ai.google.dev/gemini-api/docs/live

クライアントから直にWSでコネクションをはれる。
Ehemeral Tokenを発行できるので、中継のサーバーをかませない場合はそのTokenを使う
https://ai.google.dev/gemini-api/docs/ephemeral-tokens?hl=ja

トークン発行時にVADの設定や音声合成を行うボイスの設定など色々な設定ができる

      client.authTokens.create({
        config: {
          uses: 1,
          expireTime,
          liveConnectConstraints: {
            model: LIVE_MODEL,
            config: {
              sessionResumption: {},
              temperature: 0.7,
              responseModalities: [Modality.AUDIO],
              inputAudioTranscription: {},
              outputAudioTranscription: {},
              realtimeInputConfig: {
                automaticActivityDetection: {
                  silenceDurationMs: xxx
                },
              },
              ...(systemInstruction && { systemInstruction }),
              speechConfig: {
                ...(voiceName && {
                  voiceConfig: {
                    prebuiltVoiceConfig: { voiceName },
                  },
                }),
              },
            },
          },
        },
      })
      ```
sugar-catsugar-cat

日本語音声認識に関して

https://ai.google.dev/gemini-api/docs/live-guide#change-voice-and-language

The Live API supports multiple languages. Native audio output models automatically choose the appropriate language and don't support explicitly setting the language code.

特に指定がなくても音声認識の段階で自動で応答音声の言語が変わるようになっているっぽい。

応答は空白とかのノイズが含まれてしまうのでユーザー側でよしなに正規化しないといけない。

sugar-catsugar-cat

https://github.com/google-gemini/cookbook/issues/951

Instead of receiving coherent text like 'Can I please have your account number,' the output arrives as broken character chunks: [Model Transcript]: Ca / [Model Transcript]: n I / [Model Transcript]: pl...

ストリーミングで増分的に出力される際、各チャンクの境界でスペースが挿入される?

sugar-catsugar-cat

Live APIとセッションを確立した後にどのように追加でプロンプトを注入するか。
・BidiGenerateContentというAPIがある

クライアント→サーバー

  • BidiGenerateContentSetup
    • セッション開始時に最初に1回だけ送信する設定メッセージ

https://ai.google.dev/api/live#BidiGenerateContentSetup

// コンテキストのみ追加(応答を待たない)
sendClientContent({
  turns: { role: "user", parts: [{ text: "[指示] 深掘りしてください" }] },
  turnComplete: false,  // AI応答をトリガーしない
});

// 応答を要求
sendClientContent({
  turns: { role: "user", parts: [{ text: "こんにちは" }] },
  turnComplete: true,   // AI応答をトリガー
});

Audio inputs and audio outputs negatively impact the model's ability to use function calling
らしい

エフェメラルトークンでのTool設定もできる

client.authTokens.create({
  config: {
    uses: 1,
    expireTime,
    liveConnectConstraints: {
      model: LIVE_MODEL,
      config: {
        tools: [
          {
            functionDeclarations: [
              {
                name: "get_weather",
                description: "Get weather for a location",
                parameters: { ... }
              }
            ]
          }
        ],
        // ...その他の設定
      },
    },
  },
});
sugar-catsugar-cat

ユーザー側のターンで発話での応答が遅延・欠落してしまう問題が。。。

inputTranscriptionを結合してみてみるとなんか、発話時間?が一定を超えたらめちゃくちゃバグってる。

抜粋

生産、生産、生産、生産、生産、生産、生産、SEEM、SEEM、SEEM、SEEM、SEEM、SE、SE、SE、SE、SE、SE、SEEM、SEEM、SEEM、SEEM、SEEM、ふ、ふ、ふ、ふ、ふ、ふ、ふ、ふ、ふ、ふ、ふ、ふ、ふ、ふ、ふ、ふ、ふ、ふ、ふ、ふ、ふ、ふ、ふ、ふ、あ、あ、あ、あ、あ、あ、あ、あ、あ、あ、あ、あ、あ、あ、あ、あ、あ、あ、あ、あ、あ、そう、そう、そう、そう、そう、そう、そう、そう、そう、そう、そう、そう、そう、うん
sugar-catsugar-cat

同じような問題になっている人はいそうなんだけど、回避方法がない、、、previewだからしょうがないのか、、

sugar-catsugar-cat

諦めて別のSTTのサービスを組み合わせてみたら割といい感じに動いた。
ただLive APIのVADとか使えないから応答生成とTTSのStreming部分だけ使うという感じがいいかなあ。

このスクラップは1ヶ月前にクローズされました