Chatbot'lar veya temsilci etkileşimleri gibi gerçek zamanlı ve düşük gecikmeli ses desteği gerektiren uygulamalar için Gemini Live API, Gemini modelinin hem girişini hem de çıkışını yayınlamak için optimize edilmiş bir yol sunar. Firebase AI Logic'i kullanarak arka uç entegrasyonuna gerek kalmadan Gemini Live API'yi doğrudan Android uygulamanızdan çağırabilirsiniz. Bu kılavuzda, Firebase AI Logic ile Android uygulamanızda Gemini Live API'yi nasıl kullanacağınız gösterilmektedir.
Başlayın
Başlamadan önce uygulamanızın API düzeyi 21 veya sonraki sürümleri hedeflediğinden emin olun.
Henüz yapmadıysanız bir Firebase projesi oluşturun ve uygulamanızı Firebase'e bağlayın. Ayrıntılar için Firebase AI Logic belgelerine bakın.
Android projenizi oluşturma
Firebase AI Logic kitaplığı bağımlılığını uygulama düzeyindeki build.gradle.kts
veya build.gradle
dosyanıza ekleyin. Kitaplık sürümlerini yönetmek için Firebase Android BoM'u kullanın.
dependencies {
// Import the Firebase BoM
implementation(platform("com.google.firebase:firebase-bom:34.1.0"))
// Add the dependency for the Firebase AI Logic library
// When using the BoM, you don't specify versions in Firebase library dependencies
implementation("com.google.firebase:firebase-ai")
}
Bağımlılığı ekledikten sonra Android projenizi Gradle ile senkronize edin.
Firebase AI Logic'i entegre etme ve üretken modeli başlatma
Uygulamanızın AndroidManifest.xml
dosyasına RECORD_AUDIO
iznini ekleyin:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
Gemini Developer API arka uç hizmetini başlatın ve LiveModel
adresine erişin.
gemini-2.0-flash-live-preview-04-09
gibi Live API'yi destekleyen bir model kullanın. Kullanılabilir modeller için Firebase belgelerine bakın.
Bir ses belirtmek için voice name'i speechConfig
nesnesinde model yapılandırmasının bir parçası olarak ayarlayın. Bir ses belirtmezseniz varsayılan olarak Puck
kullanılır.
Kotlin
// Initialize the `LiveModel`
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).liveModel(
modelName = "gemini-2.0-flash-live-preview-04-09",
generationConfig = liveGenerationConfig {
responseModality = ResponseModality.AUDIO
speechConfig = SpeechConfig(voice= Voice("FENRIR"))
})
Java
// Initialize the `LiveModel`
LiveGenerativeModel model = FirebaseAI
.getInstance(GenerativeBackend.googleAI())
.liveModel(
"gemini-2.0-flash-live-preview-04-09",
new LiveGenerationConfig.Builder()
.setResponseModality(ResponseModality.AUDIO)
.setSpeechConfig(new SpeechConfig(new Voice("FENRIR"))
).build(),
null,
null
);
İsteğe bağlı olarak bir sistem talimatı ayarlayarak modelin oynadığı karakteri veya rolü tanımlayabilirsiniz:
Kotlin
val systemInstruction = content {
text("You are a helpful assistant, you main role is [...]")}
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).liveModel(
modelName = "gemini-2.0-flash-live-preview-04-09",
generationConfig = liveGenerationConfig {
responseModality = ResponseModality.AUDIO
speechConfig = SpeechConfig(voice= Voice("FENRIR"))
},
systemInstruction = systemInstruction,
)
Java
Content systemInstruction = new Content.Builder()
.addText("You are a helpful assistant, you main role is [...]")
.build();
LiveGenerativeModel model = FirebaseAI
.getInstance(GenerativeBackend.googleAI())
.liveModel(
"gemini-2.0-flash-live-preview-04-09",
new LiveGenerationConfig.Builder()
.setResponseModality(ResponseModality.AUDIO)
.setSpeechConfig(new SpeechConfig(new Voice("FENRIR"))
).build(),
tools, // null if you don't want to use function calling
systemInstruction
);
Uygulamanıza özel bağlam sağlamak için sistem talimatlarını kullanarak modelle olan sohbeti daha da özelleştirebilirsiniz (ör. kullanıcı uygulama içi etkinlik geçmişi).
Live API oturumu başlatma
LiveModel
örneğini oluşturduktan sonra LiveSession
nesnesi oluşturmak ve düşük gecikmeli akışla modelle kalıcı bir bağlantı kurmak için model.connect()
işlevini çağırın. LiveSession
, ses oturumunu başlatıp durdurarak ve metin gönderip alarak modelle etkileşime geçmenizi sağlar.
Ardından, modelle görüşmeyi başlatmak için startAudioConversation()
'ı arayabilirsiniz:
Kotlin
val session = model.connect()
session.startAudioConversation()
Java
LiveModelFutures model = LiveModelFutures.from(liveModel);
ListenableFuture<LiveSession> sessionFuture = model.connect();
Futures.addCallback(sessionFuture, new FutureCallback<LiveSession>() {
@Override
public void onSuccess(LiveSession ses) {
LiveSessionFutures session = LiveSessionFutures.from(ses);
session.startAudioConversation();
}
@Override
public void onFailure(Throwable t) {
// Handle exceptions
}
}, executor);
Ayrıca, modelle olan görüşmelerinizde modelin kesintileri ele almadığını unutmayın. Bu özelliği gelecekte eklemeyi planlıyoruz.
Ayrıca, Gemini Live API'yi kullanarak metinden akışlı ses oluşturabilir ve akışlı sesten metin oluşturabilirsiniz. Live API'nin çift yönlü olduğunu, bu nedenle içerik göndermek ve almak için aynı bağlantıyı kullandığınızı unutmayın. İlerleyen zamanlarda modele resim ve canlı video yayını da gönderebileceksiniz.
İşlev çağırma: Gemini Live API'yi uygulamanıza bağlama
Bir adım daha ileri giderek, işlev çağrısını kullanarak modelin doğrudan uygulamanızın mantığıyla etkileşime girmesini de sağlayabilirsiniz.
İşlev çağrısı (veya araç çağrısı), üretken yapay zeka uygulamalarının bir özelliğidir. Bu özellik, modelin kendi inisiyatifiyle işlevleri çağırarak işlemler gerçekleştirmesine olanak tanır. İşlevin bir çıkışı varsa model bunu bağlamına ekler ve sonraki oluşturma işlemlerinde kullanır.
Uygulamanızda işlev çağrısını uygulamak için modele sunmak istediğiniz her işlev için bir FunctionDeclaration
nesnesi oluşturarak başlayın.
Örneğin, bir dize listesine dize ekleyen bir addList
işlevini Gemini'da kullanıma sunmak için işlevin ve parametresinin adını ve kısa açıklamasını düz İngilizce olarak içeren bir FunctionDeclaration
değişkeni oluşturarak başlayın:
Kotlin
val itemList = mutableListOf<String>()
fun addList(item: String){
itemList.add(item)
}
val addListFunctionDeclaration = FunctionDeclaration(
name = "addList",
description = "Function adding an item the list",
parameters = mapOf("item" to Schema.string("A short string
describing the item to add to the list"))
)
Java
HashMap<String, Schema> addListParams = new HashMap<String, Schema>(1);
addListParams.put("item", Schema.str("A short string describing the item
to add to the list"));
FunctionDeclaration addListFunctionDeclaration = new FunctionDeclaration(
"addList",
"Function adding an item the list",
addListParams,
Collections.emptyList()
);
Ardından, modeli oluştururken bu FunctionDeclaration
öğesini Tool
olarak iletin:
Kotlin
val addListTool = Tool.functionDeclarations(listOf(addListFunctionDeclaration))
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).liveModel(
modelName = "gemini-2.0-flash-live-preview-04-09",
generationConfig = liveGenerationConfig {
responseModality = ResponseModality.AUDIO
speechConfig = SpeechConfig(voice= Voice("FENRIR"))
},
systemInstruction = systemInstruction,
tools = listOf(addListTool)
)
Java
LiveGenerativeModel model = FirebaseAI.getInstance(
GenerativeBackend.googleAI()).liveModel(
"gemini-2.0-flash-live-preview-04-09",
new LiveGenerationConfig.Builder()
.setResponseModalities(ResponseModality.AUDIO)
.setSpeechConfig(new SpeechConfig(new Voice("FENRIR")))
.build(),
List.of(Tool.functionDeclarations(List.of(addListFunctionDeclaration))),
null,
systemInstruction
);
Son olarak, modelin yaptığı araç çağrısını işlemek için bir işleyici işlevi uygulayın ve yanıtı geri iletin. startAudioConversation
işlevini çağırdığınızda LiveSession
öğesine sağlanan bu işleyici işlevi, FunctionCallPart
parametresini alır ve FunctionResponsePart
değerini döndürür:
Kotlin
session.startAudioConversation(::functionCallHandler)
// ...
fun functionCallHandler(functionCall: FunctionCallPart): FunctionResponsePart {
return when (functionCall.name) {
"addList" -> {
// Extract function parameter from functionCallPart
val itemName = functionCall.args["item"]!!.jsonPrimitive.content
// Call function with parameter
addList(itemName)
// Confirm the function call to the model
val response = JsonObject(
mapOf(
"success" to JsonPrimitive(true),
"message" to JsonPrimitive("Item $itemName added to the todo list")
)
)
FunctionResponsePart(functionCall.name, response)
}
else -> {
val response = JsonObject(
mapOf(
"error" to JsonPrimitive("Unknown function: ${functionCall.name}")
)
)
FunctionResponsePart(functionCall.name, response)
}
}
}
Java
Futures.addCallback(sessionFuture, new FutureCallback<LiveSessionFutures>() {
@RequiresPermission(Manifest.permission.RECORD_AUDIO)
@Override
@OptIn(markerClass = PublicPreviewAPI.class)
public void onSuccess(LiveSessionFutures ses) {
ses.startAudioConversation(::handleFunctionCallFuture);
}
@Override
public void onFailure(Throwable t) {
// Handle exceptions
}
}, executor);
// ...
ListenableFuture<JsonObject> handleFunctionCallFuture = Futures.transform(response, result -> {
for (FunctionCallPart functionCall : result.getFunctionCalls()) {
if (functionCall.getName().equals("addList")) {
Map<String, JsonElement> args = functionCall.getArgs();
String item =
JsonElementKt.getContentOrNull(
JsonElementKt.getJsonPrimitive(
locationJsonObject.get("item")));
return addList(item);
}
}
return null;
}, Executors.newSingleThreadExecutor());
Sonraki adımlar
- Android AI katalog örnek uygulamasında Gemini Live API ile oynayın.
- Gemini Live API hakkında daha fazla bilgiyi Firebase AI Logic belgelerinde bulabilirsiniz.
- Kullanılabilir Gemini modelleri hakkında daha fazla bilgi edinin.
- İşlev çağrısı hakkında daha fazla bilgi edinin.
- İstem tasarımı stratejilerini keşfedin.