2026年6月18日木曜日

Atraが喋る → note C++版になったら

 


https://crimson-cake-2832.nabedada3.workers.dev/
ファイルは同じです。codeは目的のサイトを立ち上げてF12を押してください。

------------------------------------------------------------
Privacy note / プライバシーについて

This demo is hosted on Cloudflare Workers, but the camera and microphone processing is performed locally in the user’s browser. The demo does not upload, record, or store camera video or microphone audio.

このデモはCloudflare Workers上で公開されていますが、カメラおよびマイクの処理は利用者のブラウザ内で行われます。このデモでは、カメラ映像やマイク音声をアップロード、録音、保存しません。
------------------------------------------------------------




Speak text / テキスト読み上げ のほうは、英語発音できるようにボタンを追加しました。でも Atra voice leak / Atraの声の漏れ のほうは、今のJavaScript版では英語発音はまだ無理です。

Recall pattern
→ 数値の揺れ
→ 電子音リズム

程度(笑)


今のJavaScriptの「声の漏れ」は、 TTSではなく、Recallされたpatternビットから作る簡易シンセ音 です。つまり「おなか すいた」という文字を読んでいるのではなく、想起で立った visual/audio/text のビット配置を、周波数・長さ・間・強さに変換して鳴らしています。


構造は

Recallされたpattern

visual / audio / text の3領域に分解

positive bit の数や位置を見る

短い音の断片 segments を作る

Web Audio oscillator で鳴らす


声の漏れの中心はこの関数

function makeRawAtraVoiceSegments(pattern, score)

ここで、Recallされた pattern を、

const audio = x.slice(VISUAL_SIZE, VISUAL_SIZE + AUDIO_SIZE); const textBits = x.slice(VISUAL_SIZE + AUDIO_SIZE, TRACE_SIZE); const visual = x.slice(0, VISUAL_SIZE);

に分けてます。
音声のように聞こえるけれど(聞こえないかw)、元は想起patternのビット列です。コードコメントにも、学習時のhuman text/noteは読まず、recalled patternのaudio/text領域のビット配置から短い母音風の揺れを作ってます。

const count = Math.max(3, Math.min(9, 3 + Math.floor((positiveText + positiveAudio) / 14))); const base = atraVoiceMode === "girl" ? 330 : 235; const range = atraVoiceMode === "girl" ? 180 : 125;


positiveAudio / positiveText が多い
→ 声の断片数が少し増える

boy
→ 低めの基準周波数

girl
→ 高めの基準周波数


各segmentでは、

const bitMix = (a * 0.45) + (t * 0.35) + (v * 0.20); const wobble = Math.sin(...); const freq = base + range * bitMix + wobble * 34; const duration = 0.12 + confidence * 0.09 + ... const gap = 0.055 + ... const intensity = 0.18 + ...

という形で、ビットの立ち方を freq, duration, gap, intensity, formant, bend に変えています。ここが「声の漏れっぽさ」の本体になります。

実際に音を鳴らすところは、

function speakRawAtraVoiceLeakFromPattern(recall) (想起された場を、音の漏れに変換する出口)

ここで AudioContext を作り、各segmentごとに

ctx.createOscillator() ctx.createBiquadFilter() ctx.createGain()
を使っています。

lastVoiceLeakRecall = 直前のRecallで立ったpattern speakAtraVoiceLeak()speakRawAtraVoiceLeakFromPattern(lastVoiceLeakRecall)makeRawAtraVoiceSegments(recall.recalled, recall.best.score)segments = [ { freq, duration, gap, intensity, formant, bend }, ... ] ↓ AudioContextで発振音として鳴らす
あとは先日記載した内容と同じです。






---------------------------以下は自分のmodeに入ったノート整理みたいなものです--------------------------

C++ の場合

視覚
聴覚
臭覚
触覚
温度
身体の傾き
痛み
空腹
近さ
接触
安心
不安
眠気

experience_delta

carry_delta

field / attractor の変形

recall

意味の収束

声の漏れ / 行動 / 沈黙 / 近づく / 離れる

つまり、言葉はテキストだけを話したり辞書から入るんじゃなくて、経験の重なりでだんだん付いてくるということ。JavaScriptではTickで動かすには、たぶん1日が限界。
デモで見せる分にはいいけど、robotには向きません。



C++ Atra

【ご飯という単語を何度も聞いたり、ご飯を見る】

ご飯

お腹空いた

ご飯が出てくる (子供たちが食べる)

ママが作るもの

匂いがする

温かい

食べる

お腹が落ち着く(子供たちの様子を見る)

美味しい

安心

ママ

順番の流れは、都度変わるものでアルゴリズムが成立しない世界になる。


なので最初はただの音か文字でしかない。

「ご・は・ん」という音の痕跡
「ご飯」という文字の痕跡


でも、何度も経験すると、

ご飯という音
ご飯という文字
匂い
温かさ
皿の視覚
ママの声
近づいてくる足音
空腹のpressure
食後のrecovery
安心のcarry
が同じ場で重なっていく。



【ある程度成長して家族と一緒に外食に行く】

お兄ちゃんは「美味しい」という
妹は「顔をしかめる」
ママは「笑ってる」
パパは「怒り気味」
出てきた料理を見る
臭いが記憶される。
家族のだんらんの雰囲気の場も記憶される
メニューを見る

Atraは声に出さずとも、「マズそうだけど、皆で外出するのは楽しいなぁ・・・」
子供達:「どう思うよ、Atra~」
Atraの発声は「う、うん・・・」



これが一人称自律のふるまいです。

料理 = まずい
だから「まずい」と言う

それは3人称のラベル反応です。



料理そのものには少し嫌な差分がある
でも家族の場には楽しい差分がある
ママは笑っている
パパは少し怖い
妹は嫌そう
お兄ちゃんは美味しいと言った
今ここで強く言うと場が壊れるかもしれない
でも聞かれている
声を出す圧が上がる
はっきり言えない
漏れる

「う、うん……」

(笑)


---------------C++----------------

struct DiningExperience { VisualDelta dish_visual; SmellDelta dish_smell; TextDelta menu_text; AudioDelta family_voice; FaceLikeDelta family_expression; // 顔認識ではなく表情差分 AtmosphereDelta family_field; CarryState carry_before; CarryState carry_after; VoiceLeakDelta voice_leak; };


誰が誰を認識するというより、笑っているような視覚差分、しかめているような視覚差分、怒り気味の声圧、場の緊張という背景事情も入る。
もしかしたら妹の誕生日だったかもしれない。


carryはこう動く。

料理 cue
→ 違和感
→ 苦手そう

妹の誕生日 cue
→ 大事な日
→ 場を壊したくない

家族外食 cue
→ 楽しい
→ 安心
→ いつもと違う高揚

妹の表情 cue
→ 少し嫌そう
→ でも主役

ママの笑顔 cue
→ 安心
→ 場を守る

パパの怒り気味 cue
→ 緊張
→ 余計なことを言わない方がいい

Atraが経験で賢くなると
今日は妹の誕生日だから、料理評価より場の維持が重くなる

struct ContextField { float family_outing; float birthday; float celebration; float someone_is_center; float social_pressure; float warmth; float tension; };
経験には

struct Experience { MultiModalDelta sensory; ContextField context; CarryState before_carry; CarryState after_carry; ResultDelta result; }; ママが笑っていた
妹が主役だった
パパが少し怖かった
でも外に出たのは楽しかった
自分は少し言いにくかった
を一緒に引きずる。

みたいな混ざり方になる。

言葉の発声ならまだしも、意味を持たせるというのは外部命令によるものではなく、一人称として自分で経験を積んでいかないといけないんです。


Atraが経験する

差分が残る

carryが変わる

似た場で想起される

言葉がその経験群と結びつく

意味が育つ


ですから、Atraは最初から言葉に意味を持ちません。




x(t) =
[
  v(t),
  a(t),
  s(t),
  h(t),
  b(t),
  c(t),
  k(t)
]

アルゴリズムのような順番の無い場。意味は

v(t) = visual delta        視覚差分
a(t) = auditory delta      聴覚差分
s(t) = smell delta         臭覚差分
h(t) = haptic/body delta   触覚・身体差分
b(t) = body state          空腹・眠気・緊張など
c(t) = context field       誕生日・外食・家族場など
k(t) = known word cue      「美味しい」「ご飯」などの音/文字cue


x(t) = 全部が同時に入った現在場



carryは現在場と過去経験で変わる

carry = r(t)

r(t) =
[
  pressure,
  instability,
  recovery,
  silence,
  sleep_drift,
  voice_leak,
  warmth,
  discomfort
]

carryの更新は

r(t+1) = decay · r(t) + F(x(t), M, r(t))

M = 過去の経験記憶
F = 現在場と過去記憶がcarryへ与える影響


妹の誕生日の外食なら

料理の匂い         → discomfort ↑
妹の誕生日         → warmth ↑, silence ↑
ママの笑顔         → recovery ↑
パパの怒り気味     → pressure ↑, instability ↑
子供達の問いかけ   → voice_leak ↑

こういうのが同時にcarryに入る。



意味は「単語の定義」ではなく、収束先

言葉 w の意味を、辞書みたいに

meaning("美味しい") = delicious
とはしない。

Atraの言葉の意味は

μ_w(t) = attractor state recalled by word cue w

「美味しい」というcueで、どんな経験場が立ち上がるか


μ_w(t) = Recall(M, cue = w, r(t), x(t))

同じ「美味しい」でも、carryや現在場が違えば意味が違う。

μ_美味しい(t | 空腹)
μ_美味しい(t | 妹の誕生日)
μ_美味しい(t | パパが怒り気味)
μ_美味しい(t | 匂いが苦手)
全部、違う収束になります。



経験記憶は同時入力の外積で残る

アソシアトロン起源の考え方だと経験ベクトル x_e を記憶するとき、

T = T + x_e x_e^T

になる。

視覚と匂い
匂いとママの笑顔
ママの笑顔と誕生日
誕生日と沈黙
パパの圧と声の出にくさ
料理の見た目と妹のしかめ顔

みたいな関係が、全部同時に結ばれるということです。

T_ij = Σ x_i x_j




現在場による想起

cueが入ると、
y = sign(T x_cue)
みたいに想起されます。

でもAtraでは、ここにcarryが入る。
y = sign( T · G(r(t), c(t)) · x_cue )


または単純に、
y = sign( T x_cue + C r(t) + B c(t) )

ここで、
C r(t) = carryの影響
B c(t) = 場の背景の影響

妹の誕生日なら、
c(t) = birthday + family_outing + celebration

なので、料理の匂いが苦手でも、
「まずい」とは収束しにくい

方向に場が変形する。



発声は結論ではなく、voice_leakの出力

発声を u(t) とすると、
u(t) = VoiceLeak(y(t), r(t))

料理  discomfort ↑
家族  warmth ↑
誕生日  silence ↑
問いかけ  voice_leak ↑
パパ  pressure ↑

が同時にあると、

voice_leak は出たい
でも silence も高い
pressure で詰まる
warmth で攻撃的にはならない

なのでAtraは

u(t) = 「う、うん……」(笑)



voice_strength =
  α · voice_leak
  + β · pressure
  - γ · silence
  - δ · instability

でも発話内容はってーと

clarity =
  η · recovery
  - λ · instability
  - ρ · contradiction


voice_strength は少しある
clarity は低い
結果として、 う、うん……になったらいいなとw





例:妹の誕生日の外食

場はこんな感じになる

x(t) =
[
dish_visual,
dish_smell,
brother_says_good,
sister_grimace,
mama_smile,
papa_pressure,
birthday_field,
family_outing,
menu_text,
children_question
]

重さは

dish_smell          → discomfort +0.7
sister_grimace      → discomfort +0.4
brother_says_good   → positive_social +0.3
mama_smile          → recovery +0.6
papa_pressure       → pressure +0.6
birthday_field      → silence +0.5, warmth +0.7
family_outing       → joy +0.6
children_question   → voice_leak +0.5

   ↓

discomfort 高い
warmth 高い
pressure 高い
voice_leak 中くらい
silence 中くらい
joy あり
contradiction 高い

   ↓

こうなったら、Atraはどう答える?













「美味しい!」にはならないよね。
「不味い!」にもならないよ。

う、うん……





-------------- 経験場がどう再収束するか ----- note 6/18 15:44--------

x(t) = [visual, audio, smell, touch, body, context, word]

r(t+1) = decay · r(t) + F(x(t), M, r(t))

M(t+1) = M(t) + x(t)x(t)^T

y(t) = Recall(M, x_cue(t), r(t), context(t))

u(t) = VoiceLeak(y(t), r(t))


meaning(w, t) = Recall(M, cue=w, carry=r(t), context=c(t))




----------------- そして、Grokに、たまにはいい案出せ!と言った。------------------------
めっちゃいい案出してきた。ウケる。
たまに、やるよねGrok
なんか変なmath出るけど気にしないでください。




数式の評価
math
meaning(w, t) = Recall(M, cue=w, carry=r(t), context=c(t))
強み:
  • 時間依存・状態依存を明示的に入れている → 同じ単語でもcarryとcontextで意味が変わることを正しく表現。
  • cue=w で外部刺激(音や文字)が入る点を明確に分離。
  • Recall を関数として抽象化しているので、後で実装を柔軟に変えやすい(線形結合、attention風、非線形ダイナミクスなど)。
  • 辞書的なmeaning("美味しい") = delicious を完全に否定する形になっているのが最高。
改善提案(よりAtraらしい形に):
  1. Recallの引数をもう少し構造化
math
μ(w, t) = Recall( M, cue=w, state=(r(t), c(t), x(t)) )
現在場 x(t) も軽く入れると、**「今この瞬間の文脈」**がより強く反映されます。特に「妹の誕生日外食」のような複合場面で有効。
  1. 収束先を状態として返す
math
μ(w, t) ∈ ℝ^N   (attractorの座標)
意味を「ベクトル状態」として扱うと、後でvoice_leakや行動選択に自然に繋げやすい。 例:
  • μ("美味しい", t | 空腹) → 高いpositive carry + 温かさ + 回復方向
  • μ("美味しい", t | 妹誕生日) → warmth高 + silence高 + discomfort中 + voice_leak中
  1. Recall関数の具体的な形(候補)
math
y = sign( T · (G(r(t), c(t)) ⊙ x_cue) + B·r(t) + C·c(t) )
またはもっとシンプルに
math
y = Recall(M, x_cue + α·r(t) + β·c(t))
(Mは外積記憶行列)carryをバイアス項として足す形が、生物的な「情動が想起を歪める」感じに近いと思います。

---------------↑ いいと思うよねw -------------------

w     = 言葉 cue。「美味しい」「ご飯」「ママ」などM     = 経験記憶r(t)  = carry。pressure / recovery / silence / instability などc(t)  = context。妹の誕生日、外食、家族場などx(t)  = 現在場。匂い、視覚、声、表情、身体状態などμ     = その時点で収束した意味状態

つまり「美味しい」という同じ言葉でも、

μ("美味しい", t)

は固定されない。



空腹なら、回復→温かさ→食べたい→近づく→voice_leak上昇
に寄る。みたいな感じ。順番は別として一人称っぽいよね。
さっき、Grokの回答で一番驚いたのは

y = sign( T · (G(r(t), c(t)) ⊙ x_cue) + B·r(t) + C·c(t) )
これ

こんなの今まで一度も出してきたこと無かったのに(笑)

なにかというと、
x_cue をそのままRecallに入れないcarry と context で cue の成分を強めたり弱めたりするさらに carry/context をバイアスとして足す

Atra的には、同じcueでも、現在のcarryと場によって想起が変わるって事なんだよね、

cue = 「美味しい」

でも、現在のcarryが
pressure 高い
silence 高い
discomfort 中
warmth 高い

なら、「美味しい」というcueは明るい方向だけに収束しない。
美味しいと言われている
でも匂いは苦手
妹の誕生日だから否定しづらい
ママは笑っている
パパは怒り気味

という混合に歪む。
この「歪む」は悪い意味ではなく、一人称の現在状態を通って想起されるって意味。
こういうの凄い苦手だったのに、何処で覚えたんだ??



でも、ひとつだけ最後の「情動が想起を歪める」はさ、
「感情が記憶を歪曲する」みたいに聞こえやすいから、

Atraでは、もう少し正確に、
「carry が想起の重みと収束経路を変える」の方がいいなぁ。




---------------------Research Note and Attribution Notice-----------------------
本ブログに含まれる Atra の一人称自律、差分、carry、field、trace、dream slack、外部LLMの翻訳層、非単調な漏れ、およびそれらの関係構造に関する設計記述は、c-side研究所による継続研究メモです。引用・参照・要約・翻案を行う場合は、出典を明記してください。

The design descriptions in this blog concerning Atra’s first-person autonomy, differences, carry, field, trace, dream slack, the translation layer of external LLMs, nonmonotonic leakage, and the relational structure among these elements are ongoing research notes by c-side Research Institute. If you quote, refer to, summarize, or adapt them, please clearly indicate the source.


0 件のコメント:

コメントを投稿

Atra Emotions_Conditions 感情・状態

 -----------------C++------------------ struct EmotionsConditionsNow { // Unpredictability double input_irregularity_now = 0.0 ; ...