PythonMania

普段はロボットとAIを組み合わせて色々作ってます。Python関係以外も色々投稿していくと思います。

GoogleのSpeech APIを使って音声を文字起こししてみる

f:id:mizuhiki0111:20190430175903p:plain




GoogleのSpeach APIを使えば 音声のテキスト変換が簡単にできるみたいだったので試してみました。


音声データ(mp3)を引数で指定して実行するとテキストファイルを生成することができるようにしてあります。



これを使えば会議の内容を録音→議事録作成なんかが効率よくできそうですね!







以下コードになります
(コードを実行するためには、あらかじめGoogle Speach APIの有効化・API Keyの取得まで済ませておく必要があります)


コマンドライン引数「--sound」で音声ファイル指定で実行できると思います。


import requests
import json
from pydub import AudioSegment
import base64
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--sound")
#parser.add_argument("--dir")
args = parser.parse_args()
bassdir = "/"
str_api_key = "API Keyを指定"
sound = AudioSegment.from_mp3(args.sound)
sound.export(bassdir + "result.wav", format="wav")
sound = AudioSegment.from_wav(bassdir + "result.wav")
sound = sound.set_channels(1)
sound.export(bassdir + "result.wav", format="wav")
speech_file = bassdir + "result.wav"
def stt():
    str_url = "https://speech.googleapis.com/v1/speech:recognize?key="
    str_headers = {'Content-Type': 'application/json; charset=utf-8'}
    url = str_url + str_api_key
    with open(speech_file, 'rb') as speech:
        speech_content = base64.b64encode(speech.read())
    str_json_data = {
          "config": {
          "encoding": "LINEAR16",
          "sampleRateHertz": 44100,
          "languageCode": "ja-JP",
          "enableWordTimeOffsets": False
          },
          "audio": {
          'content': speech_content.decode('UTF-8')
           }
         }
    with open(args.dir + "result.json", 'w') as f:
        json.dump(str_json_data, f)
    jd = json.dumps(str_json_data)
    print("begin request")
    s = requests.Session()
    r = requests.post(url, data=jd, headers=str_headers)
    print("status code : ", r.status_code)
    print("end request")
    if r.status_code == 200:
        parsed = json.loads(r.text)
        sst_result = parsed["results"][0]["alternatives"][0]["transcript"]
        sst_result = sst_result
        return sst_result
    else:
        return "error"
if __name__ == "__main__":
    result = stt()
    with open(bassdir + "/result.txt", mode='w') as f:
      f.write(str(result))