ラズパイ3+OpenJTalkで音声合成


ラズパイ3 + Julius では音声出力は、用意しておいたwavファイルをaplayで出力していただけでしたが、この出力の部分に、音声合成エンジンのOpenJTalkを使ってみます。

日本語音声合成はOSS界隈ではいくつかあります(Merlin とか)。深層学習を使ったものもありますが、ここはひとつ安定のOpenJTalkということで。


 

 

OpenJTalk

サンプル

 


準備

出力周りを確認します。

ラズパイの音声出力は2系統あります。
ステレオミニジャックとHDMIです。
USBスピーカーを使う場合はステレオミニジャックになります。

カード番号とデバイス番号を調べます。

$aplay -l

ステレオミニジャックのカード番号は1、デバイス番号は0です。

テストで以下が聞こえたらOK

$ aplay -Dhw:1,0 /usr/share/sounds/alsa/Front_Center.wav


インストール

$ sudo apt-get update
$ sudo apt-get install open-jtalk

他の提案パッケージもインストールします。

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

 

やってみます

$ echo “これはテストです” | open_jtalk -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow ./open_jtalk_tmp.wav

$ aplay open_jtalk_tmp.wav

使っている音響モデル
/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice

辞書
/var/lib/mecab/dic/open-jtalk/naist-jdic

音響モデルを変えてみます。

音響モデルのサンプル

***.htsvoiceファイルをダウンロードしたら

/home/pi/voiceというフォルダーを作って、そこに置いておきます。

で、やってみます。

$ echo “それはない” | open_jtalk -fm 0.55 -a 0.5 -jf 3.0 -r 1 -m /home/pi/voice/mei_happy.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow ./open_jtalk_mei.wav

$ aplay open_jtalk_mei.wav

 

声が気に入らなかったら触ってみるパラメーター

「a: all-pass constant」(オールパス値)
「b: postfiltering coefficient」(ポストフィルター係数)
「r: speech speed rate<strong」(スピーチ速度係数)
「fm :additional half-tone」(追加ハーフトーン)
「u: voiced/unvoiced threshold」(有声/無声境界値)
「jm: weight of GV for spectrum」(スペクトラム系列内変動の重み)
「jf: weight of GV for log F0」(F0系列内変動の重み)


Pythonのサンプルコードはこんな感じ。

wavファイルを作ってから出力する場合

【talk.py】

#!/usr/bin/env python3
#coding: utf-8

import sys
import subprocess

def jtalk(g,t):
    open_jtalk = ['open_jtalk']
    dict = ['-x','/var/lib/mecab/dic/open-jtalk/naist-jdic']
    if(g == 'female'):
        htsvoice = ['-m','/home/pi/voice/mei_happy.htsvoice']
    elif(g == 'male'):
        htsvoice = ['-m','/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice']

    halftone = ['-fm','0.55']
    allpass = ['-a','0.5']
    gvweight4fo = ['-jf','3.0']
    speed = ['-r','1.0']

    outwav = ['-ow','temp.wav']
    cmd = open_jtalk + dict + htsvoice + speed + halftone + allpass + gvweight4fo + outwav
    p = subprocess.Popen(cmd,stdin=subprocess.PIPE)
    p.stdin.write(t.encode('utf-8'))
    p.stdin.close()
    p.wait()
    aplay = ['aplay','-q','temp.wav','-Dhw:1,0']
    wr = subprocess.Popen(aplay)

def main():
    args = sys.argv
    gender = args[1]
    text = args[2]
    jtalk(gender,text)

if __name__ == '__main__':
    main()

$python3 jtalk.py 'female' 'こんにちは'
$python3 jtalk.py 'male' 'こんにちは'

 


スピーカーの音量調整

$amixer set PCM n%

n ->60~100

この範囲でレベルを設定してチェックしてみます。

$aplay /usr/share/sounds/alsa/Front_Center.wav

 


 




Be the first to comment

Leave a Reply

Your email address will not be published.


*