前回、100円ショップのスピーカの方式を学び、今回はそれをお子様に大人気のBBC micro:bitに取り付けて鳴らしてみました。スピーカを鳴らしているのはmicro:bitにインストールされたMicroPython。2つ異なるモジュールがあります。ぶっちゃけmusicモジュールの鳴らし方は私にも分かるけれど、speechモジュールは難解。
※「お手軽ツールで今更学ぶアナログ」投稿順 indexはこちら
BBC micro:bitは、英国を先頭に世界中の方々の御活動でお子様に大人気、教育用マイコンの一番手らしいです。搭載しているのは無線(BLE)デバイスの定番中の定番、北欧ノルディック社の nRF51822 BLEチップです。Arm Cortex-M0搭載のSoC、というか「無線マイコン」。小さいチップですが実にいろいろできます。当方では別シリーズでMicroPythonを搭載。最近ではIoTデバイスとしても運用中であります。これに100円ショップのスピーカを取り付けました。
現在はお値段据え置きで「スピーカまで内蔵の」micro:bit V2が出ているらしいですが、手元にあるのは古い版です。スピーカは自分で取り付けないとなりません。実験用に取り付けたところがこちら。
さて、micro:bitのMicroPythonからスピーカを鳴らすには2つの方法があります。
- musicモジュール
- speechモジュール
musicモジュールの方は、単音でメロディを鳴らすモジュールです。音符に相当する文字列をPythonのリスト型式で与えるとメロディを奏でます。また、かなりな数の「楽譜」が組み込まれているので曲名で呼び出すだけで、御馴染みのメロディを鳴らすこともできます。ぶっちゃけ、どのマイコンでも比較的簡単に出来るであろう機能。
これに対してspeechモジュールの方は、「言葉を喋らせる」ためのモジュールです。分野的に言えば
Text to Speech(TTS)
極めてメモリの限られたnRF51822に組み込まれているのでちょっとビックリ。まあ、英語?前提で、現在の洗練された音声合成技術とは比べようもないのですが、ひと昔、ふた昔前にはコンピュータってこんな声で「喋った」よな、という感じのもの。
これらのSpeaker駆動波形が気になったのでちょっと見てみました。まずは「分かり易い」musicモジュールから。
musicモジュールの作り出す波形
micro:bitは、お子様用にいろいろ工夫があり、カードエッジにある5つの端子(0番、1番、2番と電源、グランド)については、ワニ口クリップで簡単に接続できるようになっています。「マイコン」的なIO端子の駆動能力に若干の不安のある nRF51822 をうまく使っている工夫にも見えます。musicモジュールの場合、スピーカを0番端子とGND端子の間に接続せよ、とあります。スピーカ接続すると「大電流(他との比較で)」流れて、元の駆動波形が見づらくなるのでスピーカを外して解放状態で0番端子に現れる波形を観察してみます。その前に「音楽力の泉」様のページから1箇所引用させていただきます。
海外メーカーでは、「A4」が440hzにされている場合もありますが、
はい、micro:bitのMicroPythonはまさに「海外」だったです。A4=440Hz。こんな感じ。
何の変哲もないといったら悪いですが、PWM波形ですね。周波数はほぼ440Hz、デューティ12.675%。次は1オクターブ上、A5(海外式)であります。
倍の880Hzになりました。デューティも12.672%とほぼ同じ。デューティ維持して周波数だけを変更しているようです。もう一オクターブあげてみました。A6。
A6までくると、周波数、デューティともに若干誤差が大きい感じがします。当然タイマ制御だと思うので上限、下限ともにどの辺にあるのだろ?でもま、musicモジュールの波形には不審なところはありませぬ。
speechモジュールの作り出す波形
これに対してspeechモジュールの波形は良く分かりませぬ。musicモジュールとは異なり、スピーカを0番と1番の間につなげとあります。スピーカをつないで “Hello world”など喋れというと、それなりに喋ります。ソフトウエア的には、
- 文字列(多分英語前提)を解析
- 音素の列に変換
- 音素の列を発音
というプロセスを経ているようです。またスピーカを外し、解放状態で波形を見てみます。
黄色い方が0番、青が1番、ともにGND基準で波形をみてます。1番の方は動いている形跡無いです。どうしたんだろ。また、ぱっと見、0番はmusic同様のPWM波形にも見えますが周波数が決定的に違います
31.25kHz
超音波領域の高い周波数。しかし耳に聞こえる音声はせいぜい数百Hz程度のふつうの「声」です。観察していると、基本の周波数は変わらないけれどもデューティサイクルの方が声に応じて激しく変動していることに気付きました。短い時間で波形を拡大するのではなく、長い時間で遠くから波形を見た方が分かり易そうです。そしてスピーカも接続した状態。こんな感じ。
高い32kHz付近の周波数は搬送波的なもので、PWM波形のデューティが伸び縮みすることで「うなり」のような現象を起こして低い音声周波数を作りだしているように思われました。それも単純な波形ではない。
今回使用しているお手軽ツールは、Digilent社Analog Discovery 2でありますが、こいつにはこれに使えそうなお道具がいくつか備わっています。どんな文字列でも音素列に変換しようとするので、とりあえず以下の列を発音させて観察しました。
‘eeeeeeeeeeeeeeeeeeeee’
まずはSpectrogram解析。横に3本の赤い線が見えます。一番下が耳に聞こえている音声の部分。一番上の32kHz付近が「搬送波」でしょうか。その半分の真ん中の部分は、PWM波形からくるものに想像されます。発音させる音素を変化させるとここのパターンが変わってきます。
Spectrogramでは肝心の音声部分を拡大してみれなかったので、普通にFFTかけてみます。これが ‘e’ の発音の1kHzまでの結果。ただ、本当に「良いところ」にFFTかけられているのか疑問あり。
‘aaaaaaaaaaaaaaaaaaa’
Spectrogramにせよ、FFTにせよ、’e’じゃなくても’a’、の結果は違っていることだけは分かります。しかし、どういう理論、方法なのか?
よく読めば、ちゃんとMicroPythonのページに参照先が書いてあったのでした。micro:bitのmicropythonの「音声」のページから1箇所引用させていただきます。
この作業は、コモドール64のために1982年に最初にリリースされた SAM (Software Automated Mouth)と呼ばれる古い TTS (text-to-speech)プログラムに対して Sebastian Macke が行った驚くべきリバースエンジニアリングの努力に基づいています。
Sebastian Macke氏によるSoftware Automatic Mouthのページはこちら。
まだ上記のページを読みこんだわけでないのですが、各音素は2周波数のサイン波と1つの方形波を重ねたものとして表現されるみたい。そういえば昔「音声ホルマント周波数」とかちょっとかじった気がする。またそのうち、だな。。。
(単なる年寄りの回顧)コモドール64か。私は買えなかったですが、印象深い機種です。パソコン(当時はマイコンといっていたかも知れない)買おうと思って、初めて買ったアスキー出版の月刊アスキー、確か1980年の秋くらいの号でした。読んだけれど使われている言葉がまったく理解不能でした。その号の特集がコモドール64でした。カッコよかった印象が今でもあります。欲しかったけれどとても買えず、翌年NECのPC-8001を買い「80系」を学びました。あれよあれよという間に「CPU作る側」に立ってましたが、最初がコモドール64だったら80系には行かなかった、多分。そのコモドール64用の技術がmicro:bitに搭載されていたとは!