N.Yamazaki's blog

主に音声合成について思ったことを書いてみようと思います。
<< M5Stackの音量を抵抗1つで調節する | main | 「AquesTalk-ESP32 Ver.2.0」を使う >>
省RAM版の言語処理エンジンのプロトタイプ開発

- M5Stackで漢字テキストからの音声合成 -

 

Keywords: AqKanji2Koe, AquesTalk, 言語処理, M5Stack, ESP32, 組み込みシステム

 

■漢字の読み上げ



日本語テキストから音声合成をするには、言語処理エンジンが必要です。
言語処理エンジンAqKanji2Koeは、漢字仮名混じりの文字列を、AquesTalk用の音声記号列に変換するライブラリです。

この言語処理には5MB〜12MBの辞書データが必要で、これがネックになってハードウェア規模を小さくできませんでした。そのため、現在の最小動作環境は、Raspberry Pi程度となっています。
*「AquesTalk Pi」はRAM256MB〜のRaspberry Pi上で動作

 

現在、この言語処理エンジンを、1ランク小さい規模のハードウェアで動作をすることを目指して開発を進めています。具体的には、RAMは256KB以下、CPUはCortex-Mをターゲットにしています。

辞書データは削減できないので、現状、ワンチップマイコンの中に入れることはできません。
そこで、これはSDメモリカードやSPIフラッシュメモリなどの、外部メモリに配置して使うことを考えています。

 

target

 


■プロトタイピング



今回、M5Stackを使ってプロトタイプを作成しました。
M5Stackは、ハードウェア規模がターゲットに近く、SDスロットやオーディオ出力が付いているので今回のプロトタイピングにはぴったりです。

 

M5Stack
SoC ESP32 
CPU Xtensa LX6(Tensilica製),CLK:240MHz
RAM 520KiB
ROM 4MB(flash)
その他

320 x 240 TFTカラーディスプレイ、

microSDカードスロット、スピーカー

 

このプロトタイプでは、シリアルで漢字を含むテキスト(UTF8)を受信し、今回開発中の言語処理エンジンで音声記号列に変換して、それをAquesTalk pico for ESP32で音声データを生成して出力しています。
顔表示(+リップシンク)の部分は、「M5Stack-Avatar」を使わせていただきました。

 

<プロトタイプのデモ動画>

 


■アルゴリズムとデータ構造の全見直し



言語処理では、辞書データへの大量のアクセスが必要です。
一方で、SDメモリカードからのデータの読み出しは、メモリからのアクセスとは比較できないほど遅くなります。この点が大きな開発課題となります。
最初のプロトタイプは、1文を処理するのに1分ほどかかってしまい、とても実用になりませんでした。

 

辞書データには、LOUDSなどの簡潔データ構造が使われます。
これはデータサイズが小さく、高速な辞書引きができるメリットがありますが、データが分散しているという特徴があります。
RAM上に辞書データが展開されている場合は何の問題もないのですが、転送速度が遅く、ランダムアクセスが不得意なSDメモリカードに配置されている場合は、大きな問題となります。

 

今回、データ構造やアルゴリズムを全面的に見直すことにし、読み込み回数の削減や、なるべく連続的なアドレスでアクセスするようにして、なんとか実用的なレベルまでたどり着きました。

現プロトタイプでのコードサイズは100KB以下(ただし、C++の標準ライブラリは含まず)です。
RAMサイズは未だ調べていませんが、あれこれ含めて520KiBで動いている事実から目標に近くなっていると思っています。


今後はライブラリ製品としての開発フェーズに入ります。

 

■Link


 

次記事 「AquesTalk-ESP32 Ver.2.0」を使う

| AquesTalk | 12:08 | - | - |
PROFILE
Follow
CATEGORIES
LATEST ENTRIES
SEARCH THIS SITE
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
SONY MDR-CD900ST
SONY MDR-CD900ST (JUGEMレビュー »)

普段これで開発しています。
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND