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 ចាត់ទុក persona និងឈុតឆាក ជាអត្ថបទដែលមិនគួរទុកចិត្តពីហ្គេមរបស់អ្នក។ ពួកវាកំណត់របៀបដែលតួអង្គនិយាយ មិនដែលកំណត់អ្វីដែលវាត្រូវបានអនុញ្ញាតឲ្យធ្វើឡើយ។

របៀបដែលការឆ្លើយតបមកដល់

ការឆ្លើយតបស្ទ្រីមមកជាដុំៗនៃអត្ថបទ ដែលហ្គេមរបស់អ្នកបន្ថែមបន្តគ្នានៅពេលវាមកដល់។ សេចក្ដីជូនដំណឹងមួយអាចមកដល់នៅចន្លោះពួកវា ដូចជាសេចក្ដីជូនដំណឹងដែលប្រាប់ថាការឆ្លើយតបត្រូវបានកាត់ឲ្យខ្លី។ វេនបញ្ចប់ដោយ 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());
  }
}

មើលផងដែរ