簡単なコードでtext2speakとQRcode2speakを自作してみたので、記事にしようと思う。
もちろん、いろいろ出ているサービスにはかなわないが、大体の音声は再現できるし、一定レベルで音声再生できたと評価できる。
【参考】
・【おしゃべる】ファイルに記載のかなを音声に変換する♬
###text2speakのコード説明
ベースは先日のpykakasi+pyaudioで以下のとおり、実現できる。
利用するLibは以下のとおり、シンプルです。
import pyaudio
import wave
from pykakasi import kakasi
以下のコードも前回Pykakasiで説明して通りのコードです。
工夫点は、一度ひらがなに変換してリスト化し、その後ローマ字に変換する流れで、リスト化されているので、一個ずつ変換する部分です。
def text2speak(num0):
RATE=44100
CHUNK = 22050
p=pyaudio.PyAudio()
kakasi_ = kakasi()
sentence=num0
kakasi_.setMode('J', 'H') # J(Kanji) to H(Hiragana)
kakasi_.setMode('H', 'H') # H(Hiragana) to None(noconversion)
kakasi_.setMode('K', 'H') # K(Katakana) to a(Hiragana)
conv = kakasi_.getConverter()
print(sentence)
print(conv.do(sentence))
char_list = list(conv.do(sentence))
print(char_list)
kakasi_.setMode('H', 'a') # H(Hiragana) to a(roman)
conv = kakasi_.getConverter()
sentences=[]
for i in range(len(char_list)):
sent= conv.do(char_list[i])
sentences.append(sent)
print(sentences)
f_list=[]
f_list=sentences
以下で音声に変換しています。
ここでrateを少し大きくして、音声を高めに設定しています。
あらかじめ一音ずつ録音した音声をf_listの順に呼び出しています。
stream=p.open(format = pyaudio.paInt16,
channels = 1,
rate = int(RATE*1.8),
frames_per_buffer = CHUNK,
input = True,
output = True) # inputとoutputを同時にTrueにする
w = wave.Wave_write("./pyaudio/ohayo005_sin.wav")
p = (1, 2, RATE, CHUNK, 'NONE', 'not compressed')
w.setparams(p)
for i in f_list:
wavfile = './pyaudio/aiueo/'+i+'.wav'
print(wavfile)
wr = wave.open(wavfile, "rb")
input = wr.readframes(wr.getnframes())
output = stream.write(input)
w.writeframes(input)
以下のコードでしゃべりたい文章を標準入力から入力します。
その文章をtext2speak()関数に渡して発生しています。
while True:
line = input("> ")
if not line:
break
text2speak(line)
print(line)
###text2speakの実行例
実際動かしてみると以下のようになります。
通常の文章はそのまま再現してくれます。
ただし、やはり一音ずつ録音したので、イントネーションは少し難があります。
>python text2speak.py
> ごきげんよう
ごきげんよう
ごきげんよう
['ご', 'き', 'げ', 'ん', 'よ', 'う']
['go', 'ki', 'ge', 'n', 'yo', 'u']
./pyaudio/aiueo/go.wav
./pyaudio/aiueo/ki.wav
./pyaudio/aiueo/ge.wav
./pyaudio/aiueo/n.wav
./pyaudio/aiueo/yo.wav
./pyaudio/aiueo/u.wav
ごきげんよう
> おはようございますウワンさん
おはようございますウワンさん
おはようございますうわんさん
['お', 'は', 'よ', 'う', 'ご', 'ざ', 'い', 'ま', 'す', 'う', 'わ', 'ん', 'さ', 'ん']
['o', 'ha', 'yo', 'u', 'go', 'za', 'i', 'ma', 'su', 'u', 'wa', 'n', 'sa', 'n']
./pyaudio/aiueo/o.wav
./pyaudio/aiueo/ha.wav
./pyaudio/aiueo/yo.wav
./pyaudio/aiueo/u.wav
./pyaudio/aiueo/go.wav
./pyaudio/aiueo/za.wav
./pyaudio/aiueo/i.wav
./pyaudio/aiueo/ma.wav
./pyaudio/aiueo/su.wav
./pyaudio/aiueo/u.wav
./pyaudio/aiueo/wa.wav
./pyaudio/aiueo/n.wav
./pyaudio/aiueo/sa.wav
./pyaudio/aiueo/n.wav
おはようございますウワンさん
漢字かな交じり文も以下のとおり、問題なく再生できます。
> お疲れ様ウワンさん
お疲れ様ウワンさん
おつかれさまうわんさん
['お', 'つ', 'か', 'れ', 'さ', 'ま', 'う', 'わ', 'ん', 'さ', 'ん']
['o', 'tsu', 'ka', 're', 'sa', 'ma', 'u', 'wa', 'n', 'sa', 'n']
./pyaudio/aiueo/o.wav
./pyaudio/aiueo/tsu.wav
./pyaudio/aiueo/ka.wav
./pyaudio/aiueo/re.wav
./pyaudio/aiueo/sa.wav
./pyaudio/aiueo/ma.wav
./pyaudio/aiueo/u.wav
./pyaudio/aiueo/wa.wav
./pyaudio/aiueo/n.wav
./pyaudio/aiueo/sa.wav
./pyaudio/aiueo/n.wav
お疲れ様ウワンさん
###QRcode2speakのコード説明
コード全体は以下に置きました。
・something2speak/QR2speak.py
QRコードは以下で作成します
・something2speak/QR_make.py
コードはほとんどが、前回の「【QRコード入門】作成・読込からリアルタイムカメラ取得QRコードのDCGAN画像変換で遊んでみた♪」と全く同一です。
唯一異なるのは、上記のtext2speakを呼び出している部分だけです。
肝心なコードだけ残すと以下のとおりです。
if __name__ == "__main__":
capture = cv2.VideoCapture(1)
...
ret, frame = capture.read()
while True:
...
if ret == False:
continue
...
# 加工した画像からフレームQRコードを取得してデコードする
codes = decode(image)
if len(codes) > 0:
input=codes[0][0].decode('utf-8', 'ignore')
num0=input
# コード内容を出力
print(num0)
img_pil = Image.fromarray(frame)
...
img = np.array(img_pil) # PIL を配列に変換
## 表示
text2speak(num0) #これを追加
cv2.imshow("res", img)
cv2.imwrite("res.png", img)
if cv2.waitKey(1) >= 0:
break
ret, frame = capture.read()
###QRcorde2speakの実行例
以下のようなQRコードをカメラ入力します。
内容は、以下の読取結果のとおりです。
>python QR2speak.py
最近コオドを使って決済するのがはやりなので遅まきながらコオドで遊んでみました
最近コオドを使って決済するのがはやりなので遅まきながらコオドで遊んでみました
さいきんこおどをつかってけっさいするのがはやりなのでおそまきながらこおどであそんでみました
['さ', 'い', 'き', 'ん', 'こ', 'お', 'ど', 'を', 'つ', 'か', 'っ', 'て', 'け', 'っ', 'さ', 'い', 'す', 'る', 'の', 'が', 'は', 'や', 'り', 'な', 'の', 'で', 'お', 'そ', 'ま', 'き', 'な', 'が', 'ら', 'こ', 'お', 'ど', 'で', 'あ', 'そ', 'ん', 'で', 'み', 'ま', 'し', 'た']
['sa', 'i', 'ki', 'n', 'ko', 'o', 'do', 'wo', 'tsu', 'ka', 'tsu', 'te', 'ke', 'tsu', 'sa', 'i', 'su', 'ru', 'no', 'ga', 'ha', 'ya', 'ri', 'na', 'no', 'de', 'o', 'so', 'ma', 'ki', 'na', 'ga', 'ra', 'ko', 'o', 'do', 'de', 'a', 'so', 'n', 'de', 'mi', 'ma', 'shi', 'ta']
./pyaudio/aiueo/sa.wav
./pyaudio/aiueo/i.wav
./pyaudio/aiueo/ki.wav
./pyaudio/aiueo/n.wav
./pyaudio/aiueo/ko.wav
./pyaudio/aiueo/o.wav
./pyaudio/aiueo/do.wav
./pyaudio/aiueo/wo.wav
./pyaudio/aiueo/tsu.wav
./pyaudio/aiueo/ka.wav
./pyaudio/aiueo/tsu.wav
./pyaudio/aiueo/te.wav
./pyaudio/aiueo/ke.wav
./pyaudio/aiueo/tsu.wav
./pyaudio/aiueo/sa.wav
./pyaudio/aiueo/i.wav
./pyaudio/aiueo/su.wav
./pyaudio/aiueo/ru.wav
./pyaudio/aiueo/no.wav
./pyaudio/aiueo/ga.wav
./pyaudio/aiueo/ha.wav
./pyaudio/aiueo/ya.wav
./pyaudio/aiueo/ri.wav
./pyaudio/aiueo/na.wav
./pyaudio/aiueo/no.wav
./pyaudio/aiueo/de.wav
./pyaudio/aiueo/o.wav
./pyaudio/aiueo/so.wav
./pyaudio/aiueo/ma.wav
./pyaudio/aiueo/ki.wav
./pyaudio/aiueo/na.wav
./pyaudio/aiueo/ga.wav
./pyaudio/aiueo/ra.wav
./pyaudio/aiueo/ko.wav
./pyaudio/aiueo/o.wav
./pyaudio/aiueo/do.wav
./pyaudio/aiueo/de.wav
./pyaudio/aiueo/a.wav
./pyaudio/aiueo/so.wav
./pyaudio/aiueo/n.wav
./pyaudio/aiueo/de.wav
./pyaudio/aiueo/mi.wav
./pyaudio/aiueo/ma.wav
./pyaudio/aiueo/shi.wav
./pyaudio/aiueo/ta.wav
###評価
簡単ですが、以下のような評価ができると思います。
結果を見るとわかると思いますが、今回の単純な方式だと
①「コード」を表現できないので、「コオド」としています
②「ぎゃぎゅぎょ...」のような表現ができません。「ぎ、や、ぎ、ゆ、ぎ、よ、。。。」のように読み取られてしまう
③句読点は特に判断していないので、読み取れません。。。。
④一番改善したいのはイントネーションです
ということでまだまだ改善の余地があります。
###まとめ
・text2speakを自作してみた
・QRcode2speakを自作してみた
・一応、音声の出力ができた
・評価に記載した改善点は改善しようと思う
・入力に対する返答という形で、会話形式を実現しようと思う