Uygulamayı aç
Moonborn — Developers

Bir karaktere birden çok ses ver (Mask varyantları)

Kanonik karakterin Soul / Self'i kilitli kalsın, Mask'ini farklı sahneler (sahnede, özelde, rakiple) için fork'la; distinctiveness ile çöküşü erken yakala.

İyi yazılmış bir karakter farklı sahnelerde farklı konuşur. Bir lider basın toplantısında on-stage (sahnede) sesinde, sevdiği biriyle yalnız vulnerable (kırılgan) sesinde, rakibiyle yüz yüze withheld (tutulmuş) sesinde konuşur — ama hepsi aynı kişidir. Bunu Moonborn modelinde bir karakter, bir Soul, bir Self, birden fazla Mask varyantı olarak ifade edersin.

Bu rehber kanonik bir karakteri sahne tabanlı Mask varyantlarına fork'lar, distinctiveness uzaklığını sağlıklı aralıkta tutar, ve "iki Mask mı yoksa iki karakter mi?" kararını netleştirir.

Bu rehberi bitirdiğinde

  • Bir karaktere birden çok Mask varyantı eklerken Soul + Self'i kilitli tutabileceksin.
  • Hangi sahnenin hangi varyantı çağırdığını not edebileceksin.
  • Varyantlar arası distinctiveness uzaklığını sağlıklı bantta tutabileceksin (0.15 – 0.30).
  • Soul refine cazibesine karşı koyabilecek, "iki ses" ile "iki karakter" arasındaki çizgiyi ayırabileceksin.
  • Lineage tree'de Mask kardeşlerini (sibling) doğru organize edebileceksin.

Ön koşul: Bir kanonik karakter ve API anahtarı. Fork mekaniği yeni bir konuysa önce Marka varyantlarını fork'la eğitimine bak — orada öğrendiğin desen bu rehberin altında çalışır.

Desen — Soul / Self kilitli, Mask refine

Tek bir Soul + tek bir Self karakterin kim olduğunu belirler. Mask karakterin nasıl konuştuğunu belirler. Varyantlar arası fark sadece Mask'te oturur:

const onStage = await client.personas.fork({
  id: canonical.id,
  refine: {
    mode: 'refine',
    layer: 'mask',
    axis: 'more-performative',
    amount: 0.5,
  },
  note: 'Sahne sesi — basın toplantısı, açılış konuşması',
});
 
const inPrivate = await client.personas.fork({
  id: canonical.id,
  refine: {
    mode: 'refine',
    layer: 'mask',
    axis: 'more-vulnerable',
    amount: 0.4,
  },
  note: 'Özel ses — yakın arkadaşlar, aile',
});
 
const withRival = await client.personas.fork({
  id: canonical.id,
  refine: {
    mode: 'refine',
    layer: 'mask',
    axis: 'withheld',
    amount: 0.55,
  },
  note: 'Rakiple — kontrollü, tutulmuş duygu',
});

Hangi Mask varyantını ne zaman

Tipik bir karakter için Mask varyantlarını sahne temelli düşün:

VaryantSahneTipik eksen (axis)
canonicalAnlatıcı seviyesi, varsayılan ses
on-stageBasın toplantısı, halka açık konuşma, sahne anımore-performative
in-privateYakın arkadaş, aile, yalnız anlarmore-vulnerable
with-rivalYüzleşme, gizlenmiş duyguwithheld
with-mentorSaygı, soru sorma, korumayı indirmemore-curious
in-griefKayıp sonrası, kayıt (register) düzleşirmore-flat

Distinctiveness sağlık kontrolü

Varyantlar seste farklılaşmalıdır, ama farklı karakterlere çökmemelidir. Fork sonrası ölç:

const cmp = await client.consistency.compare({
  fromPersonaId: canonical.id,
  toPersonaId: onStage.id,
});
 
console.log(`canonical ↔ on-stage: ${cmp.value.toFixed(2)}`);

Skoru üç banda göre oku:

Refine etki etmedi; "amount" çok küçük ya da
eksen karakterin Mask'inde zaten kodluydu.
→ Daha büyük amount ile yeniden fork'la
  veya farklı eksen seç.

Soul + Self'i refine etme cazibesi

Bir varyantı "karanlık" yapmak istediğinde Soul'u (örn. fear'ı) düzenlemek cazip gelir. Karşı koy.

İki Soul'lu bir karakter, iki sesli bir karakter değildir; iki karakterdir. Soul karakterin neden var olduğudur; bunu değiştirirsen soy (lineage) kenarı artık aynı kişiyi temsil etmez.

Eğer ikinci sesin gerçekten farklı bir motivasyondan geliyorsa:

  1. Mask varyantı olarak tutmayı bırak.
  2. Soy kökünden (lineage root) yeni bir Soul niyet metniyle (intent) fork yap.
  3. Bu yeni karakteri kardeşi, alter egosu, yansıması olarak kabul et — çocuk (child) değil, kardeş (sibling).

Lineage tree'de Mask kardeşlerini organize et

Aynı kanonik karakterden türeyen Mask varyantları soy ağacında kardeş olarak görünür. getLineage çağrısı:

const lineage = await client.personas.getLineage({ id: canonical.id });
 
console.log(lineage.children.map((c) => ({
  id: c.id,
  note: c.note,
  layer: c.refine?.layer,
})));

Beklenen:

[
  { "id": "per_onstage...", "note": "Sahne sesi",     "layer": "mask" },
  { "id": "per_private...", "note": "Özel ses",       "layer": "mask" },
  { "id": "per_rival...",   "note": "Rakiple",        "layer": "mask" }
]

Hepsi layer: "mask" çünkü hepsi aynı tipte varyant. Bir kardeş layer: "soul" ise — uyarı işareti: ya yanlışlıkla Soul refine yapılmıştır ya da gerçekten kardeş değildir, ayrı karakter olmalıdır.

Sahne-varyant eşleme tablonu tut

Üretimde hangi sahnenin hangi varyantı çağıracağı kod tarafında belirleyici olmalıdır. Tipik desen: bir arama (lookup) tablosu.

const SCENE_TO_VARIANT: Record<string, string> = {
  'press-conference': 'per_onstage...',
  'keynote': 'per_onstage...',
  'private-call': 'per_private...',
  'rival-meeting': 'per_rival...',
  'default': canonical.id, // anlatı yedeği
};
 
function getVariantForScene(sceneId: string): string {
  return SCENE_TO_VARIANT[sceneId] ?? SCENE_TO_VARIANT.default;
}

İlgili

Persona yapım atölyesi

Mask refine için eksen seçimi ve niyet metni yazma çalışması.

Open →
Marka varyantlarını fork'la

Varyant fork mekaniğinin adım adım eğitimi.

Open →
Lineage fork tree kavramı

Mask kardeşlerinin soy ağacında nasıl organize edildiği.

Open →
Distinctiveness kavramı

Voice fingerprint uzaklığı nasıl ölçülür, sağlıklı bantlar neye göre.

Open →