8
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

OpenJTalk on Windows10 (環境構築からPythonで日本語をしゃべらせる)

Last updated at Posted at 2019-12-27

はじめに

Windows10でOpenJTalkを試してみようとしたのですが,必要な環境を一から整えたためどなたかのためになるようにメモしておきます.
タイトルにもある通り,環境構築からPythonで日本語をしゃべらせるところまで説明します.

環境

  • windows 10
  • Visual Studio 2019 Community
  • OpenJTalk 1.09
  • Python 3.7

ビルド環境の準備

WindowsではOpenJTalkを実行するには自分でビルドする必要があるので環境を整えます.

Visual Studio 2019 Communityのインストール

これは本題ではないのでしまっておきます.

Visual Studio 2019 Communityのインストール [ここ] (https://docs.microsoft.com/ja-jp/visualstudio/install/install-visual-studio?view=vs-2019) のサイトからVisualStudio 2019をインストールします. インストーラーが起動したらC++によるデスクトップ開発にチェックを入れ、インストールを押してください. インストール完了後に一度起動してください. ↓こちらのサイトを参考にさせていただきました.ありがとうございます. https://qiita.com/Gaccho/items/f748f59784ff68d7a474

ビルドの設定

コマンドプロンプトを起動して,以下の2つのコマンドを実行します.

$ cd C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build

$ vcvarsall.bat x64

nmakeの設定

コマンドプロンプトでnmakeコマンドを実行しようとした際に実行できない(コマンドが認識されていないみたいなエラー)が出た場合は環境変数にnmake.exeのパスを通しておく必要があります.(自分は通さないとだめでした)
自分は以下のパスでいけました.
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\bin\Hostx64\x64

OpenJTalkのインストール

ここからはこちらのサイトを参考にさせていただきました.ありがとうございます.

ソースコードの入手 OpenJTalk,hts_engineAPI

まず,OpenJTalk 1.09を入手します.ここから選びますが,以下のリンクですぐにダウンロードされます.

コンパイルに必要な音声合成用のライブラリhts_engineAPIをここから選びますが,OpenJTalkと同様以下のリンクですぐにダウンロードされます.

ダウンロードしたopen_jtalk-1.09.tar.gzを展開して
c:\temp\open_jtalk-1.09としてください.また,hts_engineAPIは、c:\temp\open_jtalk-1.09\hts_engine_API-1.10 に展開しておくとコンパイルの際に問題が少なくすみます.

nmakeでのコンパイル

先ほどコマンドプロンプトでnmakeが使えるようになったので,コンパイルを行います.

hts_engine_API-1.10のコンパイル

まずはhts_engine_API-1.10から行うので,以下の3つのコマンドを実行してください.
完了するとc:\hts_engine_API にファイルが作成されます.

$ cd c:\temp\open_jtalk-1.09\hts_engine_API-1.10
$ nmake /f Makefile.mak
$ nmake /f Makefile.mak install

open_jtalk-1.09のコンパイル

次にopen_jtalk-1.09のコンパイルを行います.以下の3つのコマンドを実行してください.完了するとc:\open_jtalk にファイルが作成されます.

$ cd c:\temp\open_jtalk-1.09
$ nmake /f Makefile.mak
$ nmake /f Makefile.mak install

最後の方で文字化けした文字列が表示されますがとりあえずは気にしなくていいそうです.詳細はこちら

これにより、c:\open_jtalk\bin\open_jtalk.exe が生成されます.

Voiceデータの入手

MMDAgent から
https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.6/
から、MMDAgent_Example-1.6.zip をダウンロードして、Voice/mei/*.htvoice を c:\open_jtalk\bin\ にコピーしておきます.
meiという女の子?の4つの感情のデータです.
image.png

これで準備は完了です.

Open JTalk実行テスト

日本語を入力したファイルを input.txt として c:\open_jtalk\bin に作成したとして
,以下のコマンドを実行してください.

$ cd c:\open\jtalk\bin
$ open_jtalk -m mei_normal.htsvoice -x ../dic -ow output.wav input.txt

同じディレクトリにoutput.wavが作成されていれば成功です.それをダブルクリックで再生されるかどうか確認してみてください.この時点ではエンコードの影響で日本語だとうまくいかないかもしれません.実際に自分はうまくいかなかったです.

PythonからOpenJTalkを実行

WindowsでPythonからOpenJTalkを実行する際にはwinsound モジュールを利用します.また,今回のWindowsでのコンパイルでの辞書生成ではshift-jisとなっていましたので,python の内部エンコードからstdin に渡す際に encoding を変換する必要があります.

jtalk.py

#coding: utf-8
import subprocess
from datetime import datetime
import winsound

def jtalk(t):
    # depend on your install folder
    OPENJTALK_BINPATH = 'c:/open_jtalk/bin'
    OPENJTALK_DICPATH = 'c:/open_jtalk/dic'
    # VOICEPATH -> can change mei voice
    OPENJTALK_VOICEPATH = 'c:/open_jtalk/bin/mei_normal.htsvoice'
    open_jtalk=[OPENJTALK_BINPATH + '/open_jtalk.exe']
    mech=['-x',OPENJTALK_DICPATH]
    htsvoice=['-m',OPENJTALK_VOICEPATH]
    speed=['-r','1.0']
    outwav=['-ow','open_jtalk.wav']
    cmd=open_jtalk+mech+htsvoice+speed+outwav
    c = subprocess.Popen(cmd,stdin=subprocess.PIPE)

    # convert text encoding from utf-8 to shitf-jis
    c.stdin.write(t.encode('shift-jis'))
    c.stdin.close()
    c.wait()

    # play wav audio file with winsound module
    winsound.PlaySound('open_jtalk.wav', winsound.SND_FILENAME)


def say_datetime():
    # get datetime and call jtalk
    d = datetime.now()
    text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second)
    jtalk(text)

if __name__ == '__main__':
    say_datetime()

これを任意のディレクトリに配置してPython jtalk.pyで起動します.起動方法はもちろん自由です.日付と時間をパソコンが喋ってくれたら成功です.

Pythonモジュールとして利用する

同じディレクトリ(ここももちろん自由)から上記ファイル(jtalk.pyのjtalk)を呼び出します.また引数は喋らせたい文字なのでそれを指定します.u''は,エンコードも指定です.

test.py
import jtalk
jtalk.jtalk(u'これでおしまい')

以上です.
長くなってしまいましたがありがとうございました!

参考にさせていただいたサイト

https://qiita.com/Gaccho/items/f748f59784ff68d7a474
https://qiita.com/kkoba84/items/b828229c374a249965a9

8
10
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?