以前、おもちゃで使われている音通信をスペクトログラムを用いて調べて見たことがあります。
https://smartsoundlab.com/2018/09/000037.html
濃淡で示された音を解析すれば通信が可能、という話だったわけですが、音の濃い部分のデータを人力で1/0を解読するのは容易ではありません。
人が読むなら、もっと直感的な方法があります。直接音で文字を表現してしまう方法です。今回、それを試してみました。
スペクトログラム上に音で絵を描くというアイディアは昔から知られている様で、スペクトログラムアートと呼ばれています。このキーワードで検索すると様々な絵を見ることができます。
https://www.google.com/search?q=spectrogram+art&tbm=isch
また、文字を出力し隠れたメッセージにする、というアイディアも既知の様で、下記様な記事をみる事ができます。
https://www.instructables.com/id/Ultrasonic-Geocache-UltraCache/
今回私が作ってみたのは、文字をリアルタイムで逐次音(スペクトログラム)にして出力するpythonスクリプトです。
例えば、100x100のビットマップで文字を表現したいのであれば、100種の周波数の正弦波を100種のタイムスロットの中で出力すれば、スペクトログラム化した際に音の存在する周波数・時間領域の色が明るくなり、結果として人が文字として認識する事ができます。
音を作る際の注意点としては、位相をランダムにしておくことがあります。例えば100種類の正弦波の位相が完全に一致した状態で始まってしまうと、全て加算され、振幅が100倍になってしまいます。スピーカー等、ハードウェアには制限があり、最大振幅が限られるため、結果として相対的に出力できる音が小さくなります。ハードウェア的に最大1.0の振幅しか許されないとすると、この例では各chの振幅を0.01にまで小さくしなければならなくなることを意味します。位相をランダムにすると、互いに少しづつずれることで最大ピークが低く抑えられます。結果、大きな音を出力する事が可能になります。ちなみに位相を完全なランダムにする必要は必ずしもなく、例えば0°と180°といった2値程度でも比較的良い結果が得られることが知られています。
波形ピークと実効値の比は波高率(クレストファクタ)として知られており、通信の世界では様々な工夫がされています。無線の世界ではPAPR(peak to average power ratio)という名前で知られており、特にOFDMの様に多くの周波数を同時に使用するシステムで、いかにその値を下げるかが大きな課題となっています。
なお、正弦波を出力する際、音の開始時と終了時にプツッといった雑音が聞こえる場合があります。この雑音が連続的に発生する場合はザザザッといった不快な可聴音として聞こえてしまうかもしれません。これを避けるには波形振幅にウィンドウをかけ、意図しない周波数成分が発生しないようにします。通信に使用する周波数以外の不要輻射を、いかに低下させるかという事は、音通信や5Gなど無線通信における大きな課題です。
さて、実際のスクリプトを作るにあたり、先の記事の様に、ビットマップの文字をあらかじめ用意しても良いのですが、日本語の場合26文字に収まらず、作るのが大変なので、今回は毎回文字をビットマップ化して出力する事にしました。文字や画像をビットマップにするには、opencvやpillowといったライブラリが使用可能です。
具体的には予め指定のサイズのエリア(キャンバス)を準備しておき、そのキャンバスに文字や画像を描画することでビットマップデータとして取り出すことができます。グレースケールか白黒化してデータ出力すれば、それが各点の輝度(音量)情報になるというわけです。
音の出力にはpython-sounddevice等が使用可能です。pythonを使用するとこの様に色々なライブラリが利用可能のため、非常に便利です。
最後に試作品のスペクトログラムをご覧ください。私が試した範囲では、普通のPC同士で5m程度離れた人と違和感なく音チャットする事ができました。人の耳に聞こえにくい周波数を使えば、音を使いながら他人に気づかれずに連絡しあうことも可能です。信号処理の良い練習にもなりますので、ぜひ独自のチャットアプリを作ってみて下さい。
お決まりのHello worldです。
日本語も表示できます。
画像出力も試しました。弊社ロゴがくっきりと確認できます。
試作品のうちのひとつ「Hello World」については音声ファイルもDL可能にしてみました。
iOS用アプリ「SpectrumView」をダウンロードし、設定を添付のようにしていただいた上で音声を聴かせると、「Hello World」の表示を実際に見ていただけるはずです。
iOS用アプリ「SpectrumView」をダウンロード≫