
スタックチャンに簡易的なText-To-Speech機能を実装して喋ってもらう
はじめに 概要 今回は簡易的なText-To-Speech機能(フォルマント音声合成)を実装してスタックチャンに喋ってもらおうと思います。 音声合成のライブラリは性能が高いものがいろいろあるとは思うのですが、 勉強も兼ねてシンプルな音声合成機能を実装してみます(実装の大枠はGeminiにお願いします)。 過去の記事 M5Stack製のスタックチャンをmicro-ROSとArduinoで動かす方法を記事にまとめました。 スタックチャンをmicro-ROSで動かす - Arduino編 移動ロボットとスタックチャンの連携もやってみました。 スタックチャンをラズパイマウスに搭載してカメラを使った顔の検出と追従 Geminiに音声合成機能を実装してもらった 「勉強も兼ねて実装する」と言いつつ、音声合成機能のプログラムはGeminiに書いてもらいました。 この記事ではGeminiに実装してもらったプログラムを読み解いていこうと思います。 Geminiに実装してもらったプログラムは下記リンクで公開しています。 GitHub - stack-chan_micro-ros_arduino/speech.ino ちなみにプログラム全体の流れとしては下記の通りです。 トピックで文字列を受け取る 文字列を音声に変換する スピーカーで音声を出力する この記事では基本的なArduinoのお作法やmicro-ROSの処理の説明は省いて、 音声合成機能部分を読み解いていきます。 プログラムを読み解く 注意: 音声合成について素人なので説明が間違っていたらすみません。 フォルマント このプログラムではフォルマント音声合成でテキストを音声に変換して、 人工的に人間の声を模倣しています。 フォルマントについてはWikipediaを参照します。 Wikipedia - フォルマント フォルマントは人間の音声内で周囲よりも強度が高い周波数帯域のことです。 フォルマントは音声内に複数存在することもあり、周波数の低いほうから「第一フォルマント(F1)」、「第二フォルマント(F2)」、…と続いていきます。 私の理解だとフォルマントがその音声の特徴になるかと思います。 つまり逆に考えると、フォルマントを人工的に再現できるとその音声が生み出せるということになります。 ちなみに人間の音声におけるフォルマントは、主に口腔や鼻腔等での共鳴によって発生するようです。 特に、第一フォルマントは口の開きの大きさ、第二フォルマントは舌の前後の位置に影響されるとのことです。 そして今回のプログラムでは、この第一フォルマントと第二フォルマントの周波数を再現することで母音(a,i,u,e,o)の音を模倣しています。 周波数は下記のように設定されています。 1列目が第一フォルマント、2列目が第二フォルマントです。 母音のa,i,u,e,oの5つそれぞれに値を設定します。 const float VOWEL_FREQ[5][2] = { {800.0, 1200.0}, // a {300.0, 2300.0}, // i {300.0, 1200.0}, // u {500.0, 1900.0}, // e {500.0, 800.0} // o }; これらの周波数は下記リンクの研究で計測されています。 日本語母音のフォルマント周波数の年齢による変化 Biquad Filter このプログラムでは、Biquad Filterというフィルタを使って、 音のベースとなる非対称の矩形波を入力し、指定した周波数(第一フォルマント、第二フォルマント)部分を抜き出した滑らかな波を出力します。 そして第一フォルマントと第二フォルマントのそれぞれの波を足し合わせて母音(a,i,u,e,o)の音声を作成します。 ...







