Google

Google Play審査リジェクト「不適切な広告」に対応する

拙作のタイ語辞書アプリ「ごったい」のアップデート時の審査で、「不適切な広告に関するポリシー違反」ということでリジェクト(非承認)を喰らってしまいました。同様にリジェクトされてしまった人の参考になるかと思い、対応とあきらめの歴史を記事にしておこうと思います。 ...続きを読む

ラズベリーパイに日本語で喋らせる[その3]Open JTalk

性懲りもなく夜な夜なRaspberry Pi搭載のVoice Kit V2で遊んでいます。今回は前々回のGoogle Cloud Text-To-Speech、前回のAmazon Pollyによる読み上げに続き、無料の音声合成ソフトウェアであるOpen JTalkを使用してテキストの読み上げを試してみようと思います。

前段

相変わらず愛しいVoice Kit V2です。

なおOpen JTalkではなく、前々回のGoogleあるいは前回のAmazonを試してみたい人は以下のリンクからどうぞ。

ラズベリーパイに日本語で喋らせる[その1]Google Cloud Text-To-Speech

ラズベリーパイに日本語で喋らせる[その2]Amazon Polly

Google、Amazonともに有料APIです(無料枠はありますが)。その点Open JTalkは完全無料かつオフラインで利用できるというメリットがありますので、用途によっては選択肢のひとつになると思います。というわけで試してみましょう。

Open JTalkのインストール

私はRaspbianOSでやってますが、Linux系でスピーカー付いてりゃ何でもいいと思います。

とりあえずdebian系の方はいつもどおりaptでインストールします。

$ sudo apt install open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001

3つのパッケージをインストールします。open-jtalk本体とmecab辞書、それに音声の3つです。open_jtalkコマンド実行時に辞書ディレクトリと音声モデルを指定する必要があります。基本的な書式は次のような感じ。

$ open_jtalk -x <辞書ディレクトリ> -m <音声ファイル> -ow <出力するwavファイル>

読み上げるテキストは標準入力かファイル名を指定します。先程インストールした辞書はRaspbianOSの場合は /var/lib/mecab/dic/open-jtalk/naist-jdic/ に、音声モデルは /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice にインストールされています。

実際に何か読み上げてみます。

$ echo "こんにちわ、私は金正恩です" | open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic/ -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -ow test.wav
$ aplay test.wav

上手く読み上げできました? 標準の男性音声で再生されます。ちなみにaplayが入ってない環境なら、なんとかして作成したwavを再生してください。

Pythonで

ではPythonから合成・再生ができるようにしてみます。python用のライブラリがあるわけではないので、直接コマンドを叩く感じになります。

#!/usr/bin/env python3
import sys
import subprocess

DICT_PATH='/var/lib/mecab/dic/open-jtalk/naist-jdic/'
VOICE_PATH='/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice'

while True:
    print('何か入力してエンターキーを押してね(CTRL+Cで終了)')
    text = input()
    with open('speech.txt', 'w') as f:
        f.write(text)
    subprocess.run(['open_jtalk', '-x', DICT_PATH, '-m', VOICE_PATH, '-ow', 'speech.wav', 'speech.txt'])
    subprocess.run(['aplay', 'speech.wav'])

色々喋らせてみたんですが、音声合成の処理時間が結構かかってますね・・・。「こんにちわ」でも1秒ぐらいかかってます。非力なラズパイZeroだからかなあ・・・?これならGoogleやAmazonのオンラインAPIと大差無い気もします。

音声を変える

音響モデルを変更することで音声を変えることができます。このサイトが詳しいみたい。

Open JTalk の音響モデルを試す

MMDAgentのモデルが比較的高精度なモデルのような気がしますので、これだけ試しておきましょう。以下URLからファイルをダウンロードします。

MMDAgent 日本語情報トップページ

MMDAgent_Example-1.8.zipというファイルをダウンロードします。解凍したらVoiceディレクトリの中にmeiとtakumiという音響モデルがありますが、これらが日本語音響モデルです。感情毎にモデルが別れているみたいですね。

モデルを先程のpythonで試してみる場合は、VOICE_PATHの値を適当に変更してください。

考察

Open JTalkで使用できる音響モデルは正直言ってGoogleやAmazonのものと比べると見劣り(聞き劣りというべき?)しますね・・・。やはりGoogleやAmazonは偉大ということか・・・。外部APIを叩いてもサクッと返ってきますし、無料枠も太っ腹(特にGoogleは)なので、あえてOpen JTalkを使用する必要はないかな。地味にSSMLも役立ちそうな気もしますし。

そんな感じです。

ラズベリーパイに日本語で喋らせる[その2]Amazon Polly

相変わらず夜な夜なRaspberryPi搭載のVoice Kit V2で遊んでます。今回は前回のGoogle Cloud Text-To-Speechに続き、Amazonの読み上げAPIであるAmazon Pollyで日本語読み上げを試してみようと思います。

前段

愛しいVoice Kit V2です。

AmazonではなくGoogle CloudのText-To-Speechを試してみたい人は前回の記事を見ていただければ。

ラズベリーパイに日本語で喋らせる[その1]Google Cloud Text-To-Speech

Amazonにも同様の読み上げAPIがあり、料金体系もGoogleと(見た感じ)ほぼ一緒です。合成音声の完成度やAPIのデキなどが気になるところなので、実際に日本語読み上げを試してみます。

Amazon Polly

公式はこちら

Amazon Polly

トップページで日本語音声も聴くことができます。Mizuki(女性)とTakumi(男性)の2パターンですね。これに関してはGoogleの方が選択肢が多いです。ここで試聴する感じではGoogleと大差はないかも。。

続いて料金について。

料金

まずは無料枠を見てみます。(2020.03.05現在)

機能 最初の発話リクエストから 12 か月間
スタンダード音声 0〜500 万文字
ニューラル音声 0〜100 万文字

ニューラル音声の方がハイテクな音声なのでしょう。どちらも充分な無料枠だと思います。

ただ最初の12ヶ月からは有料になるようですね。

機能 有料使用
スタンダード音声 100 万文字あたり $4.00(USD)
ニューラル音声 100 万文字あたり $16.00(USD)

有料部分に関してはGoogleと同じってことでしょうか。しかしGoogleの無料枠は無期限なのでコスト的にはGoogleの方が安い(はず)です。後は機能面で比較ってことかな。

ではPollyでTTSを

実際にAPIをPythonから利用していみたいと思います。流れ的にはGoogle Cloud Text-To-Speechと同じで、事前に認証系の設定が必要です。

まずはサービスキーが必要なので作りましょう。(シークレットアクセスキーが分かるなら)既存のものでもいいです。新しく作る場合はIAMのユーザーページから。

[アクセスキーの作成]ボタンをクリックすると、ダイアログが表示されアクセスキーIDとシークレットが表示されます。このシークレットアクセスキーはコピーしておきます。また今回は使いませんがcsvのダウンロードもしておきましょう。このダイアログを閉じると二度とダウンロードできないので。

なお、APIを使用するユーザーにPollyのAccess権限が必要です。ポリシーをアタッチするか、権限のあるグループ(Developersとか)にユーザーを追加するなどしておいてください。

AWSの設定といえばこれぐらいです。続いてPython用のAWSライブラリbotoをインストールしておきます。

$ pip install boto3 #環境によってはpip3です

以上で準備は完了。

Pollyサンプル

何かテキストを入力するとMizukiさんが読み上げてくれるサンプルです。

#!/usr/bin/env python3
import sys
import subprocess
import boto3

polly_client = boto3.Session(
    aws_access_key_id='サービスアクセスキーID',
    aws_secret_access_key='シークレットアクセスキー',
    region_name='リージョン(ap-northeast-1とか)').client('polly')

while True:
    print('何か入力してエンターを押してね(CTRL+Cで終了)')
    response = polly_client.synthesize_speech(VoiceId='Mizuki',
                    OutputFormat='mp3',
                    Text=input())
    with open('speech.mp3', 'wb') as f:
        f.write(response['AudioStream'].read())
    subprocess.run(['mpg321', '-q', 'speech.mp3'])

Sessionに渡す認証情報はご自分のものに書き換えてください。

音声はmp3でダウンロードしてます。wavの方が再生が簡単だったのですが、ぱっと見た感じwavで落とす方法がなさげだったので、あきらめてmpg321で再生しています。ここはmp3が再生できたら何でもいいです。mpg321をラズベリーパイにインストールする場合は、普通に sudo apt install mpg321 でOKです。

無事再生できたでしょうか?

色んなテキストを読み上げてもらいましたが、正直Googleと大差無い気もしますね・・。細かいところまで調べてませんが、どちらかが突出して優れているというわけでもなさそうな印象。であれば無料枠が無期限のGoogleに軍配があがるかなあ、と思っていたんですが、そういや完全無料スタンドアローンのOpenJTalkを試していないことを思い出しました。

というわけで、次回はOpenJTalkを試してみようと思います。