次の DEMO を見に行く
IT

Pythonを使用してDiscordで送ったメッセージをAnkiに自動で追加 Google Cloud APIを使用して音声も追加 Text-to-Speech API

Dori

今回は、Discordのチャンネルにメッセージを送ったらAnkiのデッキに自動で送ったメッセージが追加されるプログラミングを書いてみました。

構成

  1. Discordにユーザーが自分でメッセージを送る
  2. botがそのメッセージを読む
  3. 英語だったらGoogle CloudのAPIを使用して音声を取得
  4. デッキに追加

サンプルコード

import os
import re
import base64
from google.cloud import texttospeech

intents = discord.Intents.all()

bot = commands.Bot(command_prefix='!', intents=intents)

# Google CloudのAPIキーのパスを設定
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'path/to/your/google-cloud-api-key.json'

# Google Text-to-Speechのクライアントを初期化
tts_client = texttospeech.TextToSpeechClient()

# テキストから音声を生成し、base64形式でエンコードする関数
def synthesize_text_to_base64(text):
    input_text = texttospeech.SynthesisInput(text=text)
    voice = texttospeech.VoiceSelectionParams(
        language_code="en-US", ssml_gender=texttospeech.SsmlVoiceGender.FEMALE
    )
    audio_config = texttospeech.AudioConfig(
        audio_encoding=texttospeech.AudioEncoding.MP3
    )

    response = tts_client.synthesize_speech(
        input=input_text, voice=voice, audio_config=audio_config
    )

    audio_base64 = base64.b64encode(response.audio_content).decode("utf-8")
    return audio_base64

# Ankiにカードを追加する関数(音声の追加を含む)
def add_card_with_audio(front, back, audio_base64, deck):
    note = {
        "modelName": "Basic",
        "fields": {
            "Front": front,
            "Back": f"{back}<br><br>[sound:audio.mp3]",
            "MyMedia": audio_base64
        },
        "tags": ["discord"],
        "deckName": deck
    }
    payload = {
        "action": "addNote",
        "version": 6,
        "params": {
            "note": note
        }
    }
    response = requests.post(anki_connect_url, json=payload)
    return response.json()

# 英語のメッセージかどうかを判断する関数
def is_english(text):
    if re.match("^[A-Za-z]*$", text):
        return True
    return False

# 指定されたチャンネルでメッセージが送信されたときのイベント
@bot.event
async def on_message(message):
    # ボットのメッセージは無視
    if message.author == bot.user:
        return
# 指定されたチャンネルでのみメッセージを監視
    if message.channel.id == channel_id:
        front = message.content
        back = f"From: {message.author.name}#{message.author.discriminator}\n\nDate: {message.created_at}"

        # メッセージが英語である場合、音声を取得してカードに追加
        if is_english(front):
            audio_base64 = synthesize_text_to_base64(front)
            add_card_with_audio(front, back, audio_base64, deck_name)
        else:
            add_card(front, back, deck_name)

    await bot.process_commands(message)

bot.run(bot_token)

Google Cloud APIキー取得手順

  1. Google Cloud Consoleにアクセスし、ログインまたはアカウントを作成します。
  2. プロジェクトを作成または選択します。
  3. Text-to-Speech APIのページに移動し、「有効にする」をクリックします。
  4. ダッシュボードの画面左上にあるナビゲーションメニュー(ハンバーガーアイコン)をクリックし、「APIとサービス」>「認証情報」を選択します。
  5. 「認証情報を作成」ボタンをクリックし、「APIキー」を選択します。新しいAPIキーが生成されます。
  6. 生成されたAPIキーをコピーして、Pythonコードで利用するための環境変数にセットします。

Google CloudのText-to-Speech APIは使用料金がかかります。無料枠のクレジットも用意されていますが、詳しくは公式ホームページで確認してください。

さいごに

Ankiって語学学習には最高のアプリだけどアプリ開いて単語追加するの面倒ですよね。音声も入れた方が絶対覚えやすいので今回は音声も自動で入れるようなコードにしてみたので参考にしてみてください。

筆者はプログラミングど素人なので無料で音声追加できるアイディアやコードのリファクタリングとかあったらコメントで教えてくれると喜びます。

Follow me!

ABOUT ME
Dori
Dori
アメリカ在住。 趣味のNBA観戦、Magic The Gathering、プログラミング、読書、英語学習やアメリカの生活について雑多な記事をブログで綴っています。
PAGE TOP
記事URLをコピーしました