テキスト読み上げ AquesTalk pico LSI
2020.05.19
YouTubeでポイントを説明しています。画像をクリックすると再生できます。
テキストの音声読上げの第2弾です。
前回は、MITライセンスの gTTS (Google Text to Speech)を利用して、ソフトウェアにより音声合成を行い、テキストを読み上げました。
今回はAquesTalk音声合成LSIを用いて、日本語テキストを読み上げてみたいと思います。

音声合成エンジンAquesTalkは、組み込み用に開発された小型軽量のエンジンで、テキスト情報をリアルタイムに音声に変換して出力します。
AquesTalkには4種類ののエンジンがあります。
→規則音声合成エンジン AquesTalkシリーズ
■AquesTalkシリーズ
AquesTalk1 (旧AquesTalk)
声の種類は1つに固定されていて基本は女声ですが、別途8種類の中から選択もできます。16bit CPUから動作します。
AquesTalk2
声の種類を規定する16KB程度のデータを差し換えることで、動的に14種の中から声種を切り替えられる特長を持っています。
AquesTalk10
32bitシステムへの組み込みに最適な最新の音声合成エンジンです。
AquesTalk,AquesTalk2の後継として、両エンジンの特徴を維持したまま、クリアな声質、高い明瞭性、パラメータで声質を調整可能などの特徴を持っています。
AquesTalk pico
シリーズ中、最小サイズのエンジンです。RAM500byte、ROM30Kbyte、8bit CPUという比類ない極小リソースでリアルタイムの音声合成ができます。リソース制約の厳しい小型の組み込み機器に適しています。 このエンジンを1チップマイコンに組み込んだ音声合成LSI AquesTalk pico LSI も販売しています。
■製品
AquesTalk Pico LSI
AquesTalk picoエンジンを組み込んだ1チップの音声合成LSIです。
AquesTalk ESP32
Espressif Systems製のマイクロコントローラ ESP32用の音声合成ライブラリです。
AqKanji2Koe-MとAquesTalk picoエンジンが移植されており、漢字を含むテキストからの音声合成ができます。
AquesTalk Pi
Raspberry Pi 上で音声合成を可能にするアプリケーションプログラムです。
AqKanji2Koe-AとAquesTalk(1)エンジンが使われており、少ない処理量で高速に音声合成できます。
AquesTalk TTS
Android TTS API準拠のテキスト音声合成エンジン アプリです(ライブラリではありません)。
AqKanji2Koe-AとAquesTalk(1)エンジンが使用されています。
AquesTalk10エンジンを採用し、機能も拡張した 「AquesTalk TTS Pro」もあります。
今回使用したのは、AquesTalk Pico LSI で、かな表記の音声記号列を音声に変換する音声合成LSIです。
この音声記号列は、簡単にいうと、ローマ字表記のASCIIテキストを、アクセント記号、句切記号、タグ記号で装飾したものです。
Atmel社(Microchip社)の8bitマイクロコントローラ ATmega328Pに、音声合成ミドルウェアAquesTalk pio をファームウェアとして搭載した製品です。
・ATP3011F1-PU:ゆっくりな女性の音声
・ATP3012R5-PU:小型ロボットの音声
の2つを秋月電子通商さんで購入しました。
■配線
ベースがATMega328 なので、Arduino uno の使用方法と違いはなく、必要なピンのみを引き出します。
・1番のリセットピンはLOWでリセットが掛かるので、3.3Vに繋いでHIGHにします。
・2,3番ピンはUART通信用です。ラズパイの8,10番ピンと接続します。
・7番ピンは電源へ、8番ピンはGNDに接続します。
・9,10番ピンは、16MHz発振器に接続して、コンデンサを介して、GNDに落とし込みます。
・11番ピンは、動作クロックの指定で、HIGHにすると16MHz、LOWで10MHzで動作します。
詳細は音声合成LSI「AquesTalk pico LSI」ATP301Xのデータシートを参照してください。

また、ATP3012シリーズとATP3011シリーズでは若干の違いがあります。
ATP3011では、内部クロックを使用しているので、外部に発振器を取り付ける必要はありません。
音声出力用で使用するピンも異なります。

データシートにある外部スピーカーの配線図です。

ブレッドボード上に配線すると、こんな感じになります。

ATP3012で使用した電子部品
水晶発振器(16MHz)
セラミックコンデンサ 22pF(22)×2
抵抗10KΩ×2
基板取付用スピーカーユニット 8Ω0.08W 700~4kHz
抵抗5.1KΩ
トランジスタ 2SC1815
ユニバーサルプリント基板×2
補足:Arduinoボードを利用した簡易動作
ATP3012/ATP3011のベースチップは、Arduino unoと互換性があるので、Arduino uno に実装されている
ATmega328(P)をATP3012に差し替えることで、簡単に評価、動作を確認することもできるようです。
■日本語文字をローマ字に変換する
AquesTalkの音声合成エンジンは、漢字を含むテキストを、かな表記の音声記号列に変換する言語処理部 AqKanji2Koeと、
音声記号列を音声に変換する規則音声合成部 AquesTalkの2つのモジュールに分かれています。

言語処理ライブラリAqKanji2Koeを使用するにはライセンス購入が必要になりますので、
今回はこの言語処理ライブラリは使わずに、漢字をローマ字に変換できるPythonライブラリ "pykakasi" を使ってみました。
pykakasiモジュールのインストール
$ sudo pip3 install git+https://github.com/miurahr/pykakasi
pythonを起動して、kakasiの機能を確認していきます。
$ python3
>>> from pykakasi import kakasi
>>> kakasi = kakasi()
>>> kakasi.setMode('H', 'a')
>>> kakasi.setMode('K', 'a')
>>> kakasi.setMode('J', 'a')
>>> conv = kakasi.getConverter()
ライブラリーをインポートします。setMode では、カタカナ、ひらがな、漢字をローマ字に変換するよう指示しています。
setModeオプション指定
Option | Description | Values | Note |
K | Katakana conversion | a,H,None | roman, Hiragana or non conversion |
H | Hiragana conversion | a,K,None | roman, Katakana or non conversion |
J | Kanji conversion | a,H,K,None | roman or Hiragana, Katakana or noconv |
a | Roman conversion | E,None | JIS ROMAN or non conversion |
E | JIS ROMAN conversion | a,None | ascii roman or non conversion |
次にどう変換されるか確認しておきます。
>>> text='きょうの天気は、曇り時々晴れです'
>>> print(conv.do(text))
kyounotenkiha、kumoritokidokiharedesu
日常的な文章はかなり正確に変換されるようです。
ただ、AquesTalkでは「は」を「わ」として発音したい場合は、ローマ字よみを「wa」とする必要があります。
特殊記号を変換してみます。
>>> text = '?!~ー()“”「」・、。..'
>>> print(conv.do(text))
?!~-()“”「」.、。..
音を延ばす記号と、中ドット以外は、そのまま出力されています。
おそらく、kakasiの辞書に登録されていない漢字はそのまま出力するのでしょう。
固有名詞を変換してみます。
>>> text='どうも霊夢です。魔理沙です'
>>> print(conv.do(text))
doumoreiyumedesu。marisadesu
固有名詞も、kakasiで変換する前に、独自に変換する必要があります。
なぜ、「魔理沙」が正確に変換されたかというと、kakasiの内部で単語が「魔」と「理沙」に分解されて、変換されたからです。
母音がダブる場合
>>> text = '大きい'
>>> print(conv.do(text))
ookii
「oo」→「o-」、「ii」→「i-」にして、母音を延ばすようにしたほうが、聞きやすいかもしれません。
■AquesTalk音声記号列仕様(抜粋)
' | アクセント |
. | 文の終わり |
? | 文の終わり、文末の声が高めになる |
(半角空白) | 無音区間がはいる。 文中の息継ぎ部分に指定する。一般に次の音が高くなる。 |
, | 半角空白より短いボーズ |
kakasiで変換する前に実施する置換処理
霊夢→reimu、は、→wa,、?→?、~→kara など
kakasiでの変換後に追加する置換処理
uu→u-、oo→o-、ee→e-、aa→a-、ii→i-、iu→yu- など
■日本語→ローマ字変換処理
Pythonコードの抜粋です。辞書の部分は用途に応じて変更してください。
DICT_BEFORE = {'霊夢':'reimu','は、':'wa,',
'?':'?','!':'\'.','~':'kara','、':',','。':'.'}
DICT_AFTER = {'uu':'u-','oo':'o-','ee':'e-',
'aa':'a-','ii':'i-','iu':'yu-','ha,':'wa,'}
def kanji2roman(self, msg):
for target, dest in self.DICT_BEFORE.items():
msg = msg.replace(target,dest)
msg = self.cnv.do(msg)
for target, dest in self.DICT_AFTER.items():
msg = msg.replace(target,dest)
return msg;
■AquesTalk pico LSIとのUART通信
ローマ字テキストの終端にCR(0x0D)を付加して、送信します。
LSIが発音中に、追加のテキストを送信すると、BUSY(*)が返されます。
READY(>)になるのを確認してから、次のテキストを送信します。

UART通信制御用のコードの抜粋は下記のようになります。
def write(self, msg):
self.msg = self.kanji2roman(msg) + "\r"
while True:
self.ser.write(bytes("\r",'ascii'))
rx = self.ser.read()
status = rx.decode('utf-8')
if status=='*': # busy
sleep(1)
elif status=='>': # ready
self.ser.write(bytes(self.msg,'ascii'))
rx = self.ser.read()
break
ATP3012での転送速度(ボーレート)はデフォルトで9600bpsです。
ATP3011でのUART通信では、ボーレート自動設定のため、最初に'?'を送信する必要があります。

if model == 'ATP3011':
self.ser.write(bytes('?','ascii'))
rx = self.ser.read()
動作が確認できましたら、ブレッドボードからユニバーサルプリント基板へ移し込みます。
LSIは交換可能なように、丸ピンICソケット上に挿しています。

スピーカー部分を分離して作成しています。回路上の抵抗は変更可能なように、丸ピンICソケット上に挿しています。

Raspberry Pi Zero WH とつなぐと、こんな感じになります。

実際の使い方としては、動的に日本語をAquesTalkに合った、かな表記の音声記号列に換えるのではなく、
定型文章的な用途においてあからじめ適切な音声記号列に編集しておいて、音声合成させるほうがよいと思います。
■サンプルソースコード
from serial import Serial
from time import sleep
from pykakasi import kakasi
import time
import sys
class text2speech(object):
SERIALPORT = '/dev/ttyAMA0'
DEVICE = 'ATP3012'
TIMEOUT = 3
BAUDRATE = 9600
DICT_BEFORE = {'霊夢':'reimu','は、':'wa,','?':'?','!':'\'.','~':'kara',
'(':',',')':',','「':',','」':',','、':',','':'','。':'.','.':'.',}
DICT_AFTER = {'uu':'u-','oo':'o-','ou':'o-','ee':'e-','aa':'a-','ii':'i-','iu':'yu-','ha,':'wa,'}
def __init__(self, model='ATP3012'):
self.model=model
self.ser = Serial(self.SERIALPORT, baudrate=self.BAUDRATE, timeout=self.TIMEOUT)
self.kks = kakasi()
self.kks.setMode('H', 'a')
self.kks.setMode('K', 'a')
self.kks.setMode('J', 'a')
self.cnv = self.kks.getConverter()
if model == 'ATP3011':
self.ser.write(bytes('?','ascii'))
rx = self.ser.read()
def kanji2roman(self, msg):
for target, dest in self.DICT_BEFORE.items():
msg = msg.replace(target,dest)
msg = self.cnv.do(msg)
for target, dest in self.DICT_AFTER.items():
msg = msg.replace(target,dest)
return msg;
def write(self, msg):
#self.msg = self.kanji2roman(msg) + "\r"
self.msg = msg
while True:
self.ser.write(bytes("\r",'ascii'))
rx = self.ser.read()
status = rx.decode('utf-8') # status is null
if status=='*': # busy
sleep(1)
elif status=='>': # ready
self.ser.write(bytes(self.msg,'ascii'))
rx = self.ser.read()
break
if __name__ == '__main__':
import sys, os
if len(sys.argv) == 2:
model = sys.argv[1]
else:
model = text2speech.DEVICE
if not os.path.exists(text2speech.SERIALPORT):
sys.exit("ERROR: Serial port not found at: %s" % text2speech.SERIALPORT)
print ("Testing AquesTalk Pico LSI: %s" % model)
ts = text2speech(model=model)
text='きょうの天気は、曇り時々晴れです'
ts.write(text)
ATP3011はLSIと抵抗1本で済んでしまうため、スピーカーと一体型にしてしまいました。

【参考文献】
・日本語文字をローマ字に変換する
・Pykakasiで文章をひらがなへのバラバラ変換して遊んでみた♪
・PYKAKASI documentation
・自作Arduino互換回路(ブレッドボード版)
|

【深層学習関連】
【画像処理関連】

【音楽関連】

【WEBサイト構築関連】

【開発環境関連】

【SNS関連】

【周辺機器関連】

【その他】

トランジスタ技術 2021年1月号
特集: アナログ回路はノイズと闘う ~システムの性能を維持して安定な動作を実現するために~
Interface 2021年1月号
☆特集 Jetson/ラズパイ/PCで自習 Python画像処理100
☆特別付録:コンピュータ手帳2021
日経Linux 2021年 1月号
★超保存版・冊子付録 Ubuntu完全対応 Linuxコマンド逆引き大辞典 264項目
★付録DVD 特集連動2本入り「Ubuntu 20.10 日本語Remix」「Ubuntu Server20.10」
ラズパイマガジン2020年12月号
温度、距離、におい、圧力など、さまざまな種類のセンサー350種類を一挙に紹介します。特性や価格を示した一覧表を用意したので、用途に合った適切な製品を選べます。そのうちの34種類のセンサーは、仕組みから配線図まで図解で分かりやすく解説します。
15Stepで踏破 自然言語処理アプリケーション開発入門
エンジニアの実務に役立つ知識に絞り、独自に15の学習ステップを体系化しました。
数値計算にNumPy、形態素解析にMeCab、機械学習にscikit-learn、ディープラーニングに
Keras等を使い、Pythonのコードを記述し動かしていきます。
プログラミング・ビットコイン ―ゼロからビットコインをプログラムする方法
Linuxサーバーがゼロから作れる本
このLinuxを使いこなす上で一番手っ取り早いのが自分でLinuxサーバーを構築してみることです。
WindowsやMacのパソコンしか使ったことが無い人でも理解できるよう、
しくみや手順の解説を丁寧にまとめ上げた、ゼロからのサーバー入門ガイドです。
Raspberry Pi 3 Model B V1.2 (日本製) 国内正規代理店品
【仕様概要】CPU:ARM 1.2GHz 4コア、GPU:2コア 3D・動画支援、RAM:1GB、ネットワーク:LAN/Wi-Fi/Bluetooth、インターフェース:USB/HDMI/オーディオ/GPIO(UART/I2C/I2S/SPI...)。
Arduino Nano
ATmega328搭載/
動作電圧: 5V/
入力電源電圧(推奨):7~12V/
デジタル入出力ピン: 14本/
PWMチャンネル: 6本/
アナログ入力チャンネル: 8本/
直流電流(1ピン当り最大): 40 mA/
直流電流(3.3Vピン、1ピン当り最大): 50 mA/
Flashメモリ: 32 KB (ATmega328) 内2KBはブートローダーで使用/
SRAM: 2 KB (ATmega328)/
EEPROM: 1 KB (ATmega328)/
Clock Speed: 16 MHz
逆引き PIC電子工作 やりたいこと事典
機能が豊富で、速度・アナログ制御・省電力性・コストの面でもアドバンテージをもつPICマイコン。そんなPICマイコンの使い方を、目的別にやりたいことから引ける、逆引きタイプのガイドブックです。
C言語による PICプログラミング大全
2002年に初版、2009年に第2版を発売した名著『C言語によるPICプログラミング入門』
が大幅リニューアルし「大全」として生まれ変わりました。
本書では、機能豊富なPIC16F1シリーズを使いこなすために、統合開発環境を
MPLAB X IDEに、CコンパイラはMicrochip Technology社純正のXC8に、それぞれ変更しました。
C言語でPICマイコンのプログラミングを始めたい方から、最新のPICマイコンの機能をとことん使い倒したい方まで、必ず役に立つ1冊です。
PICと楽しむRaspberry Pi活用ガイドブック
「PICマイコン+Raspberry Pi3B」という組み合わせで、高機能な電子工作を簡単に実現し、電子工作を各段に高度化する方法について解説していきます。
ESP32&Arduino 電子工作 プログラミング入門
電子工作ファンに人気のマイコンArduino、そしてWiFiとBluetooth内蔵でネットワーク接続しやすいESP32。それらのマイコンでプログラムを組む際に使うのが「Arduino言語」です。
超特急Web接続!ESPマイコン・プログラム全集
IoT技術の回路とプログラムを解説しました.
トランジスタ技術2016年9月号と2017年3月号の特集に
最新の情報を加筆して一冊に仕上げました.
回路とプログラムのサンプル資料として最適です.
ラズベリー・パイやIchigoJamを連動させた例も紹介しています
M5Stack用カード型キーボードユニット
M5Stackにフル機能のQWERTY配列キーボードを実装できるユニットです。複数のボタンの組み合わせ(Sym + Key、Shift + Key、Fn + Key)や豊富なキーの値を出力することが可能です。
Ubuntu サーバー徹底構築
サーバー用UbuntuでLinuxサーバーを構築しよう!
導入からLinuxやコマンドの基本、各種サーバー構築、バックアップやストレージ管理まで!
サーバー用Linuxディストリビューションとして定評のあるUbuntu Serverの中でも、
10年長期サポート版であるUbuntu Server 18.04 LTSに対応!
[改訂第3版]Linuxコマンドポケットリファレンス
本書はLinux操作に必要なコマンドを収録したポケットリファレンスです。機能別にコマンドを分類し、各コマンドページでは書式/使用例などをコンパクトにまとめています。またアルファベット順索引も用意しており、名前しかわからなくてもすぐに目的のコマンドを探すことができます。今回の改訂では仮想化、データベース、クラウド時代に対応したネットワークコマンドなどを追加しています。おもなLinuxディストリビューションのCentOS、Fedora、Debian GNU/Linux、Ubuntuに対応し、初心者から上級者まで必携の1冊です。
できるPRO Apache Webサーバー 改訂版 Version 2.4/2.2/2.0対応
番のApache独学書を改訂しました!
CentOS、Ubuntu、Windows、Mac OS Xに対応しています。できるPROシリーズは、実際の画面や詳細なイラスト、概念図などで構成。
はじめての方でも理解しやすくなっています。
インストール、アクセス制限、CGI、モジュール拡張、ログ管理など、基本的なことから実践的なことまでていねいに解説しています。
[改訂第3版]PHPポケットリファレンス
PHPを利用したいすべての方必携の「PHPポケットリファレンス」最新版がついに登場! PHP 5/4による開発の際によく利用される機能を集約し、必要な知識を目的別、逆引きでまとめました。PHP5.3以降を対象とし、PHP4からある機能はPHP4でも利用できることがわかるようになっています。またオブジェクト指向型のAPI解説を大幅に強化。開発の現場には1冊置いておきたい書籍です。
MySQL ポケットリファレンス
MySQLはさまざまなWebサービスの中核を担うデータベースです。本書はMySQLの基礎的な内容を中心に、日常的によく使うちょっとしたコマンドや、外部管理ツールとの連携など、MySQLの管理/運用にあたって便利な情報を素早く探し出すことができます。MySQL自体の操作、MySQL特有のコマンド、MySQL専用管理ツール、PHPからの操作など、MySQLを実際に使っているユーザーに役立つ内容となっています。
Postfix詳解―MTAの理解とメールサーバの構築・運用
電子メールの配送システムの中核を担うプログラム「MTA」(Message Transfer Agent)のひとつが、「Postfix」です。 この全容を記した本です。
すところなく解説していきます。
DNSがよくわかる教科書
本書では、DNSの仕組みから、ドメイン名のルール、主なリソースレコードの内容、コマンドによる動作確認、DNSの運用ノウハウ、DNSSECの基礎知識まで、順を追ってやさしく解説します。
|