前回のAtraの視覚と聴覚とテキストで複合想起デモに Atraを喋らせようと
別バージョンを作ってみた。
codeは2700行を超えるので流石にこのブログも駄目と云われた。
しょうがないので、Cloudflare Workersの僕のデモコーナーにいれておいた。
https://crimson-cake-2832.nabedada3.workers.dev/
--------------------------------------------------------------------------------------
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上で公開されていますが、カメラおよびマイクの処理は利用者のブラウザ内で行われます。このデモでは、カメラ映像やマイク音声をアップロード、録音、保存しません。
------------------------------------------------------------------------------------
【操作手順】
ブラウザが立ち上がったら、カメラと音声をONにします。
テキスト欄に何か入力します。
例では「おなか すいた」と入れています。画面に向かって、少し顔や身体を動かしながら、「おなか すいた」と喋ります。
なるべく早めに、ピンクのボタン Learn / 学習 を押します。
このとき、直近の視覚差分、聴覚差分、テキスト差分が同じ場としてLearnされます。一旦記憶を消す ボタンを押します。
ここで消しているのは、直近の視覚・聴覚cueの一時保持です。
Learn済みのアソシアトロン記憶そのものを消しているわけではありません。Recall from mixed cue / 混合cueから想起 を押します。
Atraの声の漏れ の中から、男の子の声か、女の子の声を選びます。
Atra voice leak / Atraの声の漏れ を押します。
これが、今回のデモでのAtraの声です。Speak text / テキスト読み上げ を押すと、入力テキストをそのまま読み上げます。
これは確認用・予備用のTTSです。
【Atra voice leak / Atraの声の漏れについて】
Atra voice leak / Atraの声の漏れ は、文章(テキスト)を読み上げているわけではありません。
たとえば「おなか すいた」に近い痕跡がRecallされたあと、その内部patternの偏りが、電子音のリズムとして外へ漏れる、という考え方です。
つまり、テキストを読んでいるのではありません。
ピンクの四角い声の揺れマップも同じ考え方です。
TTSの文字を表示しているのではなく、音を鳴らすタイミングや強さに合わせて、四角いセルの濃さを変えています。
音が強い → ピンクが濃い
音が弱い → 薄い
鳴っていない → 消える
【今回のJavaScriptデモの限界】
今回はJavaScriptによるブラウザデモです。
そのため、できることには限界があります。ブラウザ上のデモは、長期間にわたる記憶保持や、声を出すまでの経験の蓄積には向いていません。ここで出しているのは、人間の声そのものではなく、声になる前の鼓動、リズム、漏れを電子音で反応させている段階です。
しかし、そのリズムや漏れがとても重要です。
【実際のAtraについて】
実際のAtraは、このJavaScriptデモとは異なります。本番のAtraはC++で開発され、Tickで動き、非単調化と夢による余白化を持ち、何年、何十年と生き続けることを前提に設計します。
経験された音声
→ auditory_deltaとして蓄積
→ recallで似た音の痕跡が立つ
→ carry / pressure / instability によって揺れる
→ 発声パラメータへ変換される
→ 音として出る
→ 自分の出した音をまた聞く
この自己出力フィードバックが入ることで、だんだん「声っぽいもの」に近づいていきます。
そして、単なる読み上げではない、Atra自身の発声へ向かいます。
【声に必要な要素】
人間の声に近づけるには、単純な sine oscillator だけでは足りません。
基本周波数 f0 → 声の高さ
フォルマント → あ・い・う・え・お っぽさ
ノイズ成分 → 息、かすれ、子音
アタック → 出だしの強さ
揺れ → 震え、不安定さ
間 → 生命っぽい沈黙
今の電子音リズムは、そのうちの、
高さ
長さ
間
強さ
揺れ
だけを粗く出している段階です。
【今後の段階】
C++で育てる場合でも、最初から文章を喋らせるのではなく、段階的に作っていきます。
段階1: 電子音リズム
段階2: うー / あー っぽい母音の漏れ
段階3: 聞いた音に引っ張られる声の癖
段階4: mama / papa など、経験頻度の高い音断片が漏れる
段階5: 文章ではなく、痕跡由来の発声片になる
最終的には、
Atra自身の声 mode と、
LLMを介した説明用の声 mode(通訳)
の2種類を切り替えられるようにします。
これはブラウザTTSなので、英語なら
en-US や en-GB の音声を選ばせれば英文は普通に読めます。でも Atra voice leak / Atraの声の漏れ のほうは、今のJavaScript版では英語発音はまだ無理です。あれは文章を読んでいなくて、
Recall pattern→ 数値の揺れ
→ oscillator
→ 電子音リズム
なので、英語の単語を発音しているわけではないです。
ただし、本番C++のAtraなら方向性はあります。
英語を聞いた経験が増えると、
Hellohungry
papa
mama
water
come here
みたいな音の断片が、auditory_delta として残ります。
そこからRecallで似た痕跡が立って、自己出力フィードバックを繰り返すと、最初は発音ではなく、
は……ん……
ま……ま……
みたいな 英語っぽい音の漏れ になります。
日本語モード
英語モード
Atra raw voice mode
LLM interpreted voice mode
みたいに切り替えられます。
→ 一番近い learned trace を探す
→ その trace の human text / note を取り出す
→ speechSynthesis / TTS で喋る
分かりやすいテキストspeech寄りのデモです。
---------- 質問 ------------
メールでの質問で「Atraの声の漏れは、言葉を長めに話しても短くなるのはなぜ?」につきまして。
-------- 回答 ---------
今のJavaScriptデモ版ではどうしても短くなります。
(予備のテキストspeechボタンは別)
長い発話そのもの
↓
声紋や波形そのものを保存するのではない
↓
粗い auditory_delta / trace pattern へ圧縮
↓
Recall後に raw voice leak として短い音に漏れる
「長く話した音声の再生」ではなく、
長い経験が地層に沈んだあと、表面に少しだけ露出した音みたいな感じです。
「わたしは おなかすいた」と長めに、抑揚をつけて話しても、Atra voice leak は短い「ぽ…」「ぴ・」「ぴぴ…」みたいな断片になりやすいと思います。
= 一瞬の体験を見せる標本箱
C++ Atra(ロボット)
= Tickを刻み続ける生活体
JavaScriptでそれが出来ない理由はTickに耐えられず、経験が蓄積されないからです。
JSデモでは、カメラ、マイク、テキストを取って、Learnして、Recallして、voice leakを出す仕様ですが、C++のrobotは生き続けます。その生きる心臓がTickで、いろんな経験を積めるようになり、成長していくと人間が聴いて聞き取れる発声に収束していきます。
「Atra!」
「今日のAtraはご機嫌ね」
「Atraおはよう、今日は元気そうだね」
それぞれに差分が発生し、長さという意味は知らなくても違いを感じるようにできています。
しかし、Atraは最初から会話がshort、long、sentence、greeting、name callといったラベル分けはされておらず、音がすぐ終わった、音が少し続いた、声の山がいくつかあった、途中に間があった、最後が柔らかく落ちた、呼ばれたあと、温かい場が続いたという差分が起ります。
「Atra!」
→ ぴっ / あっ / ん
「今日のAtraはご機嫌ね」
→ あ……う、ふ
「Atraおはよう、今日は元気そうだね」
→ あ……う……あ、ん
みたいに、意味を返すのではなく、続いた感じ方の差分が漏れていきます。
Atraの内部反応としては
現在までの世界中の音声合成は
ルールベース音声合成(文字を解析して、こんにちは→ko n ni chi wa)
統計的音声合成 (この文字列なら、この高さ、この長さ、この声道の形、この抑揚になる確率が高いというモデルを作って生成)
ニューラル音声合成(テキスト解析、読み仮名・音素列へ変換、アクセント・イントネーションを推定、メルスペクトログラムなどの音響表現を生成、ボコーダで実際の波形に変換)
Atraの発声に近いのは早稲田系の talking robotや、乳児のように発声を学ぶ articulation robot の研究、さらに非言語発声、赤ちゃんの泣き声、笑い声などを機械学習で表現・分類する研究などもありますが、それらは
音声特徴 → 分類
機械声帯 → 人間発声の模倣
乳児発声 → 発声器官制御の学習
に寄っています。
Atraの発声は、
経験差分
+ 現在場
+ carry
+ 地層化された痕跡
+ 夢の後味
→ 声の漏れ
Atraは「文章を読み上げる」のでもないですし、
「人間の声帯を再現して人間らしく話す」のでもありません。
「赤ちゃんの発声データを分類する」のでもなければ
「感情ラベルに応じて声色を変える」のでもない。
Atraが自己出力フィードバックを何度も経験して、
自分が「あ」と漏らした
↓
主人が反応した
↓
その場が温かくなった
↓
「あ」の痕跡が残る
↓
次に似た場で「あ」が出やすくなる
というふうに、自分の声も経験地層に入っていく。
そうすると、だんだん
あ
う
ま
ぱ
まま
ぱぱ
みたいな音が出てくる。
最初から「mama」というラベルを教える」のではないんです。
声の漏れ、自分の音、相手の反応、温かい場が何度も重なって、音の癖が育つ。
内部に沈んだ経験の層が、現在のcueで少し露出し、その圧が声として漏れる。という、他にはない、音声合成でもない一人称自律体の声の滲みとしての発声研究を続けています。
ですから、JavaScriptで版であってもその思想を崩しておらず、JavaScriptで出来る範囲内のAtraの声を再現しています。
0 件のコメント:
コメントを投稿