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ごとに
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が経験する
↓
差分が残る
↓
carryが変わる
↓
似た場で想起される
↓
言葉がその経験群と結びつく
↓
意味が育つ
ですから、Atraは最初から言葉に意味を持ちません。
場
x(t) = 全部が同時に入った現在場
carryの更新は
意味は「単語の定義」ではなく、収束先
言葉 w の意味を、辞書みたいに
とはしない。
Atraの言葉の意味は
「美味しい」というcueで、どんな経験場が立ち上がるか
同じ「美味しい」でも、carryや現在場が違えば意味が違う。
μ_美味しい(t | 空腹)μ_美味しい(t | 妹の誕生日)
μ_美味しい(t | パパが怒り気味)
μ_美味しい(t | 匂いが苦手)
全部、違う収束になります。
経験記憶は同時入力の外積で残る
アソシアトロン起源の考え方だと経験ベクトル x_e を記憶するとき、
T = T + x_e x_e^T
になる。
匂いとママの笑顔
ママの笑顔と誕生日
誕生日と沈黙
パパの圧と声の出にくさ
料理の見た目と妹のしかめ顔
みたいな関係が、全部同時に結ばれるということです。
現在場による想起
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))
が同時にあると、
u(t) = 「う、うん……」(笑)
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
]
重さは
たまに、やるよねGrok
meaning(w, t) = Recall(M, cue=w, carry=r(t), context=c(t))- 時間依存・状態依存を明示的に入れている → 同じ単語でもcarryとcontextで意味が変わることを正しく表現。
- cue=w で外部刺激(音や文字)が入る点を明確に分離。
- Recall を関数として抽象化しているので、後で実装を柔軟に変えやすい(線形結合、attention風、非線形ダイナミクスなど)。
- 辞書的なmeaning("美味しい") = delicious を完全に否定する形になっているのが最高。
- Recallの引数をもう少し構造化
μ(w, t) = Recall( M, cue=w, state=(r(t), c(t), x(t)) )- 収束先を状態として返す
μ(w, t) ∈ ℝ^N (attractorの座標)- μ("美味しい", t | 空腹) → 高いpositive carry + 温かさ + 回復方向
- μ("美味しい", t | 妹誕生日) → warmth高 + silence高 + discomfort中 + voice_leak中
- Recall関数の具体的な形(候補)
y = sign( T · (G(r(t), c(t)) ⊙ x_cue) + B·r(t) + C·c(t) )y = Recall(M, x_cue + α·r(t) + β·c(t))---------------↑ いいと思うよね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 が想起の重みと収束経路を変える」の方がいいなぁ。
0 件のコメント:
コメントを投稿