テキスト読み上げ 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互換回路(ブレッドボード版)
|
Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
Arduinoで学ぶ組込みシステム入門(第2版)
●Arduinoを使って組込みシステム開発を理解する
・ハードウェアやソフトウェアなどの基礎知識/
・設計から実装までを系統的に説明するモデルベース開発/
・Arduinoを用いた実際の開発例
最新 使える! MATLAB 第3版
◆◆すぐに「使える!」 全ページフルカラー!◆◆
・MATLAB R2022bに対応し、解説もより詳しく!/
・コマンド・スクリプトの例が豊富で、動かして学べる!/
・超基本から解説。これから使いはじめる人にぴったり!/
・全編フルカラー、スクリーンショットも豊富!
Amazon Web Services基礎からのネットワーク&サーバー構築改訂4版
1.システム構築をインフラから始めるには/
2.ネットワークを構築する/
3.サーバーを構築する/
4.Webサーバーソフトをインストールする/
5.HTTPの動きを確認する/
6.プライベートサブネットを構築する/
7.NATを構築する/
8.DBを用いたブログシステムの構築/
9.TCP/IPによる通信の仕組みを理解する
C言語は第二の母国語: 独学学生時代から企業内IT職人時代に培った、独立のための技術とノウハウ 平田豊著
学生時代から独学でプログラミングをはじめ、企業内でデバイスドライバを開発し、そして独立後もたくさんのアプリケーション開発や技術書制作に携わってきた著者。その筆者が大事に使い続ける「C言語」の“昔と今”について、気づいたことや役立つ知識、使ってきたツールなどについて、これまで記してきたことを整理してまとめました。
本書では、現役プログラマーだけでなく、これからプログラミングを学ぶ学生などにも有益な情報やノウハウを、筆者の経験を元に紹介しています。
1冊ですべて身につくJavaScript入門講座
・最初の一歩が踏み出せる! 初心者に寄り添うやさしい解説
・最新の技術が身につく! 今のJavaScriptの書き方・使い方
・絶対に知っておきたい! アニメーションとイベントの知識
・プログラミングの基本から実装方法まですべて学べる
図解! Git & GitHubのツボとコツがゼッタイにわかる本
ソフトウェア開発では欠かすことのできないGit、GitHub。
これからGit、GitHubを使いたいという入門者の方でも、実際に手を動かしながら使い方を学べます。
C自作の鉄則!2023 (日経BPパソコンベストムック)
メーカー製のパソコンはスペックが中途半端で、自分が本当に欲しい機種がない――。そう思っている人には、ぜひ自作パソコンをお薦めします。自作パソコンのパーツは進化が速く、しかも驚くほど種類が豊富。価格も性能も、幅広く用意されているため、満足度100%の“自分だけの1台”を手に入れることができます。
Interface 2023年6月号
特集:第1部 フィルタ設計 基礎の基礎/
第2部 係数アプリや波形観測アプリで合点!FIR&IIRフィルタ作り/
第3部 配布プリント基板で体験!マイコンで動くフィルタ作り
日経Linux 2023年5月号
【特集 1】 AI時代の最強フリーソフト ~ 25のやりたいを実現!
【特集 2】 AWS、Azureのうまみを無料で体感!面倒なことはクラウドに任せよう
【特集 3】 新しいRaspberry Pi Cameraで遊んでみよう
【特集 4】 Linuxで旧型PCを復活! 1kg切るモバイルPCを「ChromeOS Flex」でChromebook化
ラズパイマガジン2022年秋号
特集:5大人気ボード 電子工作超入門
「半導体不足で在庫が不足し、電子工作のボードがなかなか買えない…」。そんな今にふさわしい特集を企画しました。5種の人気ボードにすべて対応した電子工作の入門特集です。「GPIO」や「I2C」を使った電子パーツの制御方法は、どのボードでも同じです。手に入れられたボードを使って、今こそ電子工作を始めましょう。
地方で稼ぐ! ITエンジニアのすすめ
学歴、理系の知識、専門スキル……全部なくてもITエンジニアになれる!
地方でも高収入でやりがいをもって働ける!ITエンジニアの魅力を一挙大公開
Raspberry Piのはじめ方2022
本書は、ラズパイやPicoの買い方やインストール、初期設定といった基本から、サーバー、電子工作、IoT、AIといったラズパイならではの活用方法まで、1冊でお届けします。
ラズパイをこれから始める方向けに、全36ページの入門マンガ「女子高生とラズベリーパイ」も巻末に掲載。これを読むだけでラズパイがどんなものなのか、すぐに分かって触れるようになります。
ハッカーの学校 IoTハッキングの教科書
生活にとけこみ、家電機器を便利にするIoT技術。
Webカメラなど、便利の裏側に潜むセキュリティの危険性をハッキングで検証。
専門家がパケットキャプチャからハードウェアハッキングまで、その攻撃と防御を徹底解説。
本書は2018年7月に刊行された「ハッカーの学校IoTハッキングの教科書」に一部修正を加えた第2版です。
攻撃手法を学んで防御せよ! 押さえておくべきIoTハッキング
本書は、経済産業省から2021年4月にリリースされた、IoTセキュリティを対象とした『機器のサイバーセキュリティ確保のためのセキュリティ検証の手引き』の『別冊2 機器メーカに向けた脅威分析及びセキュリティ検証の解説書』をもとに、IoT機器の開発者や品質保証の担当者が、攻撃者の視点に立ってセキュリティ検証を実践するための手法を、事例とともに詳細に解説しました。
ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS…
全WEB媒体で効果バツグン!
カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術
プログラマーは世界をどう見ているのか 西村博之著
イーロン・マスク(テスラ)、ジェフ・べゾス(Amazon)、ラリー・ペイジ(Google)…etc.
世界のトップはなぜプログラマーなのか?
ニーア オートマタ PLAY ARTS改 <ヨルハ 二号 B型 DX版> PVC製 塗装済み可動フィギュア
「NieR:Automata」より、ヨルハ二号B型こと2BがPLAY ARTS改に新たに登場!
高級感の感じられるコスチュームや髪の質感、洗練されたボディバランス、細かなデティールに至るまでこだわり抜かれた逸品。
DX版には通常版のラインナップに加え2Bの随行支援ユニット ポッド042などをはじめ“純白の美しい太刀"白の約定やエフェクトパーツ、自爆モードを再現できる換装用ボディパーツ、シーンに合わせて変えられる顔パーツ2種も付属する豪華な仕様に。
作中のあらゆるシーンを再現することが可能なファン必見の一品となっている。
Newtonライト2.0 ベイズ統計
ベイズ統計は,結果から原因を推定する統計学です。AIや医療などの幅広い分野で応用されています。その基礎となるのは18世紀に考えだされた「ベイズの定理」です。
この本では,ベイズ統計学のきほんをやさしく紹介していきます。
白光(HAKKO) ダイヤル式温度制御はんだ吸取器 ハンディタイプ FR301-81
無水エタノールP 500mlx2個パック(掃除)
ケイバ(KEIBA) マイクロニッパー MN-A04
サンハヤト SAD-101 ニューブレッドボード
白光(HAKKO) HEXSOL 巻はんだ 精密プリント基板用 150g FS402-02
[Amazon限定ブランド]【指定第2類医薬品】PHARMA CHOICE 解熱鎮痛薬 解熱鎮痛錠IP 100錠
|