理系のブログ

京大生がJARVISを作るまでの話(3)「喋れるようにする」

理系のブログ
理系のシモン
理系のシモン

前回では音声認識が可能なオウム返しbotを作りました。

今回はオウム返しbotを喋れるようにしてみたいと思います。

前回の記事はこちらを御覧ください。

open-jtalk

音声の合成にはopen-Jtalkというツールを使います。

macの場合はターミナルで「brew install open-jtalk」と打つだけで大丈夫なのですが、windowsの場合はビルドが必要なので次のページを参考にしながらビルドしていきます。

各ファイルの場所は次のようにしておきました。

c:/open_jtalk
└ bin/
├ dic/
├ input.txt
├ mei_normal.htsvoice
├ open_jtalk.exe
├ output.wav(後で勝手に生成されます。)
└ play.exe

input.txtには好きな言葉をShift-jisで書き込んでおきます。

次のコマンドを実行したあと、output.wavを再生して音声が流れれば成功です。

C:\open_jtalk\bin\open_jtalk.exe -m C:\open_jtalk\bin\mei_normal.htsvoice -x C:\open_jtalk\bin\dic -ow C:\open_jtalk\bin\output.wav C:\open_jtalk\bin\input.txt

pythonに組み込む

speaker.py

まずは音声を合成するモジュールを作ります。今回はspeaker.pyとしてみました。

import subprocess
import winsound

def jtalk(text):
    jtalkfile="c:/open_jtalk/bin/open_jtalk.exe"
    dictionary=" -x c:/open_jtalk/bin/dic"
    voice=" -m c:/open_jtalk/bin/mei_normal.htsvoice"
    outfile=" -r 1.0 -ow c:/open_jtalk/bin/output.wav.wav"
    cmd=jtalkfile+dictionary+voice+outfile
    c = subprocess.Popen(cmd,stdin=subprocess.PIPE)

    # 引数のtextをutf-8からshitf-jisへ変換
    c.stdin.write(text.encode('shift-jis'))
    c.stdin.close()
    c.wait()

    #winsoundで音声を再生
    winsound.PlaySound('c:/open_jtalk/bin/output.wav.wav', winsound.SND_FILENAME)

repeat.py

本体のrepeat.pyは次のようにしておきました。

import voicein
import speaker

text=voicein.voicein()

speaker.jtalk(text)

print("こんにちは")

動作確認

実行してみると次のようになりました。

きちんと動作しましたね。

AIっぽい音声にしたい

再生された音声は次のような感じです。

このままでは面白みのない声なので、音声をAIっぽくしてみたいと思います。

次のプログラムをspeaker.pyに組み込みます。

    # 音声の加工
    rate, data = read("c:/open_jtalk/bin/output.wav")
    level = 0.0001
    out = [0.0]*len(data)
    frame = 1800
    repeat = 1

    for i in range(len(data)):
        # y(i)を適宜計算
        out[i]=data[i]
        d = 0
        for j in range(repeat + 1):
            index = int(i - frame * j)  # delay元となるindexを計算
            if index >= 0:
                out[i] += data[index]
     

このプログラムでは「scipy」と「numpy」を使うのでコマンドプロンプトで次のコマンドを実行してインストールします。

pip install numpy
pip install scipy

組み込んだあとのspeaker.pyは次のような感じになります。

はじめの「import numpy as np」と「from scipy.io.wavfile import read, write」も忘れねいように書きます。

import subprocess
import winsound
import numpy as np
from scipy.io.wavfile import read, write


def jtalk(text):
    jtalkfile = "c:/open_jtalk/bin/open_jtalk.exe"
    dictionary = " -x c:/open_jtalk/bin/dic"
    voice = " -m c:/open_jtalk/bin/mei_normal.htsvoice"
    outfile = " -r 1.0 -ow c:/open_jtalk/bin/output.wav"
    cmd = jtalkfile + dictionary + voice + outfile
    c = subprocess.Popen(cmd, stdin=subprocess.PIPE)

    # 引数のtextをutf-8からshitf-jisへ変換
    c.stdin.write(text.encode('shift-jis'))
    c.stdin.close()
    c.wait()

    # 音声の加工
    rate, data = read("c:/open_jtalk/bin/output.wav")
    level = 0.0001
    out = [0.0]*len(data)
    frame = 1800
    repeat = 1

    for i in range(len(data)):
        # y(i)を適宜計算
        out[i]=data[i]
        d = 0
        for j in range(repeat + 1):
            index = int(i - frame * j)  # delay元となるindexを計算
            if index >= 0:
                out[i] += data[index]


    write('c:/open_jtalk/bin/output.wav',rate,np.array(out))



    # winsoundで音声を再生
    winsound.PlaySound('c:/open_jtalk/bin/output.wav', winsound.SND_FILENAME)

この状態でrepeat.pyを実行すると…

このようにAIっぽい声が流れました!!

この記事の執筆者
理系さん

理系の現役京大生。
受験での失敗と成功の経験を生かした理系記事でブログ毎日更新中!Twitterもやっていますのでよかったらフォローよろしくお願いします。

理系のシモンをフォローする
スポンサーリンク
シェアお願いします
理系の地下室

コメント

タイトルとURLをコピーしました