يمكنك أن تطلب من نموذج Gemini تحويل النص إلى كلام إنشاء مخرجات صوتية من طلب نصّي. عند استخدام Firebase AI Logic، يمكنك تقديم هذا الطلب مباشرةً من تطبيقك.
إنّ عملية إنشاء تحويل النص إلى كلام (TTS) قابلة للتحكّم، ما يعني أنّك توفّر النص الدقيق الذي سيتم تحويله إلى كلام. يمكنك أيضًا استخدام اللغة الطبيعية في طلباتك لتوجيه أسلوب مصدر إخراج الصوت ولهجته وسرعته ونبرته. يمكنك اعتبار تحويل النص إلى كلام عكس عملية تحويل الكلام إلى نص.
تتوفّر هذه الميزة باستخدام أي من نماذج Gemini -tts، وهي نماذج محسّنة لإنشاء كلام بجودة عالية وبزمن استجابة منخفض.
باستخدام هذه الإمكانية، يمكنك تنفيذ إجراءات مثل:
سرد القصص التفاعلي: يمكنك إنشاء كتب مسموعة غامرة أو ألعاب تقمّص أدوار تغيّر فيها النماذج أصواتها لتناسب الشخصيات المختلفة أو تعدّل نبرتها (مثل الهمس في لحظات التشويق أو الضحك عند سماع نكتة) لتتوافق مع السرد.
تعلُّم اللغات: يمكنك إنشاء أدلة نطق يمكنها قراءة النص بلهجات إقليمية معيّنة أو بوتيرة أبطأ لمساعدة المتعلّمين على التدرب على النطق الصعب.
قارئات المحتوى المدرِكة للسياق: قراءة المقالات الإخبارية أو وصفات الطعام أو منشورات المدونات بصوت عالٍ باستخدام شخصية صوتية ونبرة عاطفية تتناسب مع المحتوى (مثل نبرة جدية للأخبار العاجلة أو نبرة دافئة وصبورة لتعليمات الطبخ خطوة بخطوة)
يوضّح هذا الدليل كيفية إنشاء كلام من إدخال نصي باستخدام متحدث واحد أو عدة متحدثين، وكيفية بث الرد الصوتي.
الانتقال إلى الرمز البرمجي الخاص بمكبر صوت واحد الانتقال إلى الرمز البرمجي الخاص بمكبرات صوت متعددة الانتقال إلى الرمز البرمجي الخاص بالردود التي يتم بثها
مقارنة بين ميزة "تحويل النص إلى كلام" وLive API
إنّ كلاً من نماذج تحويل النص إلى كلام (TTS) ونماذج Live API هي نماذج منخفضة الاستجابة لإنشاء الكلام، ويمكن ضبطها لتوفير أصوات ولغات مختلفة للردود. ومع ذلك، فإنّها تخدم حالات استخدام مختلفة تمامًا.
إنشاء محتوى باستخدام ميزة "تحويل النص إلى كلام" هو تفاعل أحادي الاتجاه بين الطلب والاستجابة (نص مُدخَل، صوت مُخرَج). وهي مصمّمة خصيصًا للحالات التي تتطلّب تلاوة دقيقة للنص المقدَّم مع إمكانية التحكّم الدقيق في الأسلوب والصوت، مثل سرد البودكاست أو الكتب المسموعة أو قراءة المقالات بصوت عالٍ.
تتيح ميزة Live API إنشاء البث ثنائي الاتجاه للمحادثات الصوتية في الوقت الفعلي (إدخال الصوت وإخراجه). يتفوّق هذا النموذج في سياقات المحادثات الديناميكية حيث يقرّر النموذج الردّ المناسب. يُرجى العِلم أنّ أحدث Live API النماذج تتيح أيضًا إدخال الفيديوهات والصور.
قبل البدء
|
انقر على مقدّم خدمة Gemini API لعرض المحتوى والرمز الخاصين بمقدّم الخدمة على هذه الصفحة. |
إذا لم يسبق لك إجراء ذلك، عليك إكمال دليل بدء الاستخدام الذي يوضّح كيفية إعداد مشروع Firebase وربط تطبيقك بـ Firebase وإضافة حزمة تطوير البرامج (SDK) وتهيئة خدمة الخلفية لمزوّد Gemini API الذي اخترته وإنشاء مثيل GenerativeModel.
لاختبار طلباتك وتحسينها بشكل متكرّر، ننصحك باستخدام Google AI Studio.
الطُرز التي تتوافق مع هذه الإمكانية
gemini-3.1-flash-tts-preview
إنشاء كلام من نص
يمكنك إنشاء كلام من نص مقدَّم باستخدام Gemini نموذج تحويل النص إلى كلام.
إنشاء كلام باستخدام متحدث واحد
|
قبل تجربة هذا النموذج، أكمل القسم
قبل البدء من هذا الدليل
لإعداد مشروعك وتطبيقك. في هذا القسم، ستنقر أيضًا على زر لمقدّم خدمة Gemini API الذي اخترته حتى يظهر لك محتوى خاص بمقدّم الخدمة في هذه الصفحة. |
يمكنك ضبط النموذج لإنتاج الصوت باستخدام صوت واحد.
في GenerationConfig، أدرِج ما يلي:
اضبط
responseModalitiesلتضمينAUDIO.اضبط
SpeechConfigباستخدام ما يلي:(مطلوبة) اسم صوت الردّ (مثلاً،
Kore)(اختياري) رمز اللغة
في حال عدم تحديد لغة، يمكن Gemini لنماذج تحويل النص إلى كلام التعرّف تلقائيًا على اللغة في الطلب.
اتّصِل بـ generateContent مع طلبك النصي. يعرض النموذج
بيانات صوتية بتنسيق PCM في أجزاء الرد.
Swift
import FirebaseAILogic
// Initialize the Gemini Developer API backend service.
let ai = FirebaseAI.firebaseAI(backend: .googleAI())
// Set `responseModalities` to include `AUDIO`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
let config = GenerationConfig(
responseModalities: [.audio],
speechConfig: SpeechConfig(voiceName: "Kore", languageCode: "en-US")
)
// Create a `GenerativeModel` instance with a model that supports speech generation.
let model = ai.generativeModel(
modelName: "gemini-3.1-flash-tts-preview",
generationConfig: config
)
// Provide a text prompt.
let prompt = "Say cheerfully: Have a wonderful day!"
// Call `generateContent` to generate the speech output based on your text prompt.
let response = try await model.generateContent(prompt)
// Extract the audio data and handle it for downstream use. For example:
for part in response.inlineDataParts {
let data = part.data // Raw PCM audio bytes (24kHz, 1 channel, 16-bit)
let mimeType = part.mimeType // for example: "audio/pcm"
print("Received audio data with MIME type: \(mimeType)")
// To play back raw PCM audio bytes, you'll need to write your own `playRawPcm` function.
playRawPcm(data: data)
}
Kotlin
في Kotlin، تكون الطرق في حزمة تطوير البرامج هذه عبارة عن دوال معلّقة ويجب استدعاؤها من نطاق Coroutine.
// Set `responseModalities` to include `AUDIO`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
val config = generationConfig {
responseModalities = listOf(ResponseModality.AUDIO)
speechConfig = SpeechConfig(
voice = Voice("Kore"),
languageCode = "en-US"
)
}
// Initialize the Gemini Developer API backend service.
val model = Firebase.ai(backend = GenerativeBackend.googleAI())
.generativeModel(
modelName = "gemini-3.1-flash-tts-preview",
generationConfig = config
)
// Provide a text prompt.
val prompt = "Say cheerfully: Have a wonderful day!"
// Call `generateContent` to generate the speech output based on your text prompt.
val response = model.generateContent(prompt)
// Extract the audio data and handle it for downstream use. For example:
val part = response.candidates.firstOrNull()?.content?.parts?.firstOrNull()
if (part is InlineDataPart) {
val pcmData = part.inlineData // Raw PCM bytes (24kHz, 1 channel, 16-bit)
val mimeType = part.mimeType // for example: "audio/pcm"
// To play back PCM audio data, you'll need to write your own `playAudio` function.
playAudio(pcmData)
}
Java
بالنسبة إلى Java، تعرض طرق العرض المباشر في حزمة تطوير البرامج (SDK) هذه النوعPublisher من مكتبة Reactive Streams.
// Set `responseModalities` to include `AUDIO`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
GenerationConfig config = new GenerationConfig.Builder()
.setResponseModalities(Collections.singletonList(ResponseModality.AUDIO))
.setSpeechConfig(new SpeechConfig(new Voice("Kore"), "en-US"))
.build();
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a model that supports speech generation.
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI())
.generativeModel("gemini-3.1-flash-tts-preview", config);
// Use the GenerativeModelFutures Java compatibility layer.
GenerativeModelFutures model = GenerativeModelFutures.from(ai);
// Provide a text prompt.
String prompt = "Say cheerfully: Have a wonderful day!";
Content content = new Content.Builder().addText(prompt).build();
Executor executor = Executors.newSingleThreadExecutor();
// Call `generateContent` to generate the speech output based on your text prompt.
// Extract the audio data and handle it for downstream use.
ListenableFuture<GenerateContentResponse> response = model.generateContent(content);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
@Override
public void onSuccess(GenerateContentResponse result) {
Part part = result.getCandidates().get(0).getContent().getParts().get(0);
if (part instanceof InlineDataPart) {
byte[] pcmData = ((InlineDataPart) part).getInlineData();
String mimeType = ((InlineDataPart) part).getMimeType();
// To play back PCM audio data, you'll need to write your own `playAudio` function.
playAudio(pcmData);
}
}
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
}
}, executor);
Web
import { initializeApp } from "firebase/app";
import { getAI, getGenerativeModel, GoogleAIBackend, ResponseModality } from "firebase/ai";
// TODO(developer): Replace with your app's Firebase configuration
const firebaseConfig = { /* ... */ };
const firebaseApp = initializeApp(firebaseConfig);
// Initialize the Gemini Developer API backend service.
const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });
// Set `responseModalities` to include `AUDIO`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
const generationConfig = {
responseModalities: [ResponseModality.AUDIO],
speechConfig: {
voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } },
languageCode: "en-US"
}
};
// Create a `GenerativeModel` instance with a model that supports speech generation.
const model = getGenerativeModel(ai, {
model: "gemini-3.1-flash-tts-preview",
generationConfig
});
// Provide a text prompt.
const prompt = "Say cheerfully: Have a wonderful day!";
// Call `generateContent` to generate the speech output based on your text prompt.
const result = await model.generateContent(prompt);
const inlineDataParts = result.response.inlineDataParts();
// Extract the audio data and handle it for downstream use. For example:
if (inlineDataParts?.[0]) {
const pcmBase64 = inlineDataParts[0].inlineData.data;
// Decode base64 to ArrayBuffer
const pcmBuffer = Uint8Array.from(atob(pcmBase64), c => c.charCodeAt(0)).buffer;
// To play back a PCM buffer, you'll need to write your own `playAudio` function.
playAudio(pcmBuffer);
}
Dart
import 'package:firebase_ai/firebase_ai.dart';
// Set `responseModalities` to include `AUDIO`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
final config = GenerationConfig(
responseModalities: [ResponseModality.audio],
speechConfig: SpeechConfig(voiceName: 'Kore', languageCode: 'en-US'),
);
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a model that supports speech generation.
final model = FirebaseAI.googleAI().generativeModel(
model: 'gemini-3.1-flash-tts-preview',
config: config,
);
// Provide a text prompt.
final prompt = 'Say cheerfully: Have a wonderful day!';
// Call `generateContent` to generate the speech output based on your text prompt.
final response = await model.generateContent([Content.text(prompt)]);
// Extract the audio data and handle it for downstream use. For example:
final part = response.candidates.first.content.parts.first;
if (part is InlineDataPart && part.mimeType.startsWith('audio/')) {
final Uint8List pcmData = part.bytes; // Raw PCM bytes (24kHz, 1 channel, 16-bit)
// To play back PCM audio data, you'll need to write your own `playAudio` function.
await playAudio(pcmData);
}
Unity
using Firebase.AI;
// Set `responseModalities` to include `Audio`.
// Configure a `SpeechConfig` with your chosen voice name and language code.
var config = new GenerationConfig(
responseModalities: new System.Collections.Generic.List<ResponseModality> { ResponseModality.Audio },
speechConfig: SpeechConfig.UsePrebuiltVoice("Kore", "en-US")
);
// Initialize the Gemini Developer API backend service.
var ai = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI());
// Create a `GenerativeModel` instance with a model that supports speech generation.
var model = ai.GetGenerativeModel(
modelName: "gemini-3.1-flash-tts-preview",
generationConfig: config
);
// Provide a text prompt.
var prompt = "Say cheerfully: Have a wonderful day!";
// Call `GenerateContentAsync` to generate the speech output based on your text prompt.
var response = await model.GenerateContentAsync(prompt);
// Extract the audio data and handle it for downstream use. For example:
if (response.Candidates.Count > 0) {
foreach (var part in response.Candidates[0].Content.Parts) {
if (part is ModelContent.InlineDataPart inlineData) {
byte[] pcmData = inlineData.Data; // Raw PCM bytes (24kHz, 1 channel, 16-bit)
// To play back PCM audio data, you'll need to write your own `playAudio` function.
playAudio(pcmData);
}
}
}
إنشاء كلام يضمّ عدّة متحدثين
|
قبل تجربة هذا النموذج، أكمل القسم
قبل البدء من هذا الدليل
لإعداد مشروعك وتطبيقك. في هذا القسم، ستنقر أيضًا على زر لمقدّم خدمة Gemini API الذي اخترته حتى يظهر لك محتوى خاص بمقدّم الخدمة في هذه الصفحة. |
يمكنك ضبط النموذج لاستخدام أصوات مختلفة للمتحدثين المختلفين في النص. ويكون هذا مفيدًا لإنشاء الصوت للحوارات أو المحادثات.
أنشئ
MultiSpeakerVoiceConfigيربط أسماء المتحدثين (التي ستستخدمها في طلبك) بأسماء أصوات الردود المحدّدة (على سبيل المثال،Kore).يتيح إعداد المتحدثين المتعدّدين استخدام متحدثَين فقط.
في
GenerationConfig، أدرِج ما يلي:اضبط
responseModalitiesلتضمينAUDIO.اضبط
SpeechConfigباستخدام ما يلي:(مطلوب) أدخِل
MultiSpeakerVoiceConfig.(اختياري) رمز اللغة
في حال عدم تحديد لغة، يمكن Gemini لنماذج تحويل النص إلى كلام التعرّف تلقائيًا على اللغة في الطلب.
في طلبك، حدِّد هوية المتحدث باستخدام أسماء المتحدثين كبادئات (على سبيل المثال،
Joe: Hello. Jane: Hi.).
اتّصِل بـ generateContent مع طلبك النصي. يعرض النموذج
بيانات صوتية بتنسيق PCM في أجزاء الرد.
Swift
import FirebaseAILogic
// Initialize the Gemini Developer API backend service.
let ai = FirebaseAI.firebaseAI(backend: .googleAI())
// Configure a `SpeechConfig` for multiple speakers, assigning a voice to each speaker.
let multiSpeechConfig = SpeechConfig(
multiSpeakerVoiceConfig: MultiSpeakerVoiceConfig(
speakerVoiceConfigs: [
SpeakerVoiceConfig(speaker: "Joe", voiceName: "Puck"),
SpeakerVoiceConfig(speaker: "Jane", voiceName: "Kore")
]
),
languageCode: "en-US"
)
// Set `responseModalities` to include `audio`.
let config = GenerationConfig(
responseModalities: [.audio],
speechConfig: multiSpeechConfig
)
// Create a `GenerativeModel` instance with a model that supports speech generation.
let model = ai.generativeModel(
modelName: "gemini-3.1-flash-tts-preview",
generationConfig: config
)
// Provide a text prompt that includes the names of the speakers.
let prompt = """
Joe: How's it going today Jane?
Jane: Not too bad, how about you?
"""
// Call `generateContent` to generate the speech output based on your text prompt.
let response = try await model.generateContent(prompt)
// Extract the audio data and handle it for downstream use. For example:
for part in response.inlineDataParts {
let data = part.data // Raw PCM audio bytes (24kHz, 1 channel, 16-bit)
let mimeType = part.mimeType // for example: "audio/pcm"
print("Received audio data with MIME type: \(mimeType)")
// To play back raw PCM audio bytes, you'll need to write your own `playRawPcm` function.
playRawPcm(data: data)
}
Kotlin
في Kotlin، تكون الطرق في حزمة تطوير البرامج هذه عبارة عن دوال معلّقة ويجب استدعاؤها من نطاق Coroutine.
// Configure a `SpeechConfig` for multiple speakers, assigning a voice to each speaker.
val multiSpeechConfig = SpeechConfig(
multiSpeakerVoiceConfig = MultiSpeakerVoiceConfig(
speakerVoiceConfigs = listOf(
SpeakerVoiceConfig(speaker = "Joe", voice = Voice("Puck")),
SpeakerVoiceConfig(speaker = "Jane", voice = Voice("Kore"))
)
),
languageCode = "en-US"
)
// Set `responseModalities` to include `AUDIO`.
val config = generationConfig {
responseModalities = listOf(ResponseModality.AUDIO)
speechConfig = multiSpeechConfig
}
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a model that supports speech generation.
val model = Firebase.ai(backend = GenerativeBackend.googleAI())
.generativeModel(
modelName = "gemini-3.1-flash-tts-preview",
generationConfig = config
)
// Provide a text prompt that includes the names of the speakers.
val prompt = """
Joe: How's it going today Jane?
Jane: Not too bad, how about you?
"""
// Call `generateContent` to generate the speech output based on your text prompt.
val response = model.generateContent(prompt)
// Extract the audio data and handle it for downstream use. For example:
val part = response.candidates.firstOrNull()?.content?.parts?.firstOrNull()
if (part is InlineDataPart) {
val pcmData = part.inlineData // Raw PCM bytes (24kHz, 1 channel, 16-bit)
val mimeType = part.mimeType // for example: "audio/pcm"
// To play back PCM audio data, you'll need to write your own `playAudio` function.
playAudio(pcmData)
}
Java
بالنسبة إلى Java، تعرض طرق العرض المباشر في حزمة تطوير البرامج (SDK) هذه النوعPublisher من مكتبة Reactive Streams.
// Configure a `SpeechConfig` for multiple speakers, assigning a voice to each speaker.
MultiSpeakerVoiceConfig multiSpeakerVoiceConfig = new MultiSpeakerVoiceConfig(
Arrays.asList(
new SpeakerVoiceConfig("Joe", new Voice("Puck")),
new SpeakerVoiceConfig("Jane", new Voice("Kore"))
)
);
SpeechConfig multiSpeechConfig = new SpeechConfig(multiSpeakerVoiceConfig);
// Set `responseModalities` to include `AUDIO`.
GenerationConfig config = new GenerationConfig.Builder()
.setResponseModalities(Collections.singletonList(ResponseModality.AUDIO))
.setSpeechConfig(multiSpeechConfig)
.build();
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a model that supports speech generation.
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI())
.generativeModel("gemini-3.1-flash-tts-preview", config);
GenerativeModelFutures model = GenerativeModelFutures.from(ai);
// Provide a text prompt that includes the names of the speakers.
String prompt = "Joe: How's it going today Jane?\nJane: Not too bad, how about you?";
Content content = new Content.Builder().addText(prompt).build();
Executor executor = Executors.newSingleThreadExecutor();
// Call `generateContent` to generate the speech output based on your text prompt.
// Extract the audio data and handle it for downstream use.
ListenableFuture<GenerateContentResponse> response = model.generateContent(content);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
@Override
public void onSuccess(GenerateContentResponse result) {
Part part = result.getCandidates().get(0).getContent().getParts().get(0);
if (part instanceof InlineDataPart) {
byte[] pcmData = ((InlineDataPart) part).getInlineData(); // Raw PCM bytes (24kHz, 1 channel, 16-bit)
String mimeType = ((InlineDataPart) part).getMimeType(); // for example: "audio/pcm"
// To play back PCM audio data, you'll need to write your own `playAudio` function.
playAudio(pcmData);
}
}
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
}
}, executor);
Web
import { initializeApp } from "firebase/app";
import { getAI, getGenerativeModel, GoogleAIBackend, ResponseModality } from "firebase/ai";
// TODO(developer): Replace with your app's Firebase configuration
const firebaseConfig = { /* ... */ };
const firebaseApp = initializeApp(firebaseConfig);
// Initialize the Gemini Developer API backend service.
const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });
// Set `responseModalities` to include `AUDIO`.
// Configure a `SpeechConfig` for multiple speakers, assigning a voice to each speaker.
const generationConfig = {
responseModalities: [ResponseModality.AUDIO],
speechConfig: {
multiSpeakerVoiceConfig: {
speakerVoiceConfigs: [
{ speaker: "Joe", voiceConfig: { prebuiltVoiceConfig: { voiceName: "Puck" } } },
{ speaker: "Jane", voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } } }
]
},
languageCode: "en-US"
}
};
// Create a `GenerativeModel` instance with a model that supports speech generation.
const model = getGenerativeModel(ai, {
model: "gemini-3.1-flash-tts-preview",
generationConfig
});
// Provide a text prompt that includes the names of the speakers.
const prompt = `
Joe: How's it going today Jane?
Jane: Not too bad, how about you?
`;
// Call `generateContent` to generate the speech output based on your text prompt.
const result = await model.generateContent(prompt);
const inlineDataParts = result.response.inlineDataParts();
// Extract the audio data and handle it for downstream use. For example:
if (inlineDataParts?.[0]) {
const pcmBase64 = inlineDataParts[0].inlineData.data; // Raw PCM bytes (24kHz, 1 channel, 16-bit)
const pcmBuffer = Uint8Array.from(atob(pcmBase64), c => c.charCodeAt(0)).buffer;
// To play back a PCM buffer, you'll need to write your own `playAudio` function.
playAudio(pcmBuffer);
}
Dart
import 'package:firebase_ai/firebase_ai.dart';
// Configure a `SpeechConfig` for multiple speakers, assigning a voice to each speaker.
final multiSpeechConfig = SpeechConfig.multiSpeaker(
multiSpeakerVoiceConfig: MultiSpeakerVoiceConfig(
speakerVoiceConfigs: [
SpeakerVoiceConfig(speaker: 'Joe', voiceName: 'Puck'),
SpeakerVoiceConfig(speaker: 'Jane', voiceName: 'Kore'),
],
),
languageCode: 'en-US',
);
// Set `responseModalities` to include `audio`.
final config = GenerationConfig(
responseModalities: [ResponseModality.audio],
speechConfig: multiSpeechConfig,
);
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a model that supports speech generation.
final model = FirebaseAI.googleAI().generativeModel(
model: 'gemini-3.1-flash-tts-preview',
config: config,
);
// Provide a text prompt that includes the names of the speakers.
final prompt = '''
Joe: How's it going today Jane?
Jane: Not too bad, how about you?
''';
// Call `generateContent` to generate the speech output based on your text prompt.
final response = await model.generateContent([Content.text(prompt)]);
// Extract the audio data and handle it for downstream use. For example:
final part = response.candidates.first.content.parts.first;
if (part is InlineDataPart && part.mimeType.startsWith('audio/')) {
final Uint8List pcmData = part.bytes; // Raw PCM bytes (24kHz, 1 channel, 16-bit)
// To play back PCM audio data, you'll need to write your own `playAudio` function.
await playAudio(pcmData);
}
Unity
using Firebase.AI;
// Configure a `SpeechConfig` for multiple speakers, assigning a voice to each speaker.
var multiSpeakerVoiceConfig = new MultiSpeakerVoiceConfig(
new System.Collections.Generic.List<SpeakerVoiceConfig> {
SpeakerVoiceConfig.UsePrebuiltVoice("Joe", "Puck"),
SpeakerVoiceConfig.UsePrebuiltVoice("Jane", "Kore")
}
);
var multiSpeechConfig = SpeechConfig.UseMultiSpeakerVoice(multiSpeakerVoiceConfig);
// Set `responseModalities` to include `Audio`.
var config = new GenerationConfig(
responseModalities: new System.Collections.Generic.List<ResponseModality> { ResponseModality.Audio },
speechConfig: multiSpeechConfig
);
// Initialize the Gemini Developer API backend service.
var ai = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI());
// Create a `GenerativeModel` instance with a model that supports speech generation.
var model = ai.GetGenerativeModel(
modelName: "gemini-3.1-flash-tts-preview",
generationConfig: config
);
// Provide a text prompt that includes the names of the speakers.
var prompt = "Joe: How's it going today Jane?\nJane: Not too bad, how about you?";
// Call `GenerateContentAsync` to generate the speech output based on your text prompt.
var response = await model.GenerateContentAsync(prompt);
// Extract the audio data and handle it for downstream use. For example:
if (response.Candidates.Count > 0) {
foreach (var part in response.Candidates[0].Content.Parts) {
if (part is ModelContent.InlineDataPart inlineData) {
byte[] pcmData = inlineData.Data; // Raw PCM bytes (24kHz, 1 channel, 16-bit)
// To play back PCM audio data, you'll need to write your own `playAudio` function.
playAudio(pcmData);
}
}
}
عرض الرد تدريجيًا
|
قبل تجربة هذا النموذج، أكمل القسم
قبل البدء من هذا الدليل
لإعداد مشروعك وتطبيقك. في هذا القسم، ستنقر أيضًا على زر لمقدّم خدمة Gemini API الذي اخترته حتى يظهر لك محتوى خاص بمقدّم الخدمة في هذه الصفحة. |
يمكنك تحقيق تفاعلات أسرع وتقليل وقت الاستجابة من خلال بث الرد الصوتي أثناء إنشائه، بدلاً من انتظار اكتمال ملف الصوت بالكامل.
يتوفّر بث الكلام الذي تم إنشاؤه لكل من إعدادات المتحدث الواحد والمتحدثين المتعددين. ولا تتوفّر إلا عند استخدام نماذج Gemini 3.x TTS.
لبث الرد الصوتي، اتّصِل بالرقم generateContentStream بدلاً من generateContent وتعامل مع الأجزاء عند وصولها. توضّح الأمثلة التالية كيفية بث استجابة من متحدث واحد:
Swift
import FirebaseAILogic
// Initialize the Gemini Developer API backend service.
let ai = FirebaseAI.firebaseAI(backend: .googleAI())
// Set `responseModalities` to include `audio`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
let config = GenerationConfig(
responseModalities: [.audio],
speechConfig: SpeechConfig(voiceName: "Kore")
)
// Create a `GenerativeModel` instance with a model that supports speech generation.
let model = ai.generativeModel(
modelName: "gemini-3.1-flash-tts-preview",
generationConfig: config
)
// Provide a text prompt.
let prompt = "Tell me a story about a brave knight."
// Call `generateContentStream` to generate the speech output stream based on your text prompt.
let responseStream = try model.generateContentStream(prompt)
// Extract the audio data and handle it for downstream use. For example:
for try await chunk in responseStream {
for part in chunk.inlineDataParts {
let data = part.data // Raw PCM audio bytes (24kHz, 1 channel, 16-bit)
let mimeType = part.mimeType // for example: "audio/pcm"
// Append the audio chunk to your audio queue/buffer for playback.
appendAudioChunk(data)
}
}
Kotlin
في Kotlin، تكون الطرق في حزمة تطوير البرامج هذه عبارة عن دوال معلّقة ويجب استدعاؤها من نطاق Coroutine.
// Set `responseModalities` to include `AUDIO`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
val config = generationConfig {
responseModalities = listOf(ResponseModality.AUDIO)
speechConfig = SpeechConfig(voice = Voice("Kore"))
}
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a model that supports speech generation.
val model = Firebase.ai(backend = GenerativeBackend.googleAI())
.generativeModel(
modelName = "gemini-3.1-flash-tts-preview",
generationConfig = config
)
// Provide a text prompt.
val prompt = "Tell me a story about a brave knight."
// Call `generateContentStream` to generate the speech output stream based on your text prompt.
// Extract the audio data and handle it for downstream use.
model.generateContentStream(prompt).collect { chunk ->
val part = chunk.candidates.firstOrNull()?.content?.parts?.firstOrNull()
if (part is InlineDataPart) {
val pcmChunk = part.inlineData // Raw PCM bytes (24kHz, 1 channel, 16-bit)
val mimeType = part.mimeType // for example: "audio/pcm"
// Append the audio chunk to your audio queue/buffer for playback.
appendAudioChunk(pcmChunk)
}
}
Java
بالنسبة إلى Java، تعرض طرق العرض المباشر في حزمة تطوير البرامج (SDK) هذه النوعPublisher من مكتبة Reactive Streams.
// Set `responseModalities` to include `AUDIO`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
GenerationConfig config = new GenerationConfig.Builder()
.setResponseModalities(Collections.singletonList(ResponseModality.AUDIO))
.setSpeechConfig(new SpeechConfig(new Voice("Kore")))
.build();
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a model that supports speech generation.
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI())
.generativeModel("gemini-3.1-flash-tts-preview", config);
GenerativeModelFutures model = GenerativeModelFutures.from(ai);
// Provide a text prompt.
String prompt = "Tell me a story about a brave knight.";
Content content = new Content.Builder().addText(prompt).build();
// Call `generateContentStream` to generate the speech output stream based on your text prompt.
Publisher<GenerateContentResponse> streamingResponse =
model.generateContentStream(content);
// Extract the audio data and handle it for downstream use.
streamingResponse.subscribe(new Subscriber<GenerateContentResponse>() {
@Override
public void onSubscribe(Subscription s) {
s.request(Long.MAX_VALUE);
}
@Override
public void onNext(GenerateContentResponse chunk) {
Part part = chunk.getCandidates().get(0).getContent().getParts().get(0);
if (part instanceof InlineDataPart) {
byte[] pcmChunk = ((InlineDataPart) part).getInlineData(); // Raw PCM bytes (24kHz, 1 channel, 16-bit)
String mimeType = ((InlineDataPart) part).getMimeType(); // for example: "audio/pcm"
// Append the audio chunk to your audio queue/buffer for playback.
appendAudioChunk(pcmChunk);
}
}
@Override
public void onComplete() {
// Audio stream complete.
}
@Override
public void onError(Throwable t) {
t.printStackTrace();
}
});
Web
import { initializeApp } from "firebase/app";
import { getAI, getGenerativeModel, GoogleAIBackend, ResponseModality } from "firebase/ai";
// TODO(developer): Replace with your app's Firebase configuration
const firebaseConfig = { /* ... */ };
const firebaseApp = initializeApp(firebaseConfig);
// Initialize the Gemini Developer API backend service.
const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });
// Set `responseModalities` to include `AUDIO`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
const generationConfig = {
responseModalities: [ResponseModality.AUDIO],
speechConfig: {
voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } }
}
};
// Create a `GenerativeModel` instance with a model that supports speech generation.
const model = getGenerativeModel(ai, {
model: "gemini-3.1-flash-tts-preview",
generationConfig
});
// Provide a text prompt.
const prompt = "Tell me a story about a brave knight.";
// Call `generateContentStream` to generate the speech output stream based on your text prompt.
const result = await model.generateContentStream(prompt);
// Extract the audio data and handle it for downstream use. For example:
const playbackQueue = [];
for await (const chunk of result.stream) {
const inlineDataParts = chunk.inlineDataParts();
if (inlineDataParts?.[0]) {
const pcmBase64 = inlineDataParts[0].inlineData.data; // Raw PCM bytes (24kHz, 1 channel, 16-bit)
const pcmBuffer = Uint8Array.from(atob(pcmBase64), c => c.charCodeAt(0)).buffer;
// Append the audio chunk to your audio queue/buffer for playback.
playbackQueue.push(pcmBuffer);
}
}
// To play back an array of PCM buffers in sequence, you'll need to write your own `processPlaybackQueue` function.
processPlaybackQueue(playbackQueue);
Dart
import 'package:firebase_ai/firebase_ai.dart';
// Set `responseModalities` to include `audio`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
final config = GenerationConfig(
responseModalities: [ResponseModality.audio],
speechConfig: SpeechConfig(voiceName: 'Kore'),
);
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a model that supports speech generation.
final model = FirebaseAI.googleAI().generativeModel(
model: 'gemini-3.1-flash-tts-preview',
config: config,
);
// Provide a text prompt.
final prompt = 'Tell me a story about a brave knight.';
// Call `generateContentStream` to generate the speech output stream based on your text prompt.
final responseStream = model.generateContentStream([Content.text(prompt)]);
// Extract the audio data and handle it for downstream use. For example:
await for (final chunk in responseStream) {
final part = chunk.candidates.first.content.parts.first;
if (part is InlineDataPart && part.mimeType.startsWith('audio/')) {
final Uint8List pcmChunk = part.bytes; // Raw PCM bytes (24kHz, 1 channel, 16-bit)
// Append the audio chunk to your audio queue/buffer for playback.
appendAudioChunk(pcmChunk);
}
}
Unity
using System.Collections.Generic;
using System.Linq;
using Firebase.AI;
// Initialize the Gemini Developer API backend service.
var ai = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI());
// Set `ResponseModalities` to include `Audio`.
// Configure a `SpeechConfig` with your chosen voice name (and optionally a language code).
var config = new GenerationConfig(
responseModalities: new List<ResponseModality> { ResponseModality.Audio },
speechConfig: SpeechConfig.UsePrebuiltVoice("Kore")
);
// Create a `GenerativeModel` instance with a model that supports speech generation.
var model = ai.GetGenerativeModel(
modelName: "gemini-3.1-flash-tts-preview",
generationConfig: config
);
// Provide a text prompt.
var prompt = "Tell me a story about a brave knight.";
// Call `GenerateContentStreamAsync` to generate the speech output stream based on your text prompt.
var responseStream = model.GenerateContentStreamAsync(prompt);
// Extract the audio data and handle it for downstream use. For example:
await foreach (var response in responseStream)
{
var audioParts = response.Candidates.FirstOrDefault().Content.Parts
.OfType<ModelContent.InlineDataPart>();
foreach (var part in audioParts)
{
byte[] pcmChunk = part.Data; // Raw PCM bytes (24kHz, 1 channel, 16-bit)
// Append the audio chunk to your audio queue/buffer for playback.
appendAudioChunk(pcmChunk);
}
}
التحكّم في الرد الصوتي باستخدام الطلبات
يمكنك التأثير في نبرة الكلام وسرعته وأسلوبه باستخدام تقنيات طلب محدّدة.
تقدّم الأقسام الفرعية التالية حول بنية الطلب وعلامات الصوت إرشادات عامة. للحصول على إرشادات مفصّلة، يُرجى الرجوع إلى دليل الطلبات هذا.
بنية الطلب
للحصول على أفضل النتائج، يجب أن يتضمّن طلبك المكوّنات التالية:
استبدِل
Audio Profileبوصف لشخصية المتحدث وهويته الأساسية ونمطه (مثلاً،A warm, professional narrator).استبدِل
Sceneبوصف للبيئة والأجواء العاطفية (مثلاً،In a quiet libraryأوAmidst a noisy crowd).Director's Notes: صفوا المشاعر والسرعة والأسلوب واللهجة (على سبيل المثال،Speak slowly and with mystery).Sample Context: قدِّم للنموذج نقطة بداية (مثلاً،The speaker is greeting a close friend).النص: النص الفعلي الذي سيتم قراءته. للحصول على أفضل أداء، تأكَّد من أنّ أسلوب النص وسياقه يتوافقان مع الملف الصوتي والملاحظات الإخراجية.
مثال على طلب:
[Audio Profile: A young, energetic voice]
[Scene: A lively sports broadcast]
[Director's Notes: Speak fast, with high energy and excitement]
[Sample Context: The game just ended with a last-second touchdown]
Welcome back fans! What an incredible game we're witnessing today!
علامات صوتية
يمكنك إدراج علامات التنسيق مباشرةً في طلب النص لتوجيه أداء النموذج.
لا تتوفّر علامات الصوت إلا عند استخدام نماذج Gemini 3.x TTS.
تشمل العلامات الشائعة الاستخدام ما يلي:
-
[whispers]: للتحدث بصوت منخفض [laughs]: لإضافة ضحك[giggles]: لإضافة ضحكات[sighs]: لإضافة تنهيدة[gasp]: لإضافة gasp-
[shouting]: الصراخ -
[excited]: للتعبير عن الحماس [serious]: التحدّث بجدية-
[sighs whispers]: المشاعر المدمجة (يمكنك دمج العلامات)
يُرجى مراعاة ما يلي عند استخدام العلامات الصوتية:
لا توجد قائمة شاملة: لا توجد قائمة ثابتة بالعلامات المتوافقة. يمكنك تجربة مشاعر وتعبيرات مختلفة (مثل
[bored]أو[sarcastically]أو حتى[like dracula]) لمعرفة كيف تتغير النتيجة.طلب نصي بلغة أخرى غير الإنجليزية: إذا كان طلبك النصي بلغة أخرى غير الإنجليزية، ننصحك باستخدام علامات صوتية باللغة الإنجليزية للحصول على أفضل النتائج.
مثال على طلب:
I have a secret to tell you. [whispers] I found the hidden treasure. [laughs] I can't believe it!
القيود والمتطلبات
يُرجى الانتباه إلى القيود والمتطلبات التالية عند استخدام ميزة إنشاء الكلام:
يتيح إعداد المتحدثين المتعدّدين استخدام متحدثَين فقط.
لا تتوفّر الميزات التالية إلا عند استخدام نماذج Gemini 3.x TTS: البث، وعلامات الصوت، واللغات الإضافية التي يتم رصدها تلقائيًا.
القيود المفروضة على gemini-3.1-flash-tts-preview
- عدم تطابق الصوت: قد لا يتطابق الناتج الذي يقدّمه النموذج دائمًا مع صوت المتحدث المحدّد إذا كانت نبرة صوت الطلب وسياقه لا يتوافقان مع الملف الشخصي للمتحدث (على سبيل المثال، صوت رجل عميق يحاول التحدث مثل فتاة صغيرة). تأكَّد من أنّ سياق الطلب يطابق الصوت.
- نتائج أطول: قد تنخفض جودة الصوت واتساقه إذا كانت مدة المقطع الصوتي أطول من بضع دقائق. ننصحك بتقسيم الطلبات النصية الطويلة إلى أجزاء أصغر.
- عرض رموز مميزة نصية في بعض الأحيان: يعرض النموذج في بعض الأحيان رموزًا مميزة نصية بدلاً من رموز مميزة صوتية، ما يؤدي إلى تعذُّر تنفيذ الطلب وظهور الخطأ
500. وبما أنّ هذا يحدث بشكل عشوائي في نسبة صغيرة من الطلبات، عليك تنفيذ منطق إعادة المحاولة في تطبيقك. - الرفض الخاطئ من المصنّف: قد تؤدي الطلبات الغامضة إلى عدم اجتياز مصنّف تركيب الكلام، ما يؤدي إلى رفض الطلب (
PROHIBITED_CONTENT) أو جعل النموذج يقرأ تعليمات الأسلوب بصوت عالٍ. لتجنُّب ذلك، استخدِم طلبًا منظَّمًا يتضمّن مقدمة واضحة (مثلAudio ProfileوDirector's Notes) في بداية الطلب.
الأصوات واللغات المتوافقة
تتلقّى نماذج Gemini لتحويل النص إلى كلام نصًا كمدخل وتنشئ مخرجات صوتية، وبالتالي تكون الاستجابة هي الكلام المركّب نفسه. تدرج الأقسام الفرعية التالية الأصوات واللغات المتوافقة التي يمكن لنماذج Gemini لتحويل النص إلى كلام "التحدث" بها (أو الرد بها).
تتوفّر الأصوات بلغات متعدّدة، ما يعني أنّه يمكنك استخدام الصوت نفسه لإنشاء كلام بأي من اللغات المتوافقة. على سبيل المثال، يمكنك ضبط الصوت على
Kore وإرسال مجموعة من الطلبات النصية بالإسبانية والهندية والفيتنامية. ستكون الردود بصوت Kore، ولكن بكل لغة من تلك اللغات المختلفة.
أسماء الأصوات
تتيح نماذج Gemini TTS استخدام 30 صوتًا مختلفًا عالي الدقة، ولكل منها خصائص مميزة. يمكنك الاطّلاع على قائمة بخيارات صوت الردود والاستماع إلى عيّنات من كل صوت من خلال توسيع القسم أدناه.
اللغات
يمكن لنماذج Gemini تحويل النص إلى كلام تلقائيًا رصد اللغات التالية في طلبك النصي. سيكون الكلام الذي تم إنشاؤه بهذه اللغة.
يُرجى العِلم أنّه يمكنك اختياريًا تحديد رمز اللغة بشكل صريح في إعدادات الكلام.
اللغات المتوافقة مع جميع نماذج إنشاء الصوت
| اللغة | رمز BCP-47 | اللغة | رمز BCP-47 |
|---|---|---|---|
| العربية (المصرية) | ar-EG | الألمانية (ألمانيا) | de-DE |
| الإنجليزية (الولايات المتحدة) | en-US | الإسبانية (الولايات المتحدة) | es-US |
| الفرنسية (فرنسا) | fr-FR | الهندية (الهند) | hi-IN |
| الإندونيسية (إندونيسيا) | id-ID | الإيطالية (إيطاليا) | it-IT |
| اليابانية (اليابان) | ja-JP | الكورية (كوريا) | ko-KR |
| البرتغالية (البرازيل) | pt-BR | الروسية (روسيا) | ru-RU |
| الهولندية (هولندا) | nl-NL | البولندية (بولندا) | pl-PL |
| التايلاندية (تايلاند) | th-TH | التركية (تركيا) | tr-TR |
| الفيتنامية (فيتنام) | vi-VN | الرومانية (رومانيا) | ro-RO |
| الأوكرانية (أوكرانيا) | uk-UA | البنغالية (بنغلاديش) | bn-BD |
| الإنجليزية (الهند) | حزمة en-IN وhi-IN | الماراثية (الهند) | mr-IN |
| التاميلية (الهند) | ta-IN | التيلوغوية (الهند) | te-IN |
لغات إضافية متوافقة مع نماذج 3.x لإنشاء الصوت
| اللغة | رمز BCP-47 | اللغة | رمز BCP-47 |
|---|---|---|---|
| الأفريقانية | af | الفلبينية | fil |
| الألبانية | sq | الفنلندية | الفنلندية |
| الأمهرية | صباحًا | الغليشيانية | gl |
| الأرمينية | hy | الجورجية | ka |
| الأذربيجانية | az | اليونانية | el |
| الباسكية | eu | الغوجاراتية | gu |
| البيلاروسية | be | اللغة الكريولية الهايتية | ht |
| البلغارية | bg | العبرية | he |
| البورمية | الخاص بي | الهنغارية | hu |
| الكتالانية | ca | الأيسلندية | هو |
| السيبيوانية | ceb | الجافانية | jv |
| الصينية، المندرينية | cmn | الكانادا | kn |
| الكرواتية | ساعة | الكونكانية | kok |
| التشيكية | cs | اللاوية | lo |
| الدانماركية | da | اللاتينية | la |
| الإستونية | et | اللاتفية | اللاتفية |
| الليتوانية | lt | اللوكسمبورغية | رطل |
| المقدونية | mk | المايثلية | mai |
| الملغاشية | مليغرام | الماليزية | ms |
| المالايالامية | ml | المنغولية | mn |
| النيبالية | ne | النرويجية، بوكمال | nb |
| النرويجية، نينورسك | nn | الأوديا | أو |
| البشتو | ps | الفارسية | fa |
| بنجابي | pa | الصربية | sr |
| السندية | sd | السنهالية | si |
| السلوفاكية | السلوفاكية | السلوفينية | sl |
| السواحيلية | sw | السويدية | sv |
| الأوردية | ur |
(اختياري) ضبط رمز اللغة بشكل صريح
في حال عدم تحديد رمز اللغة في إعدادات الكلام، سيرصد النموذج اللغة تلقائيًا في طلبك النصي.
ومع ذلك، يمكنك بشكل اختياري تحديد اللغة بشكل صريح (باستخدام المَعلمة languageCode في إعدادات الكلام). لإجراء ذلك، يجب استخدام أحد رموز اللغات المتوافقة التالية وفقًا لمعيار BCP-47:
- العربية:
ar-XA - البنغالية:
bn-IN - الصينية (الماندرين):
cmn-CN - الهولندية:
nl-NL - الإنجليزية:
en-USوen-GBوen-AUوen-IN - الفرنسية:
fr-FR،fr-CA - الألمانية:
de-DE - الغوجاراتية:
gu-IN - الهندية:
hi-IN - الإندونيسية:
id-ID - الإيطالية:
it-IT - اليابانية:
ja-JP - الكانادية:
kn-IN - الكورية:
ko-KR - المالايالامية:
ml-IN - المراثية:
mr-IN - البولندية:
pl-PL - البرتغالية:
pt-BR - الروسية:
ru-RU - الإسبانية:
es-US،es-ES - التاميلية:
ta-IN - التيلوغوية:
te-IN - التايلاندية:
th-TH - التركية:
tr-TR - الفيتنامية:
vi-VN
ما هي الإجراءات الأخرى التي يمكنك تنفيذها؟
- تعرَّف على كيفية احتساب الرموز المميزة قبل إرسال طلبات طويلة إلى النموذج.
-
ابدأ التفكير في الاستعداد للإصدار العلني (راجِع قائمة المهام لعملية الإنتاج):
- فرض Firebase App Check في أقرب وقت ممكن للمساعدة في حماية Gemini API من إساءة الاستخدام من قِبل البرامج غير المصرّح بها
- استخدِم Firebase Remote Config أو نماذج طلبات الخادم لتتمكّن من إجراء تغييرات عند الطلب على إعدادات ميزة الذكاء الاصطناعي (مثل اسم النموذج) بدون إصدار نسخة جديدة من تطبيقك.
تجربة إمكانات أخرى
- إنشاء محادثات مترابطة (محادثة)
- إنشاء نص من طلبات نصية فقط
- إنشاء ناتج منظَّم (مثل JSON) من الطلبات النصية وطلبات الوسائط المتعددة
- إنشاء الصور وتعديلها من الطلبات النصية وطلبات الوسائط المتعددة
- بث الإدخال والإخراج (بما في ذلك الصوت) باستخدام Gemini Live API
-
استخدِم أدوات (مثل استدعاء الدوال
وGrounding باستخدام
Google Search أوGoogle Maps ) لربط نموذج Gemini بأجزاء أخرى من تطبيقك وأنظمة ومعلومات خارجية.
كيفية التحكّم في إنشاء المحتوى
- فهم تصميم الطلبات، بما في ذلك أفضل الممارسات والاستراتيجيات وأمثلة على الطلبات
- ضبط مَعلمات النموذج مثل أقصى عدد لرموز الناتج المميّزة، واحتمالية تكرار رموز الناتج المميّزة، وما إلى ذلك
- استخدام إعدادات الأمان لتعديل احتمالية تلقّي ردود قد تُعتبر ضارة
مزيد من المعلومات عن النماذج المتاحة
يمكنك الاطّلاع على النماذج المتاحة لمختلف حالات الاستخدام والحصص والأسعار الخاصة بها.تقديم ملاحظات حول تجربتك مع Firebase AI Logic