2018年9月5日水曜日

Pythonでしゃべっているときだけ録音する

VOICEROIDをプログラムに組み込めるようになったわけだし何か作ってみよう!

VOICEROIDをプログラムで動かせる方法を手に入れたわけだけど、どういうときに使うのがいいんだろうか...

しゃべることが決まっているなら、wavファイルにして、再生した方がいいです。
考えてみたところこんなことろかなぁと
1.人が出力する文章
2.自動で生成される文章

1だと、ゆかりねっととか、ブログやネット上の記事をスクレイピングとかでしょうか。
2だと、マルコフ連鎖とか、LSTMとか?

というわけで、まずは前例に倣って「音声認識して、VOICEROIDにしゃべらせる」を目指していこうかと。

流れ的には、録音→解析→VOICEROIDに投げる、の流れですね。

今回は録音できるようにソースコードを書いてみます。

Pythonで音を監視して一定以上の音量を録音する-Qiita

こちらの記事を参考に、
・一定音量を超えたら録音する
・録音状態で一定の音量を下回った時間が1秒を超えたら録音を終了する
を実現できるように少しだけ改良します。


import pyaudio
import wave
import numpy as np

threshold = 0.03
thresholdmin = 0.02
chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
blank = 1
p = pyaudio.PyAudio()

stream = p.open(format = FORMAT,                            #(1)
    channels = CHANNELS,
    rate = RATE,
    input = True,
    frames_per_buffer = chunk
    )

sound=[]
while True:
    data = stream.read(chunk)                                      #(2)
    x = np.frombuffer(data, dtype="int16") / 32768.0
    if x.max() > threshold:                                            #(3)
        rec = 0
        filename = "test.wav"
        sound=[]
        sound.append(data)
        while rec < int(blank * RATE / chunk):
            data = stream.read(chunk)
           
            sound.append(data)
            x = np.frombuffer(data, dtype="int16") / 32768.0
            if x.max() < thresholdmin:                               #(4)
                rec += 1
            else:
                rec = 0
           
        data = b''.join(sound)
       
        out = wave.open(filename,'w')                              #(5)
        out.setnchannels(CHANNELS)
        out.setsampwidth(2)
        out.setframerate(RATE)
        out.writeframes(data)
        out.close()
       
        break

stream.close()
p.terminate()




こんな感じですね。
処理的には
(1)pyaudio.PyAudioのインスタンスstreamを生成
(2)streamのデータを手に入れる
(3)音量を調べて、threshold以上の音量ならばstreamのデータをsoundリストに保存
(4)thresholdmini以下の音量ならばカウントを初めて、1秒超えたらループから抜けるように
(5)wavファイルに保存

と、こんな感じでしょう。
(4)が少し変更した部分ですね。動かしてみて、マイクに話しかけるとtest.wavという音声ファイルができているはずです。

今回はここまでにしましょう。
次は、wavファイルを解析して、日本語にする感じですかね。



実は、「音声認識して、VOICEROIDにしゃべらせる」という、部分はもうずいぶん前にコードを書いて、すでに魔改造まで終わっちゃっているんですよね。
備忘録気分で始めたブログなので、最近やっていることも書きたいのに、たまりにたまったアウトプットしていないソースコードたちががが...

0 件のコメント:

コメントを投稿