Lingara Lingara दस्तावेज़ मार्गदर्शिकाएँ API लाइब्रेरी ऐप बनाएं एम्बेड वेब ऐप
भाषा: हिन्दी

NPC संवाद

यह पेज अंग्रेज़ी से अनुवादित है। अगर दोनों में अंतर हो, तो अंग्रेज़ी पेज सही है। अंग्रेज़ी पेज पढ़ें

आपके गेम का कोई किरदार खिलाड़ी के साथ उस भाषा में बातचीत कर सकता है जो वे सीख रहे हैं, उनके स्तर के अनुसार। खिलाड़ी जो भी पंक्ति कहता है वह एक टर्न है: प्लेयर किट उसे भेजता है, और किरदार का जवाब टुकड़ों में स्ट्रीम होकर वापस आता है।

एक टर्न में क्या होता है

हर टर्न वह सब कुछ भेजता है जिसकी किरदार को ज़रूरत है, क्योंकि Lingara टर्न के बीच कोई बातचीत नहीं रखता:

  • npc: कौन बोल रहा है। इसका name 1 से 32 अक्षरों का होता है, और इसका वैकल्पिक persona विवरण की एक पंक्ति है, 1 से 120 अक्षरों की, जैसे “एक डम्पलिंग विक्रेता”।
  • scene: वैकल्पिक, बातचीत कहाँ होती है, 1 से 160 अक्षर।
  • source_lang और target_lang: खिलाड़ी की अपनी भाषा और वह भाषा जो वे सीख रहे हैं। ये अलग-अलग होनी चाहिए, और किरदार केवल target_lang बोलता है।
  • level: खिलाड़ी का स्तर, 1 से 9 तक। Lingara की गाइड “एक स्तर का क्या अर्थ है” इस पैमाने का वर्णन करती है।
  • line: खिलाड़ी ने अभी जो कहा, 1 से 500 अक्षर।
  • history: अब तक की बातचीत, सबसे पुरानी पहले, अधिकतम 12 पंक्तियाँ। हर पंक्ति में एक speaker होता है, या तो player या npc, और उसका text, 1 से 500 अक्षर।

हर टेक्स्ट एक ही पंक्ति का होता है। बातचीत आपका गेम रखता है: प्लेयर किट आपके द्वारा खोले गए हर संवाद के लिए विंडो रखता है, हर पूरे हुए टर्न को उसमें जोड़ता है, हर जवाब को उसके पहले 500 अक्षरों तक काटता है, और 12 से आगे की सबसे पुरानी पंक्तियाँ हटा देता है।

Lingara पर्सोना और सीन को आपके गेम से आए अविश्वसनीय टेक्स्ट के रूप में देखता है। वे तय करते हैं कि किरदार कैसे बोलता है, कभी यह नहीं कि उसे क्या करने की अनुमति है।

जवाब कैसे आता है

जवाब टेक्स्ट के टुकड़ों के रूप में स्ट्रीम होता है, जिन्हें आपका गेम आते ही जोड़ता जाता है। उनके बीच कोई सूचना आ सकती है, जैसे यह बताने वाली कि जवाब बीच में काट दिया गया। जब जवाब पूरा हो जाता है तो टर्न done के साथ समाप्त होता है, या विफल होने पर error के साथ। टर्न को फिर से शुरू नहीं किया जा सकता: अगर कनेक्शन टूट जाए, तो खिलाड़ी पंक्ति फिर से कहता है।

हर किरदार से एक बार में एक ही पंक्ति कहें। जब किरदार अभी जवाब दे रहा हो, तब कही गई पंक्ति कतार में रखने के बजाय अस्वीकार कर दी जाती है, क्योंकि हर टर्न का बिल बनता है।

भुगतान कौन करता है

केवल मीटर्ड क्लाइंट के खिलाड़ी ही बातचीत कर सकते हैं, और हर टर्न का बिल उसी क्लाइंट को जाता है। खिलाड़ी के टोकन को embed:play की ज़रूरत होती है।

कोड उदाहरण की भाषा

Bevy

fn spawn_seller(mut commands: Commands) {
    let mei = NpcDialogue::new("Mei", "zh", 2)
        .and_then(|npc| npc.with_persona("a dumpling seller"))
        .and_then(|npc| npc.with_scene("the night market"))
        .expect("within Lingara's bounds");
    commands.spawn(mei);
    commands.spawn(Player);
}

/// One turn at a time: a line said while the NPC is replying is a `Busy` error.
fn talk(keys: Res<ButtonInput<KeyCode>>, npcs: Query<Entity, With<NpcDialogue>>, mut say: MessageWriter<NpcSay>) {
    if keys.just_pressed(KeyCode::Digit1) {
        for entity in &npcs {
            say.write(NpcSay { entity, line: "饺子多少钱?".into() });
        }
    }
}

/// `streaming` grows as the reply arrives; `turns` holds the finished ones.
fn show_reply(transcripts: Query<&NpcTranscript, Changed<NpcTranscript>>) {
    for transcript in &transcripts {
        if let Some(partial) = &transcript.streaming {
            info!("…{partial}");
        }
    }
}

Unity

public DialogueId OpenDialogue(string npc, string sourceLang, string targetLang, byte level) =>
    Client.DialogueOpen(new DialogueConfig { Npc = new Npc { Name = npc }, SourceLang = sourceLang, TargetLang = targetLang, Level = level });

// The reply streams back as NpcTurn events: append each Fragment's text to your label.
public RequestId Say(DialogueId dialogue, string line) => Client.DialogueSay(dialogue, line);

Godot C#

public long OpenDialogue(string npc, string sourceLang, string targetLang, byte level) =>
    Client.DialogueOpen(new DialogueConfig { Npc = new Npc { Name = npc }, SourceLang = sourceLang, TargetLang = targetLang, Level = level }).Value;

// The reply streams back as NpcTurnFragment signals, then one NpcTurnFinished.
public long Say(long dialogue, string line) => Client.DialogueSay(new DialogueId(dialogue), line).Value;

GDScript

# A LingaraNpc child per character: npc_name, target_lang and level in the
# inspector. say() returns false while a turn is in flight (turns are never
# queued, because each one is billed).
func talk_to_mei(line: String) -> void:
	if mei.say(line):
		bubble.text = "…"


func _on_mei_replied(text: String) -> void:
	bubble.text = text

Unreal C++

void ALingaraEmbedSnippetActor::Say(const FString& Line)
{
	ELingaraCallResult Result;
	FLingaraEmbedError Error;
	if (Dialogue == 0)
	{
		FLingaraDialogueConfig Config;
		Config.Npc.Name = TEXT("Mei");
		Config.Npc.Persona = TEXT("a tea seller at the night market");
		Config.SourceLang = TEXT("en");
		Config.TargetLang = TEXT("zh");
		Config.Level = 2;
		Dialogue = Lingara()->DialogueOpen(Config, Result, Error);
	}
	Reply.Reset();
	Lingara()->DialogueSay(Dialogue, Line, Result, Error);
}

// The reply streams back as npc_turn events: append each fragment.
void ALingaraEmbedSnippetActor::HandleNpcTurn(const FLingaraNpcTurn& Turn)
{
	if (Turn.Dialogue == Dialogue && Turn.Update.Type == ELingaraNpcTurnUpdateType::Fragment)
	{
		Reply += Turn.Update.Text;
	}
}

Kotlin

fun talkToMei(line: String) {
    val dialogue = npc ?: lingara.dialogueOpen(DialogueConfig(Npc("Mei", "a tea seller"), "the tea house", "en", "zh", 2, emptyList()))
    npc = dialogue
    lingara.dialogueSay(dialogue, line)
}

private fun onNpcTurn(update: NpcTurnUpdate) {
    when (update) {
        is NpcTurnUpdate.Opened -> bubble = ""
        is NpcTurnUpdate.Fragment -> bubble += update.text
        is NpcTurnUpdate.Finished -> bubble = update.text
        else -> Unit
    }
}

Java

void talkToMei(String line) {
  if (npc < 0) {
    Npc mei = new Npc("Mei", "a tea seller");
    npc =
        lingara.dialogueOpen(new DialogueConfig(mei, "the tea house", "en", "zh", 2, List.of()));
  }
  lingara.dialogueSay(npc, line);
}

void onNpcTurn(EmbedEvent.NpcTurn turn) {
  if (turn.getUpdate() instanceof NpcTurnUpdate.Fragment fragment) {
    bubble.append(fragment.getText());
  } else if (turn.getUpdate() instanceof NpcTurnUpdate.Finished finished) {
    bubble.setLength(0);
    bubble.append(finished.getText());
  }
}

यह भी देखें