Live API capabilities guide

นี่คือคำแนะนำที่ครอบคลุมความสามารถและการกำหนดค่า ที่ใช้ได้กับ Live API ดูหน้าเริ่มต้นใช้งาน Live API เพื่อดูภาพรวมและโค้ดตัวอย่างสำหรับ Use Case ที่พบบ่อย

ก่อนเริ่มต้น

  • ทำความคุ้นเคยกับแนวคิดหลัก: หากยังไม่ได้ทำ โปรดอ่านหน้าเริ่มต้นใช้งาน Live API ก่อน ซึ่งจะแนะนำหลักการพื้นฐานของ Live API วิธีการทำงาน และแนวทางการใช้งานต่างๆ
  • ลองใช้ Live API ใน AI Studio: คุณอาจพบว่าการลองใช้ Live API ใน Google AI Studio มีประโยชน์ก่อนที่จะเริ่มสร้าง หากต้องการใช้ Live API ใน Google AI Studio ให้เลือกสตรีม

สร้างการเชื่อมต่อ

ตัวอย่างต่อไปนี้แสดงวิธีสร้างการเชื่อมต่อด้วยคีย์ API

Python

import asyncio
from google import genai

client = genai.Client()

model = "gemini-2.5-flash-native-audio-preview-12-2025"
config = {"response_modalities": ["AUDIO"]}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        print("Session started")
        # Send content...

if __name__ == "__main__":
    asyncio.run(main())

JavaScript

import { GoogleGenAI, Modality } from '@google/genai';

const ai = new GoogleGenAI({});
const model = 'gemini-2.5-flash-native-audio-preview-12-2025';
const config = { responseModalities: [Modality.AUDIO] };

async function main() {

  const session = await ai.live.connect({
    model: model,
    callbacks: {
      onopen: function () {
        console.debug('Opened');
      },
      onmessage: function (message) {
        console.debug(message);
      },
      onerror: function (e) {
        console.debug('Error:', e.message);
      },
      onclose: function (e) {
        console.debug('Close:', e.reason);
      },
    },
    config: config,
  });

  console.debug("Session started");
  // Send content...

  session.close();
}

main();

รูปแบบการโต้ตอบ

ส่วนต่อไปนี้มีตัวอย่างและบริบทที่สนับสนุนสำหรับรูปแบบอินพุตและเอาต์พุตต่างๆ ที่มีใน Live API

การส่งและรับเสียง

ตัวอย่างเสียงที่พบบ่อยที่สุดคือ เสียงต่อเสียง ซึ่งจะกล่าวถึงในคู่มือเริ่มต้นใช้งาน

รูปแบบเสียง

ข้อมูลเสียงใน Live API จะเป็นแบบดิบ, Little-Endian, PCM 16 บิตเสมอ เอาต์พุตเสียงจะใช้อัตราการสุ่มตัวอย่าง 24kHz เสมอ เสียงอินพุต มีค่า 16kHz โดยค่าเริ่มต้น แต่ Live API จะทำการสุ่มตัวอย่างใหม่หากจำเป็น จึงส่งอัตราการสุ่มตัวอย่างใดก็ได้ หากต้องการระบุอัตราการสุ่มตัวอย่างของเสียงที่ป้อน ให้ตั้งค่า ประเภท MIME ของ Blob ที่มีเสียงแต่ละรายการเป็นค่า เช่น audio/pcm;rate=16000

กำลังส่งข้อความ

วิธีส่งข้อความมีดังนี้

Python

message = "Hello, how are you?"
await session.send_client_content(turns=message, turn_complete=True)

JavaScript

const message = 'Hello, how are you?';
session.sendClientContent({ turns: message, turnComplete: true });

การอัปเดตเนื้อหาแบบเพิ่มทีละรายการ

ใช้การอัปเดตแบบเพิ่มทีละรายการเพื่อส่งอินพุตข้อความ สร้างบริบทของเซสชัน หรือ กู้คืนบริบทของเซสชัน สำหรับบริบทสั้นๆ คุณสามารถส่งการโต้ตอบแบบเลี้ยวต่อเลี้ยว เพื่อแสดงลำดับเหตุการณ์ที่แน่นอนได้โดยทำดังนี้

Python

turns = [
    {"role": "user", "parts": [{"text": "What is the capital of France?"}]},
    {"role": "model", "parts": [{"text": "Paris"}]},
]

await session.send_client_content(turns=turns, turn_complete=False)

turns = [{"role": "user", "parts": [{"text": "What is the capital of Germany?"}]}]

await session.send_client_content(turns=turns, turn_complete=True)

JavaScript

let inputTurns = [
  { "role": "user", "parts": [{ "text": "What is the capital of France?" }] },
  { "role": "model", "parts": [{ "text": "Paris" }] },
]

session.sendClientContent({ turns: inputTurns, turnComplete: false })

inputTurns = [{ "role": "user", "parts": [{ "text": "What is the capital of Germany?" }] }]

session.sendClientContent({ turns: inputTurns, turnComplete: true })

สำหรับบริบทที่ยาวขึ้น เราขอแนะนำให้สรุปข้อความเดียวเพื่อเพิ่ม พื้นที่ในกรอบเวลาบริบทสำหรับการโต้ตอบในภายหลัง ดูอีกวิธีในการโหลดบริบทของเซสชันได้ที่การกลับมาใช้เซสชันต่อ

การถอดเสียงเป็นคำ

นอกจากคำตอบของโมเดลแล้ว คุณยังรับข้อความถอดเสียงของทั้งเอาต์พุตเสียงและอินพุตเสียงได้ด้วย

หากต้องการเปิดใช้การถอดเสียงเอาต์พุตเสียงของโมเดล ให้ส่ง output_audio_transcription ในการกำหนดค่าการตั้งค่า ระบบจะอนุมานภาษาในการถอดเสียงเป็นคำจากคำตอบของโมเดล

Python

import asyncio
from google import genai
from google.genai import types

client = genai.Client()
model = "gemini-2.5-flash-native-audio-preview-12-2025"

config = {
    "response_modalities": ["AUDIO"],
    "output_audio_transcription": {}
}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        message = "Hello? Gemini are you there?"

        await session.send_client_content(
            turns={"role": "user", "parts": [{"text": message}]}, turn_complete=True
        )

        async for response in session.receive():
            if response.server_content.model_turn:
                print("Model turn:", response.server_content.model_turn)
            if response.server_content.output_transcription:
                print("Transcript:", response.server_content.output_transcription.text)

if __name__ == "__main__":
    asyncio.run(main())

JavaScript

import { GoogleGenAI, Modality } from '@google/genai';

const ai = new GoogleGenAI({});
const model = 'gemini-2.5-flash-native-audio-preview-12-2025';

const config = {
  responseModalities: [Modality.AUDIO],
  outputAudioTranscription: {}
};

async function live() {
  const responseQueue = [];

  async function waitMessage() {
    let done = false;
    let message = undefined;
    while (!done) {
      message = responseQueue.shift();
      if (message) {
        done = true;
      } else {
        await new Promise((resolve) => setTimeout(resolve, 100));
      }
    }
    return message;
  }

  async function handleTurn() {
    const turns = [];
    let done = false;
    while (!done) {
      const message = await waitMessage();
      turns.push(message);
      if (message.serverContent && message.serverContent.turnComplete) {
        done = true;
      }
    }
    return turns;
  }

  const session = await ai.live.connect({
    model: model,
    callbacks: {
      onopen: function () {
        console.debug('Opened');
      },
      onmessage: function (message) {
        responseQueue.push(message);
      },
      onerror: function (e) {
        console.debug('Error:', e.message);
      },
      onclose: function (e) {
        console.debug('Close:', e.reason);
      },
    },
    config: config,
  });

  const inputTurns = 'Hello how are you?';
  session.sendClientContent({ turns: inputTurns });

  const turns = await handleTurn();

  for (const turn of turns) {
    if (turn.serverContent && turn.serverContent.outputTranscription) {
      console.debug('Received output transcription: %s\n', turn.serverContent.outputTranscription.text);
    }
  }

  session.close();
}

async function main() {
  await live().catch((e) => console.error('got error', e));
}

main();

หากต้องการเปิดใช้การถอดเสียงเป็นคำของอินพุตเสียงของโมเดล ให้ส่ง input_audio_transcription ในการกำหนดค่าการตั้งค่า

Python

import asyncio
from pathlib import Path
from google import genai
from google.genai import types

client = genai.Client()
model = "gemini-2.5-flash-native-audio-preview-12-2025"

config = {
    "response_modalities": ["AUDIO"],
    "input_audio_transcription": {},
}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        audio_data = Path("16000.pcm").read_bytes()

        await session.send_realtime_input(
            audio=types.Blob(data=audio_data, mime_type='audio/pcm;rate=16000')
        )

        async for msg in session.receive():
            if msg.server_content.input_transcription:
                print('Transcript:', msg.server_content.input_transcription.text)

if __name__ == "__main__":
    asyncio.run(main())

JavaScript

import { GoogleGenAI, Modality } from '@google/genai';
import * as fs from "node:fs";
import pkg from 'wavefile';
const { WaveFile } = pkg;

const ai = new GoogleGenAI({});
const model = 'gemini-2.5-flash-native-audio-preview-12-2025';

const config = {
  responseModalities: [Modality.AUDIO],
  inputAudioTranscription: {}
};

async function live() {
  const responseQueue = [];

  async function waitMessage() {
    let done = false;
    let message = undefined;
    while (!done) {
      message = responseQueue.shift();
      if (message) {
        done = true;
      } else {
        await new Promise((resolve) => setTimeout(resolve, 100));
      }
    }
    return message;
  }

  async function handleTurn() {
    const turns = [];
    let done = false;
    while (!done) {
      const message = await waitMessage();
      turns.push(message);
      if (message.serverContent && message.serverContent.turnComplete) {
        done = true;
      }
    }
    return turns;
  }

  const session = await ai.live.connect({
    model: model,
    callbacks: {
      onopen: function () {
        console.debug('Opened');
      },
      onmessage: function (message) {
        responseQueue.push(message);
      },
      onerror: function (e) {
        console.debug('Error:', e.message);
      },
      onclose: function (e) {
        console.debug('Close:', e.reason);
      },
    },
    config: config,
  });

  // Send Audio Chunk
  const fileBuffer = fs.readFileSync("16000.wav");

  // Ensure audio conforms to API requirements (16-bit PCM, 16kHz, mono)
  const wav = new WaveFile();
  wav.fromBuffer(fileBuffer);
  wav.toSampleRate(16000);
  wav.toBitDepth("16");
  const base64Audio = wav.toBase64();

  // If already in correct format, you can use this:
  // const fileBuffer = fs.readFileSync("sample.pcm");
  // const base64Audio = Buffer.from(fileBuffer).toString('base64');

  session.sendRealtimeInput(
    {
      audio: {
        data: base64Audio,
        mimeType: "audio/pcm;rate=16000"
      }
    }
  );

  const turns = await handleTurn();
  for (const turn of turns) {
    if (turn.text) {
      console.debug('Received text: %s\n', turn.text);
    }
    else if (turn.data) {
      console.debug('Received inline data: %s\n', turn.data);
    }
    else if (turn.serverContent && turn.serverContent.inputTranscription) {
      console.debug('Received input transcription: %s\n', turn.serverContent.inputTranscription.text);
    }
  }

  session.close();
}

async function main() {
  await live().catch((e) => console.error('got error', e));
}

main();

สตรีมเสียงและวิดีโอ

เปลี่ยนเสียงและภาษา

โมเดลเอาต์พุตเสียงเนทีฟรองรับเสียงใดก็ได้ ที่พร้อมใช้งานสำหรับโมเดลการอ่านออกเสียงข้อความ (TTS) คุณฟังเสียงทั้งหมดได้ใน AI Studio

หากต้องการระบุเสียง ให้ตั้งชื่อเสียงภายในออบเจ็กต์ speechConfig เป็นส่วนหนึ่ง ของการกำหนดค่าเซสชัน

Python

config = {
    "response_modalities": ["AUDIO"],
    "speech_config": {
        "voice_config": {"prebuilt_voice_config": {"voice_name": "Kore"}}
    },
}

JavaScript

const config = {
  responseModalities: [Modality.AUDIO],
  speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } } }
};

Live API รองรับหลายภาษา โมเดลเอาต์พุตเสียงดั้งเดิมจะเลือกภาษาที่เหมาะสมโดยอัตโนมัติ และไม่รองรับการตั้งค่ารหัสภาษาอย่างชัดเจน

ความสามารถด้านเสียงแบบเนทีฟ

โมเดลล่าสุดของเรามีเอาต์พุตเสียงในตัว ซึ่งให้เสียงพูดที่เป็นธรรมชาติและสมจริง รวมถึงประสิทธิภาพแบบหลายภาษาที่ดีขึ้น นอกจากนี้ เสียงดั้งเดิมยังช่วยให้ใช้ฟีเจอร์ขั้นสูงได้ เช่น บทสนทนาที่รับรู้ถึงอารมณ์ เสียงเชิงรุก (ซึ่งโมเดลจะตัดสินใจอย่างชาญฉลาดว่าจะตอบกลับอินพุตเมื่อใด) และ"การคิด"

การโต้ตอบที่สะท้อนถึงความรู้สึก

ฟีเจอร์นี้ช่วยให้ Gemini ปรับรูปแบบการตอบกลับให้เข้ากับรูปแบบการป้อนข้อมูลและ โทนเสียงได้

หากต้องการใช้กล่องโต้ตอบที่มีอารมณ์ ให้ตั้งค่าเวอร์ชัน API เป็น v1alpha และตั้งค่า enable_affective_dialog เป็น true ในข้อความการตั้งค่า

Python

client = genai.Client(http_options={"api_version": "v1alpha"})

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    enable_affective_dialog=True
)

JavaScript

const ai = new GoogleGenAI({ httpOptions: {"apiVersion": "v1alpha"} });

const config = {
  responseModalities: [Modality.AUDIO],
  enableAffectiveDialog: true
};

เสียงเชิงรุก

เมื่อเปิดใช้ฟีเจอร์นี้ Gemini จะตัดสินใจไม่ตอบได้ หากเนื้อหาไม่เกี่ยวข้อง

หากต้องการใช้ ให้ตั้งค่าเวอร์ชัน API เป็น v1alpha และกำหนดค่าฟิลด์ proactivity ในข้อความการตั้งค่า แล้วตั้งค่า proactive_audio เป็น true ดังนี้

Python

client = genai.Client(http_options={"api_version": "v1alpha"})

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    proactivity={'proactive_audio': True}
)

JavaScript

const ai = new GoogleGenAI({ httpOptions: {"apiVersion": "v1alpha"} });

const config = {
  responseModalities: [Modality.AUDIO],
  proactivity: { proactiveAudio: true }
}

กำลังคิด

โมเดลเอาต์พุตเสียงเนทีฟล่าสุดgemini-2.5-flash-native-audio-preview-12-2025 รองรับความสามารถในการคิด โดยจะเปิดใช้การคิดแบบไดนามิก โดยค่าเริ่มต้น

พารามิเตอร์ thinkingBudget จะแนะนำโมเดลเกี่ยวกับจำนวนโทเค็นความคิด ที่จะใช้เมื่อสร้างคำตอบ คุณปิดใช้การคิดได้โดยตั้งค่า thinkingBudget เป็น 0 ดูข้อมูลเพิ่มเติมเกี่ยวกับรายละเอียดthinkingBudgetการกำหนดค่า ของโมเดลได้ที่เอกสารประกอบเกี่ยวกับงบประมาณการคิด

Python

model = "gemini-2.5-flash-native-audio-preview-12-2025"

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"]
    thinking_config=types.ThinkingConfig(
        thinking_budget=1024,
    )
)

async with client.aio.live.connect(model=model, config=config) as session:
    # Send audio input and receive audio

JavaScript

const model = 'gemini-2.5-flash-native-audio-preview-12-2025';
const config = {
  responseModalities: [Modality.AUDIO],
  thinkingConfig: {
    thinkingBudget: 1024,
  },
};

async function main() {

  const session = await ai.live.connect({
    model: model,
    config: config,
    callbacks: ...,
  });

  // Send audio input and receive audio

  session.close();
}

main();

นอกจากนี้ คุณยังเปิดใช้สรุปความคิดได้โดยตั้งค่า includeThoughts เป็น true ในการกำหนดค่า ดูข้อมูลเพิ่มเติมได้ที่สรุปความคิด

Python

model = "gemini-2.5-flash-native-audio-preview-12-2025"

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"]
    thinking_config=types.ThinkingConfig(
        thinking_budget=1024,
        include_thoughts=True
    )
)

JavaScript

const model = 'gemini-2.5-flash-native-audio-preview-12-2025';
const config = {
  responseModalities: [Modality.AUDIO],
  thinkingConfig: {
    thinkingBudget: 1024,
    includeThoughts: true,
  },
};

การตรวจจับกิจกรรมเสียง (VAD)

การตรวจจับกิจกรรมเสียง (VAD) ช่วยให้โมเดลจดจำได้เมื่อมีคน พูด ซึ่งเป็นสิ่งสำคัญในการสร้างบทสนทนาที่เป็นธรรมชาติ เนื่องจากช่วยให้ผู้ใช้ขัดจังหวะโมเดลได้ทุกเมื่อ

เมื่อ VAD ตรวจพบการขัดจังหวะ ระบบจะยกเลิกและทิ้งการสร้างที่กำลังดำเนินการอยู่ ระบบจะเก็บเฉพาะข้อมูลที่ส่งไปยังไคลเอ็นต์แล้วไว้ใน ประวัติเซสชัน จากนั้นเซิร์ฟเวอร์จะส่งข้อความ BidiGenerateContentServerContent เพื่อรายงานการหยุดชะงัก

จากนั้นเซิร์ฟเวอร์ Gemini จะทิ้งการเรียกใช้ฟังก์ชันที่รอดำเนินการและส่งBidiGenerateContentServerContentข้อความพร้อมรหัสของการเรียกที่ยกเลิก

Python

async for response in session.receive():
    if response.server_content.interrupted is True:
        # The generation was interrupted

        # If realtime playback is implemented in your application,
        # you should stop playing audio and clear queued playback here.

JavaScript

const turns = await handleTurn();

for (const turn of turns) {
  if (turn.serverContent && turn.serverContent.interrupted) {
    // The generation was interrupted

    // If realtime playback is implemented in your application,
    // you should stop playing audio and clear queued playback here.
  }
}

VAD อัตโนมัติ

โดยค่าเริ่มต้น โมเดลจะดำเนินการ VAD โดยอัตโนมัติใน สตรีมอินพุตเสียงอย่างต่อเนื่อง คุณกำหนดค่า VAD ได้ด้วยฟิลด์ realtimeInputConfig.automaticActivityDetection ของการกำหนดค่าการตั้งค่า

เมื่อหยุดสตรีมเสียงชั่วคราวเป็นเวลานานกว่า 1 วินาที (เช่น เนื่องจากผู้ใช้ปิดไมโครโฟน) ระบบควรส่งเหตุการณ์ audioStreamEnd เพื่อล้างเสียงที่แคชไว้ ไคลเอ็นต์สามารถกลับมาส่ง ข้อมูลเสียงได้ทุกเมื่อ

Python

# example audio file to try:
# URL = "https://storage.googleapis.com/generativeai-downloads/data/hello_are_you_there.pcm"
# !wget -q $URL -O sample.pcm
import asyncio
from pathlib import Path
from google import genai
from google.genai import types

client = genai.Client()
model = "gemini-live-2.5-flash-preview"

config = {"response_modalities": ["TEXT"]}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        audio_bytes = Path("sample.pcm").read_bytes()

        await session.send_realtime_input(
            audio=types.Blob(data=audio_bytes, mime_type="audio/pcm;rate=16000")
        )

        # if stream gets paused, send:
        # await session.send_realtime_input(audio_stream_end=True)

        async for response in session.receive():
            if response.text is not None:
                print(response.text)

if __name__ == "__main__":
    asyncio.run(main())

JavaScript

// example audio file to try:
// URL = "https://storage.googleapis.com/generativeai-downloads/data/hello_are_you_there.pcm"
// !wget -q $URL -O sample.pcm
import { GoogleGenAI, Modality } from '@google/genai';
import * as fs from "node:fs";

const ai = new GoogleGenAI({});
const model = 'gemini-live-2.5-flash-preview';
const config = { responseModalities: [Modality.TEXT] };

async function live() {
  const responseQueue = [];

  async function waitMessage() {
    let done = false;
    let message = undefined;
    while (!done) {
      message = responseQueue.shift();
      if (message) {
        done = true;
      } else {
        await new Promise((resolve) => setTimeout(resolve, 100));
      }
    }
    return message;
  }

  async function handleTurn() {
    const turns = [];
    let done = false;
    while (!done) {
      const message = await waitMessage();
      turns.push(message);
      if (message.serverContent && message.serverContent.turnComplete) {
        done = true;
      }
    }
    return turns;
  }

  const session = await ai.live.connect({
    model: model,
    callbacks: {
      onopen: function () {
        console.debug('Opened');
      },
      onmessage: function (message) {
        responseQueue.push(message);
      },
      onerror: function (e) {
        console.debug('Error:', e.message);
      },
      onclose: function (e) {
        console.debug('Close:', e.reason);
      },
    },
    config: config,
  });

  // Send Audio Chunk
  const fileBuffer = fs.readFileSync("sample.pcm");
  const base64Audio = Buffer.from(fileBuffer).toString('base64');

  session.sendRealtimeInput(
    {
      audio: {
        data: base64Audio,
        mimeType: "audio/pcm;rate=16000"
      }
    }

  );

  // if stream gets paused, send:
  // session.sendRealtimeInput({ audioStreamEnd: true })

  const turns = await handleTurn();
  for (const turn of turns) {
    if (turn.text) {
      console.debug('Received text: %s\n', turn.text);
    }
    else if (turn.data) {
      console.debug('Received inline data: %s\n', turn.data);
    }
  }

  session.close();
}

async function main() {
  await live().catch((e) => console.error('got error', e));
}

main();

เมื่อใช้ send_realtime_input API จะตอบกลับเสียงโดยอัตโนมัติตาม VAD แม้ว่า send_client_content จะเพิ่มข้อความลงในบริบทของโมเดลตามลำดับ แต่ send_realtime_input ได้รับการเพิ่มประสิทธิภาพเพื่อการตอบสนองโดยแลกกับการเรียงลำดับที่แน่นอน

การกำหนดค่า VAD อัตโนมัติ

หากต้องการควบคุมกิจกรรม VAD เพิ่มเติม คุณสามารถกำหนดค่าพารามิเตอร์ต่อไปนี้ได้ ดูข้อมูลเพิ่มเติมได้ที่เอกสารอ้างอิง API

Python

from google.genai import types

config = {
    "response_modalities": ["TEXT"],
    "realtime_input_config": {
        "automatic_activity_detection": {
            "disabled": False, # default
            "start_of_speech_sensitivity": types.StartSensitivity.START_SENSITIVITY_LOW,
            "end_of_speech_sensitivity": types.EndSensitivity.END_SENSITIVITY_LOW,
            "prefix_padding_ms": 20,
            "silence_duration_ms": 100,
        }
    }
}

JavaScript

import { GoogleGenAI, Modality, StartSensitivity, EndSensitivity } from '@google/genai';

const config = {
  responseModalities: [Modality.TEXT],
  realtimeInputConfig: {
    automaticActivityDetection: {
      disabled: false, // default
      startOfSpeechSensitivity: StartSensitivity.START_SENSITIVITY_LOW,
      endOfSpeechSensitivity: EndSensitivity.END_SENSITIVITY_LOW,
      prefixPaddingMs: 20,
      silenceDurationMs: 100,
    }
  }
};

ปิดใช้ VAD อัตโนมัติ

หรือจะปิดใช้ VAD อัตโนมัติก็ได้โดยตั้งค่า realtimeInputConfig.automaticActivityDetection.disabled เป็น true ในข้อความการตั้งค่า ในการกำหนดค่านี้ ไคลเอ็นต์มีหน้าที่ตรวจหาคำพูดของผู้ใช้และส่งข้อความ activityStart และ activityEnd ในเวลาที่เหมาะสม ระบบจะไม่ส่ง audioStreamEnd ในการกำหนดค่านี้ แต่หากสตรีมหยุดชะงัก ระบบจะทำเครื่องหมายด้วยactivityEndข้อความ

Python

config = {
    "response_modalities": ["TEXT"],
    "realtime_input_config": {"automatic_activity_detection": {"disabled": True}},
}

async with client.aio.live.connect(model=model, config=config) as session:
    # ...
    await session.send_realtime_input(activity_start=types.ActivityStart())
    await session.send_realtime_input(
        audio=types.Blob(data=audio_bytes, mime_type="audio/pcm;rate=16000")
    )
    await session.send_realtime_input(activity_end=types.ActivityEnd())
    # ...

JavaScript

const config = {
  responseModalities: [Modality.TEXT],
  realtimeInputConfig: {
    automaticActivityDetection: {
      disabled: true,
    }
  }
};

session.sendRealtimeInput({ activityStart: {} })

session.sendRealtimeInput(
  {
    audio: {
      data: base64Audio,
      mimeType: "audio/pcm;rate=16000"
    }
  }

);

session.sendRealtimeInput({ activityEnd: {} })

จำนวนโทเค็น

คุณดูจำนวนโทเค็นที่ใช้ทั้งหมดได้ในฟิลด์ usageMetadata ของข้อความเซิร์ฟเวอร์ที่ส่งคืน

Python

async for message in session.receive():
    # The server will periodically send messages that include UsageMetadata.
    if message.usage_metadata:
        usage = message.usage_metadata
        print(
            f"Used {usage.total_token_count} tokens in total. Response token breakdown:"
        )
        for detail in usage.response_tokens_details:
            match detail:
                case types.ModalityTokenCount(modality=modality, token_count=count):
                    print(f"{modality}: {count}")

JavaScript

const turns = await handleTurn();

for (const turn of turns) {
  if (turn.usageMetadata) {
    console.debug('Used %s tokens in total. Response token breakdown:\n', turn.usageMetadata.totalTokenCount);

    for (const detail of turn.usageMetadata.responseTokensDetails) {
      console.debug('%s\n', detail);
    }
  }
}

ความละเอียดของสื่อ

คุณระบุความละเอียดของสื่อสำหรับสื่ออินพุตได้โดยตั้งค่าฟิลด์ mediaResolution เป็นส่วนหนึ่งของการกำหนดค่าเซสชัน ดังนี้

Python

from google.genai import types

config = {
    "response_modalities": ["AUDIO"],
    "media_resolution": types.MediaResolution.MEDIA_RESOLUTION_LOW,
}

JavaScript

import { GoogleGenAI, Modality, MediaResolution } from '@google/genai';

const config = {
    responseModalities: [Modality.TEXT],
    mediaResolution: MediaResolution.MEDIA_RESOLUTION_LOW,
};

ข้อจำกัด

โปรดคำนึงถึงข้อจำกัดต่อไปนี้ของ Live API เมื่อวางแผนโปรเจ็กต์

รูปแบบการตอบกลับ

คุณตั้งค่ารูปแบบการตอบกลับได้เพียง 1 รูปแบบ (TEXT หรือ AUDIO) ต่อเซสชันในการกำหนดค่าเซสชัน การตั้งค่าทั้ง 2 อย่างจะทำให้เกิดข้อความแสดงข้อผิดพลาดในการกำหนดค่า ซึ่งหมายความว่าคุณสามารถกำหนดค่าโมเดลให้ตอบกลับด้วยข้อความหรือเสียง แต่จะตอบกลับทั้ง 2 อย่างในเซสชันเดียวกันไม่ได้

การตรวจสอบสิทธิ์ไคลเอ็นต์

โดยค่าเริ่มต้น Live API จะให้การตรวจสอบสิทธิ์แบบเซิร์ฟเวอร์ต่อเซิร์ฟเวอร์เท่านั้น หากคุณใช้แอปพลิเคชัน Live API โดยใช้แนวทางไคลเอ็นต์ต่อเซิร์ฟเวอร์ คุณต้องใช้โทเค็นชั่วคราวเพื่อลดความเสี่ยงด้านความปลอดภัย

ระยะเวลาเซสชัน

เซสชันเสียงอย่างเดียวจะจำกัดไว้ที่ 15 นาที และเซสชันเสียงและวิดีโอจะจำกัดไว้ที่ 2 นาที อย่างไรก็ตาม คุณสามารถกำหนดค่าเทคนิคการจัดการเซสชันที่แตกต่างกันเพื่อขยายระยะเวลาเซสชันได้ไม่จำกัด

หน้าต่างบริบท

เซสชันมีขีดจํากัดหน้าต่างบริบทดังนี้

ภาษาที่รองรับ

Live API รองรับ 70 ภาษาต่อไปนี้

ภาษา รหัส BCP-47 ภาษา รหัส BCP-47
แอฟริคานส์ af กันนาดา kn
แอลเบเนีย sq คาซัค kk
อัมฮาริก am เขมร km
อาหรับ ar เกาหลี ko
อาร์เมเนีย hy ภาษาลาว lo
อัสสัม as ลัตเวีย lv
อาร์เซอร์ไบจัน az ลิทัวเนีย lt
บาสก์ eu มาซีโดเนีย mk
เบลารุส be มาเลย์ ms
เบงกอล bn มาลายาลัม ml
บอสเนีย bs มราฐี mr
บัลแกเรีย bg มองโกเลีย mn
คาตาลัน ca เนปาล ne
จีน zh นอร์เวย์ no
โครเอเชีย hr โอเดีย or
เช็ก cs โปแลนด์ pl
เดนมาร์ก da โปรตุเกส pt
ดัตช์ nl ปัญจาบ pa
อังกฤษ en โรมาเนีย ro
เอสโตเนีย et รัสเซีย ru
ฟิลิปปินส์ fil เซอร์เบีย sr
ฟินแลนด์ fi สโลวัก sk
ฝรั่งเศส fr สโลวีเนีย sl
กาลิเซีย gl สเปน es
จอร์เจีย ka สวาฮิลี sw
เยอรมัน de สวีเดน sv
กรีก el ทมิฬ ta
คุชราต gu เตลูกู te
ฮีบรู iw ไทย th
ฮินดี hi ตุรกี tr
ฮังการี hu ยูเครน uk
ไอซ์แลนด์ is อูรดู ur
อินโดนีเซีย id อุซเบก uz
อิตาลี it เวียดนาม vi
ญี่ปุ่น ja ซูลู zu

ขั้นตอนถัดไป