
前回では音声認識が可能なオウム返し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っぽい声が流れました!!
コメント