LoginSignup
37
52

More than 3 years have passed since last update.

[初心者向け]Pythonで音声認識をしてLineに通知!

Last updated at Posted at 2020-10-21

はじめに

Googleのspeech-to-text APIとLine Notifyを最近使い始めたのですが、案外簡単に扱えると感じたので、
今回はこの2つの技術を使ったボットの作り方を説明します!

今回つくるもの

image0.png
状況が、上記画像のような状況で人が話した内容が文字列となって、それをLine Notifyを使ってLINEに出力するというものを開発します。

実際に動いている動画。

準備

LINE Notifyからアクセストークンを取得する

  1. LINE Notifyのサイトにアクセス。 https://notify-bot.line.me/ja
  2. LINEで登録しているメールアドレスとパスワードを入力してログインする image.png
  3. トップページからバーを探して、自分の名前をクリックしマイページをクリック。 image.png

 
4. トークンを発行するをクリックし、次にトークン名の入力とトークルームを選択する。
image.png
5. 英数字の赤文字で表示されたものがアクセストークンになる。これをコピーする。

必要なパッケージのダウンロード

  1. ターミナルを開いて、下記のコマンドを実行 1回目

pip3 install SpeechRecognition requests python-dotenv numpy
2. コマンド実行 2回目

macの場合

pip3 install PyAudio

ubuntu or debian or Raspberry Piの場合


sudo apt -y upgrade && sudo apt -y update
sudo apt install python3-pyaudio

実装

LINEに通知を行う機能の作成

line_notice.py
import requests

# Lineにメッセージを送信する関数 送信したい文字列を引数に定義
def send(send_message):
    line_notify_token = 先程作ったアクセストークンをここで指定
    line_notify_api = 'https://notify-api.line.me/api/notify'

    # トークン情報をヘッダーに載せる
    headers = {'Authorization': f'Bearer {line_notify_token}'}

    data = {'message': send_message}
    # 送信
    requests.post(line_notify_api, headers = headers, data = data)


if __name__ == "__main__":
    text = "test"
    send(text)

モジュールテスト

下記のコマンドを実行して、正しく準備が出来ていたらtestという文字が通知される。
python3 line_notice.py
Screenshot_2020-10-22 image0 png (JPEG 画像, 750x120 px).png

音声の録音と音声認識を行う機能の作成

voice.py
import speech_recognition as sr
import numpy as np
import pyaudio
import wave


class voiceFunctionsClass:
    def __init__(self):
        self.CHUNK = 1024
        self.FORMAT = pyaudio.paInt16
        self.CHANNELS = 1
        self.RATE = 48000
        self.RECORD_SECONDS = 5
        self.WAVE_OUTPUT_FILENAME ="recorded.wav"

        self.p = pyaudio.PyAudio()

        self.stream = self.p.open(format=self.FORMAT,
                        channels=self.CHANNELS,
                        rate=self.RATE,
                        input=True,
                        frames_per_buffer=self.CHUNK)

    # 録音処理
    def voice_recode(self):
        print("<<<録音中>>>")

        frames = []
        calc = int(self.RATE / self.CHUNK * self.RECORD_SECONDS)
        for i in range(0, calc):
            data = self.stream.read(self.CHUNK)
            buf = np.frombuffer(data, dtype="int16")
            frames.append(b''.join(buf[::3]))

        print("<<<録音終了>>>")
        # 録音したものを保存
        self.voice_save(frames)


    # 録音保存処理
    def voice_save(self, frames):
        self.stream.stop_stream()
        self.stream.close()
        self.p.terminate()

        wf = wave.open(self.WAVE_OUTPUT_FILENAME, 'wb')
        wf.setnchannels(self.CHANNELS)
        wf.setsampwidth(self.p.get_sample_size(self.FORMAT))
        wf.setframerate(self.RATE / 3)
        wf.writeframes(b''.join(frames))
        wf.close()


    # 音声認識
    def voice_recognize(self):
        print("音声認識を開始します") 
        r = sr.Recognizer()
        with sr.AudioFile(self.WAVE_OUTPUT_FILENAME) as source:
            audio = r.record(source)
        result = r.recognize_google(audio, language='ja-JP')
        return result


if __name__ == "__main__":
    voice = voiceFunctionsClass()
    voice.voice_recode()
    print(f"音声認識結果: {voice.voice_recognize()}")

モジュールテスト

python3 voice.py
正常に動作していれば、録音され、録音終了後。話した内容が結果として出力される。

2つの機能を組み合わせたプログラム

main.py
import line_notice
import voice


voice_class = voice.voiceFunctionsClass()
voice_class.voice_recode()
voice_result = voice_class.voice_recognize()
line_notice.send(voice_result)

python3 main.py
を実行すると、音声が録音 -> 音声認識が実行 -> Lineに送信という流れで処理が行われるはずです!

github

今回作成したプログラムをGithubに上げました、こちらもぜひご活用ください!
https://github.com/taruscript/speech2Line

まとめ

今回は、2つの技術を使った活用例として作ってみましたが。気軽に割と簡単に作れて初心者にはかなりオススメかと思います!
なにかご不明な点がございましたら僕のTwitterに質問して頂ければ答えられる範囲でお答えしますー!https://twitter.com/taarusauce

37
52
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
52