linebotへ送信
実行環境
M1 MacbookAir 16GB
Ollamaで修正されたテキストをLINE botに送信するため
既存のLINE Notifyの処理と合わせて、修正された文章をLINE botに送信する処理を実装
LINE botにメッセージを送信するには、LINE Messaging APIを利用する
LINE botにメッセージを送信するためのモジュールを作る
touch line_bot_sender.py
中身は
# line_bot_sender.py import requests import json class LineBotSender: def __init__(self, config_file_path): self.config = self._load_config(config_file_path) self.channel_access_token = self.config["line_bot_channel_access_token"] self.user_id = self.config["line_bot_user_id"] def _load_config(self, config_file_path): with open(config_file_path, 'r') as file: return json.load(file) def send_message(self, message): url = "https://api.line.me/v2/bot/message/push" headers = { "Content-Type": "application/json", "Authorization": f"Bearer {self.channel_access_token}" } payload = { "to": self.user_id, "messages": [ { "type": "text", "text": message } ] } response = requests.post(url, headers=headers, json=payload) if response.status_code != 200: raise Exception(f"Error sending message to LINE bot: {response.status_code}, {response.text}")
として保存
config.json にLINE botの情報を追加 { "line_notify_token": "YOUR_LINE_NOTIFY_TOKEN", "ollama_model": "elyza:jp8b", "line_bot_channel_access_token": "YOUR_LINE_BOT_CHANNEL_ACCESS_TOKEN", "line_bot_user_id": "TARGET_USER_ID" }
linebot useridがわからなかったため検索
を参考に
LINE Developersコンソール
で
基本情報のプロバイダーIDを入れてみる
次にOllamaで修正されたテキストをLINE botに送信するために、メインスクリプトにLineBotSenderを組み込む
import sounddevice as sd from module.module_whisper import FasterWhisperModel from module.module_recorder import Recorder import time from line_notify import LineNotify # 作成したLineNotifyモジュールをインポート from ollama_text_correction import OllamaTextCorrector # Ollamaによる修正モジュールをインポート def main(): recorder = Recorder() fasterWhispermodel = FasterWhisperModel() # 入力された音声テキストを格納するリスト recognized_texts = [] # LINE Notifyのモジュールを初期化(config.jsonからトークンを読み込む) line_notify = LineNotify("config.json") # Ollamaのテキスト修正モジュールを初期化 text_corrector = OllamaTextCorrector("config.json") while True: start_time = time.time() # 処理開始時刻を記録 audio_data = recorder.speech2audio() # 処理が10秒間行われなかった場合はループを抜ける if time.time() - start_time >= 10: print("10秒間音声が入力されなかったため、ループを終了します。") break if audio_data is None: print("無音状態が続いたため、ループを終了します。") break # 無音でループを抜ける # 音声をテキストに変換 text = fasterWhispermodel.audio2text(audio_data) # Ollamaでテキストを構成 corrected_text = text_corrector.correct_text(text) if corrected_text: # Noneが返された場合はスキップ recognized_texts.append(corrected_text) print(corrected_text) # ループ終了後に、入力した音声テキストを改行付きで一覧表示 if recognized_texts: message = "\n".join(recognized_texts) print("\n入力された音声テキスト一覧:") print(message) # LINE Notifyでメッセージを送信 line_notify.send(f"入力された音声テキスト一覧:\n{message}") else: print("入力メッセージはありませんでした") if __name__ == "__main__": main()
を書き換えるとプロンプト対処があとで困るので
これをコピーし main2.pyとしてコードを記述
import sounddevice as sd from module.module_whisper import FasterWhisperModel from module.module_recorder import Recorder import time from line_notify import LineNotify # 作成したLineNotifyモジュールをインポート from ollama_text_correction import OllamaTextCorrector # Ollamaによる修正モジュールをインポート from line_bot_sender import LineBotSender # LINE bot送信用のモジュールをインポート def main(): recorder = Recorder() fasterWhispermodel = FasterWhisperModel() # 入力された音声テキストを格納するリスト recognized_texts = [] # LINE Notifyのモジュールを初期化(config.jsonからトークンを読み込む) line_notify = LineNotify("config.json") # Ollamaのテキスト修正モジュールを初期化 text_corrector = OllamaTextCorrector("config.json") # LINE bot送信用のモジュールを初期化 line_bot_sender = LineBotSender("config.json") while True: start_time = time.time() # 処理開始時刻を記録 audio_data = recorder.speech2audio() # 処理が10秒間行われなかった場合はループを抜ける if time.time() - start_time >= 10: print("10秒間音声が入力されなかったため、ループを終了します。") break if audio_data is None: print("無音状態が続いたため、ループを終了します。") break # 無音でループを抜ける # 音声をテキストに変換 text = fasterWhispermodel.audio2text(audio_data) # Ollamaでテキストを構成 corrected_text = text_corrector.correct_text(text) if corrected_text: # Noneが返された場合はスキップ recognized_texts.append(corrected_text) print(corrected_text) # ループ終了後に、入力した音声テキストを改行付きで一覧表示 if recognized_texts: message = "\n".join(recognized_texts) print("\n入力された音声テキスト一覧:") print(message) # LINE Notifyでメッセージを送信 line_notify.send(f"入力された音声テキスト一覧:\n{message}") # LINE botで修正されたテキストを送信 line_bot_sender.send_message(f"修正された音声テキスト:\n{message}") else: print("入力メッセージはありませんでした") if __name__ == "__main__": main()
これで実行したら
入力された音声テキスト一覧: 本日の天候 Traceback (most recent call last): File "/Users/snowpool/aw10s/linebot/main2.py", line 63, in <module> main() File "/Users/snowpool/aw10s/linebot/main2.py", line 58, in main line_bot_sender.send_message(f"修正された音声テキスト:\n{message}") File "/Users/snowpool/aw10s/linebot/line_bot_sender.py", line 32, in send_message raise Exception(f"Error sending message to LINE bot: {response.status_code}, {response.text}") Exception: Error sending message to LINE bot: 400, {"message":"The property, 'to', in the request body is invalid (line: -, column: -)"}
となった
config.jsonに "channel_secret": "YOUR_CHANNEL_SECRET",
を追加する
次に
line_bot_sender.pyを修正する
line_bot_sender.py ファイルで、
send_message メソッド内のリクエストボディに ‘to’ フィールドを追加し、
config.jsonから読み込んだ user_id を設定
def send_message(self, message): url = "https://api.line.me/v2/bot/message/push" headers = { "Content-Type": "application/json", "Authorization": f"Bearer {self.channel_access_token}" } payload = { "to": self.user_id, "messages": [ { "type": "text", "text": message } ] } response = requests.post(url, headers=headers, json=payload) if response.status_code != 200: raise Exception(f"Error sending message to LINE bot: {response.status_code}, {response.text}")
を
def send_message(self, message): headers = { 'Content-Type': 'application/json', 'Authorization': f'Bearer {self.channel_access_token}' } data = { "to": self.user_id, # 追加 "messages": [ { "type": "text", "text": message } ] } response = requests.post(self.api_endpoint, headers=headers, json=data) if response.status_code != 200: raise Exception(f"Error sending message to LINE bot: {response.status_code}, {response.text}")
に変更
line_bot_sender.py のクラス内で user_id を読み込むように変更
# line_bot_sender.py import requests import json class LineBotSender: def __init__(self, config_path): with open(config_path, 'r') as file: config = json.load(file) self.channel_access_token = config.get('channel_access_token') self.channel_secret = config.get('channel_secret') self.user_id = config.get('user_id') # 追加 self.api_endpoint = 'https://api.line.me/v2/bot/message/push' # push APIを使用 def _load_config(self, config_file_path): with open(config_file_path, 'r') as file: return json.load(file) def send_message(self, message): headers = { 'Content-Type': 'application/json', 'Authorization': f'Bearer {self.channel_access_token}' } data = { "to": self.user_id, # 追加 "messages": [ { "type": "text", "text": message } ] } response = requests.post(self.api_endpoint, headers=headers, json=data) if response.status_code != 200: raise Exception(f"Error sending message to LINE bot: {response.status_code}, {response.text}")
というようにした
これだけだとまだwebhook設定ができていないのでエラーになる