プログラミングでAnkiにDsicordのチャンネルに送ったメッセージを自動で登録 意味と例文も自動取得・追加 Pythonスクリプト

Ankiとは

この記事を読んでいる方はAnkiを既に使用しているかもしれませんが、知らない方のために説明します。

Ankiは、記憶を効率的に維持・向上させるために設計された無料のスペースドリピティション(間隔反復)フラッシュカードアプリです。

以下はAnkiの特徴です。

1. スペースドリピティション: Ankiは、スペースドリピティションという学習方法を利用しています。これは、学習者が知識を長期記憶に定着させるために、効果的なタイミングで情報を復習するという方法です。Ankiは、復習のタイミングを自動的に調整し、それぞれの学習者にとって最適な反復間隔を提供します。

2. カスタマイズ: Ankiでは、フラッシュカードのデザインや内容を自由にカスタマイズできます。テキスト、画像、音声などを組み合わせて、学習者が理解しやすいカードを作成することができます。

3. 共有デッキ: Ankiのユーザーコミュニティでは、さまざまなトピックの共有デッキが提供されています。これにより、他の人が作成したデッキをダウンロードして学習することができます。また、自分で作成したデッキを他の人と共有することもできます。

4. 同期機能: Ankiは、クロスプラットフォーム対応であり、スマートフォン、タブレット、コンピュータ間でデッキと進捗状況を同期することができます。これにより、どのデバイスでも学習の続きをスムーズに行うことができます。

5. 無料: Ankiはオープンソースであり、基本的な機能は無料で利用できます。これにより、多くの人が低コストで高品質な学習ツールにアクセスできるようになっています。(スマホアプリ版は3000円ほど)

Ankiの効率的な学習方法やカスタマイズ機能、共有デッキなどにより、語学学習、専門知識、一般教養など幅広い分野で利用されています。これらの特徴が、Ankiを優れた学習ツールとして評価される理由です。

Pythonスクリプト作成経緯

Ankiって特に言語学習では最強のアプリなんですけど、単語を登録するのが地味に面倒なんですよね

ただ単語と意味だけなら良いですが、私は英語の意味と例文も登録しているので1単語あたり数分かかります。

ですので自動で単語を登録、追加してくれる仕組みを作ってみました。

プログラム構成

  1. ユーザーがDiscordの指定したチャンネルにメッセージを送る。
  2. Discordのbotが送信されたメッセージを取り出してhttps://dictionary.cambridge.org/us/で単語を検索して意味と例文を取得
  3. Ankiの前面にDiscordに送ったメッセージ、裏面には意味と例文が追加されます。

赤く単語をハイライトしているは自分でやりましたが、Discordで「spasmodic」という単語を送って自動追加された結果が以下になります。

今回はCambridge Dictionaryを意味や例文のソース元に指定していますが、勿論WEBサイトを変更すると日本語で取得したりもできます。

余談ですが、言語はその言語で勉強しないとニュアンスとかも掴めないので1対1の翻訳が可能な名詞(例えばリンゴなど)を除いては英語で意味を理解できるようになることをおすすめします。

事前準備

上記のコード実行の前に事前準備が必要です。

ライブラリのインストール

使用するライブラリをインストールしていない場合は事前にインストールしてください。

pip install beautifulsoup4

Discordのbot作成

  1. Discord Developer Portal (https://discord.com/developers/applications) にアクセスし、アカウントにログインします。
  2. 右上の[New Application]ボタンをクリックして新しいアプリケーションを作成します。名前を入力し、[Create]ボタンをクリックします。
  3. 左のメニューから[BOT]を選択し、画面右の[Add Bot]ボタンをクリックしてBotを作成します。
  4. 作成されたBotの[Token]セクションにある[Copy]ボタンをクリックして、Botのトークンをコピーしておきます。
  5. 上記のPythonコードで、TOKEN変数の値を、コピーしたBotのトークンに置き換えます。
  6. Discord Developer Portalで、作成したアプリケーションのページに戻ります。
  7. 左のメニューから[OAuth2]を選択します。
  8. [SCOPES]セクションで[bot]にチェックを入れます。その後、下に表示されるURLをコピーします。
  9. コピーしたURLにアクセスし、Botを追加したいDiscordサーバーを選択して[認証]ボタンをクリックします。

特に気にならない方は[OAuth2]ページでbotにAdmin権限を付与して[BOT]ページでも全て権限ONにすると間違いなく動くと思います。

もしサーバー追加のURLが出ない場合は以下の記事を参考にして設定してください。

開発モード有効

開発モードが有効でないとスクリプトに必要なチャンネルIDが取得できないのでONにしてください。

  1. Discordアプリを開きます。
  2. 左下の歯車アイコン「ユーザー設定」をクリックします。
  3. 左側のメニューから「詳細設定」または「Appearance」(外観)を選択します。
  4. 「開発者モード」のスイッチをオンにして、開発者モードを有効にします。

チャンネルID取得

  1. DiscordアプリまたはWebサイトにログインし、Botを追加したサーバーにアクセスします。
  2. チャンネルIDを取得したいチャンネルで、右クリック(または長押し)して[Copy ID]をクリックします。
  3. 上記のPythonコードで、CHANNEL_ID変数の値を、コピーしたチャンネルIDに置き換えます。

AnkiConnectのインストール

  1. Ankiを起動し、メニューから[Tools] > [Add-ons] > [Get Add-ons…]を選択します。
  2. AnkiConnectのコード2055492159を入力し、[OK]ボタンをクリックしてインストールします。
  3. Ankiを再起動して、AnkiConnectが正常にインストールされたことを確認します。

AnkiConnectについては以下の記事で詳しく読めます。

コード

*改訂版のコードが記事の下の方にあるのでそちらの方がより良いコードです。

import discord
import requests
from bs4 import BeautifulSoup
import json

from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

# DiscordのトークンとチャンネルIDを設定
TOKEN = '自分のbotのToken'
CHANNEL_ID = チャンネルID

intents = discord.Intents.all()

client = discord.Client(intents=intents)

def is_english_word(word):
    return word.isalpha()

def search_word(word):
    session = requests.Session()
    retries = Retry(total=5, backoff_factor=1, status_forcelist=[429, 500, 502, 503, 504])
    adapter = HTTPAdapter(max_retries=retries)
    session.mount('http://', adapter)
    session.mount('https://', adapter)

    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134"
    }

    url = f'https://dictionary.cambridge.org/us/dictionary/english/{word.lower()}'
    try:
        response = session.get(url, headers=headers, timeout=10)
        response.raise_for_status()
    except requests.exceptions.RequestException as e:
        print(f"Error occurred while searching for '{word}': {e}")
        return None, None

    soup = BeautifulSoup(response.text, 'html.parser')
    try:
        meaning = soup.find(class_='def-block ddef_block').find('div', class_='def ddef_d db').text.strip()
        example = soup.find(class_='def-block ddef_block').find('div', class_='examp dexamp').text.strip()
        return meaning, example
    except AttributeError:
        return None, None

def add_to_anki(deck_name, front, back):
    print(f'Adding to Anki: Front: {front}, Back: {back}')
    data = {
        "action": "addNote",
        "version": 6,
        "params": {
            "note": {
                "deckName": deck_name,
                "modelName": "Basic",
                "fields": {
                    "Front": front,
                    "Back": back
                },
                "tags": ["discord"]
            }
        }
    }
    response = requests.post('http://localhost:8765', json=data)
    print(response.text)


@client.event
async def on_ready():
    print(f'{client.user} has connected to Discord!')

deck_name = "追加したいAnkiのデッキ名"

@client.event
async def on_message(message):
    if message.channel.id != CHANNEL_ID or message.author == client.user:
        return

    word = message.content.strip()
    if is_english_word(word):
        meaning, example = search_word(word)
        if meaning and example:
            back = f"[meaning] : {meaning}<br><br>[example] : {example}"
        else:
            back = word
        add_to_anki(deck_name, word, back)


client.run(TOKEN)

置き換え箇所

TOKEN = '自分のbotのToken'

CHANNEL_ID = チャンネルID

deck_name = "追加したいAnkiのデッキ名"

上記は事前準備にも書いていますが、数値を置き換えしてください。

def add_to_anki(deck_name, front, back):
    print(f'Adding to Anki: Front: {front}, Back: {back}')
    data = {
        "action": "addNote",
        "version": 6,
        "params": {
            "note": {
                "deckName": deck_name,
                "modelName": "Basic",
                "fields": {
                    "Front": front,
                    "Back": back
                },
                "tags": ["discord"]
            }
        }
    }
    response = requests.post('http://localhost:8765', json=data)
    print(response.text)

上記のadd_to_anki関数も場合によっては置き換えが必要です。

"modelName": "Basic",
"Front": front,
"Back": back

モデル名とカードの表面と裏面の名前がfront, backになっているか確認してください。

ノートタイプの確認方法

  1. Ankiを開きます。
  2. メニューバーで「ツール」をクリックし、「ノートタイプの管理」を選択します。
  3. ここで、利用可能なすべてのノートタイプが表示されます。デフォルトでは、「Basic」が含まれていますが、他のノートタイプも表示される場合があります。

フィールド(Front, Back)の確認方法:

  1. Ankiを開きます。
  2. メニューバーで「ツール」をクリックし、「ノートタイプの管理」を選択します。
  3. 確認したいノートタイプ(例:「Basic」)を選択し、「フィールド」ボタンをクリックします。
  4. この画面では、選択したノートタイプのフィールドが表示されます。「Front」と「Back」が表示されるはずです。他に追加されたフィールドがある場合もあります。

必要に応じて編集等してください。

バックグラウンドで動かす

このコードはbotがチャンネルをモニタリングしているので動かし続ける必要があります。

Terminalで動かし続けるわけにはいかないのでバックグラウンドで自動で動かすのが良いでしょう。

macOSの場合(LaunchAgent)

1. LaunchAgentの設定ファイルを作成します。disocrd_bot.plistという名前で以下の内容を書き込んでください。(拡張子さえ合っていれば名前は何でも良いです)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>discord_bot</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/python3</string>
        <string>/path/to/your/my_script.py</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>

/path/to/your/my_script.pyの部分を実際のPythonスクリプトのパスに置き換えてください。

<array>
        <string>/usr/bin/python3</string>

上記のPythonのパスもクライアントによって異なっている場合があるので以下のコマンドで出力されたものを入力します。

<key>Label</key>
    <string>discord_bot</string>

上記のdiscord_bot部分はLaunchdプロセスのラベル名を表しています。これは一意である必要があり、他のラベルと競合しないようにするためです。

which python3

2. 作成したcdiscord_bot.plistファイルを~/Library/LaunchAgents/ディレクトリにコピーします。(コピーしなくても直接~/Library/LaunchAgents/に作ればOK)

mv discord_bot.plist ~/Library/LaunchAgents/

3. 最後に、launchctlコマンドを使用して、作成したLaunchAgentをロードします。

launchctl load ~/Library/LaunchAgents/discord_bot.plist

Pythonスクリプトがバックグラウンドで実行され、再起動やインターネット切断後も自動的に復帰するようになります。

スクリプトの実行を停止する場合は、以下のコマンドを使用してください。

launchctl unload ~/Library/LaunchAgents/discord_bot.plist

LaunchAgentのステータスを確認したい場合は以下のコマンドを実行してください。

launchctl print user/$(id -u)/path/path/discord_bot.py

実行しても上手くいかない(botがオンラインにならない)場合は、Pythonが指定したフォルダの権限にアクセス権がない可能性があります。

その場合は以下コマンドで権限を付与してください。

chmod +x /path/path/discord_bot.py

Windows OSの場合(タスクスケジューラ)

  1. タスクスケジューラを開くために、Windows検索ボックスに「タスクスケジューラ」と入力し、検索結果から「タスクスケジューラ」を開きます。
  2. 「アクション」メニューから「基本タスクの作成」を選択します。
  3. 名前」欄に任意のタスク名を入力し、「説明」欄にタスクの説明を入力します(オプション)。次に進むために「次へ」をクリックします。
  4. トリガーを設定する画面で、「タスクの開始」ドロップダウンメニューから「コンピューターの起動時」を選択し、「次へ」をクリックします。
  5. 次の画面で「アクション」を設定します。「アクション」ドロップダウンメニューから「プログラムの開始」を選択し、「次へ」をクリックします。
  6. 「プログラム/スクリプト」欄に、Pythonインタープリタの実行ファイルへのパスを入力します。これは、通常 C:\PythonXX\python.exe です(XXはPythonのバージョンに応じて変わります)。また、「引数の追加」欄に、作成したPythonスクリプト(my_script.py)のフルパスを入力してください。
  7. 「次へ」をクリックし、確認画面で設定内容を確認したら「完了」をクリックします。

これで、Pythonスクリプトがバックグラウンドで実行され、再起動やインターネット切断後も自動的に復帰するようになります。

タスクの実行を停止する場合は、タスクスケジューラのタスクライブラリ内で該当のタスクを右クリックし、「無効にする」または「削除」を選択してください。

自動でシンクロさせる

デスクトップ版のみ使う方は問題ないのですが、スマホアプリと併用している方は

  1. デスクトップ版に単語が追加される
  2. デスクトップ版でSyncさせる
  3. スマホアプリでSyncさせる

上記の手順を踏まないとスマホアプリには反映されません。

自動でsyncさせたい場合は以下のコードを実行してくだい。

import time
import requests

def invoke(action, **params):
    request_json = {
        'action': action,
        'params': params,
        'version': 6
    }
    response = requests.post('http://localhost:8765', json=request_json)
    return response.json()

def sync_anki():
    result = invoke('sync')
    if 'error' in result:
        print(f"Anki synchronization failed: {result['error']}")
    else:
        print("Anki synchronization succeeded")

if __name__ == "__main__":
    sync_interval = 5 * 60  # 5分ごとに同期

    while True:
        sync_anki()
        time.sleep(sync_interval)

このPythonスクリプトを実行すると、5分ごとにAnkiデスクトップアプリケーションとAnkiWebの間で同期が行われます。同期間隔を変更するには、sync_intervalの値を変更してください。この例では、5分 = 5 * 60秒 としています。

スマホアプリは使い始める前に手動でsyncさせる必要がありますが、PCを開いてsyncさせる必要ななくなると思います。

上記のコードもバックグラウンドで動かしたい場合はlaunchctl等を使用してくだい。

macOSの場合はループさせずにAutomcateでカレンダーに追加して実行するという手もあるかと思います。

改訂版コード

改訂版のコードです。

例えばDiscordに”probate”という単語を送ると以下のように

【発音】【日本語訳】【英語訳】【例文】に加えてFront面には音声も自動で登録されます。

音声はgtts(Google Text-to-Speech)を使用しました。

gttsはPythonのライブラリで、Googleのテキスト-音声変換エンジンを使用して、テキストから音声を生成する機能を提供しています。

日本語訳はhttps://eow.alc.co.jpから取っています。

更に例文で単語が使われている部分も赤文字でハイライトするようにしました。

また各機能ごとに追加したい項目をTrue、FalseでON・OFFできるようにしました。

まずはライブラリのインストールをします。

gtts、beautifulsoup、discord以外はデフォルトのライブラリです。

pip install gtts
pip install beautifulsoup4
pip install discord.py
import discord
import requests
from bs4 import BeautifulSoup
import json
import shutil
from gtts import gTTS
import string
import os

from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

ANKI_MEDIA_DIR = "/Users/user_name/Library/Application Support/Anki2/User 1/collection.media"

# DiscordのトークンとチャンネルIDを設定
TOKEN = ''
CHANNEL_ID =

# 追加項目のON・OFF設定
ADD_PRONUNCIATION = False
ADD_JAPANESE_TRANSLATION = True
ADD_ENGLISH_DEFINITION = True
ADD_EXAMPLE = True

intents = discord.Intents.all()

client = discord.Client(intents=intents)

def is_english_word_or_phrase(text):
    words = text.split()
    return all(word.isalpha() for word in words)

def contains_japanese(text):
    for char in text:
        if '\u0800' <= char <= '\u4e00':
            return True
    return False

def clean_filename(filename):
    valid_chars = "-_.() %s%s" % (string.ascii_letters, string.digits)
    return ''.join(c for c in filename if c in valid_chars)

def add_audio_to_text(text):
    try:
        tts = gTTS(text, lang='en')
    except Exception as e:
        print(f"Unable to generate sound for {text}: {e}")
        return text

    filename = clean_filename(text)
    audio_file = f'{filename}.mp3'
    audio_path = os.path.join(ANKI_MEDIA_DIR, audio_file)
    tts.save(audio_path)
    return f'{text} [sound:{audio_file}]'

def add_to_anki(deck_name, front, pronunciation, jp_translation, meaning, example):
    print(f'Adding to Anki: Front: {front}, Pronunciation: {pronunciation}, Japanese Translation: {jp_translation}, Meaning: {meaning}, Example: {example}')
    back = ""

    if ADD_PRONUNCIATION and pronunciation:
        back += f"【発音】{pronunciation}<br><br>"

    if ADD_JAPANESE_TRANSLATION and jp_translation:
        back += f"【日本語訳】{jp_translation}<br><br>"

    if ADD_ENGLISH_DEFINITION and meaning:
        back += f"【英語訳】{meaning}<br><br>"

    if ADD_EXAMPLE and example:
        example = example.replace(front, f'<font color="red">{front}</font>')
        back += f"【例文】{example}"

    if not contains_japanese(front):
        front = add_audio_to_text(front)

    data = {
        "action": "addNote",
        "version": 6,
        "params": {
            "note": {
                "deckName": deck_name,
                "modelName": "Basic",
                "fields": {
                    "Front": front,
                    "Back": back
                },
                "tags": ["discord"]
            }
        }
    }
    response = requests.post('http://localhost:8765', json=data)
    print(response.text)
    sync_anki()  # 同期を実行

def search_word(word):
    session = requests.Session()
    retries = Retry(total=5, backoff_factor=1, status_forcelist=[429, 500, 502, 503, 504])
    adapter = HTTPAdapter(max_retries=retries)
    session.mount('http://', adapter)
    session.mount('https://', adapter)

    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134"
    }

    url = f'https://dictionary.cambridge.org/us/dictionary/english/{word.lower()}'
    try:
        response = session.get(url, headers=headers, timeout=10)
        response.raise_for_status()
    except requests.exceptions.RequestException as e:
        print(f"Error occurred while searching for '{word}': {e}")
        return None, None, None

    soup = BeautifulSoup(response.text, 'html.parser')

    try:
        pronunciation = soup.find('span', class_='ipa dipa lpr-2 lpl-1').text.strip()
    except AttributeError:
        pronunciation = None

    try:
        meaning = soup.find(class_='def-block ddef_block').find('div', class_='def ddef_d db').text.strip()
    except AttributeError:
        meaning = None

    try:
        example = soup.find(class_='def-block ddef_block').find('div', class_='examp dexamp').text.strip()
    except AttributeError:
        example = None

    # Japanese translation 
    jp_url = f'https://eow.alc.co.jp/search?q={word}'
    try:
        jp_response = session.get(jp_url, headers=headers, timeout=10)
        jp_response.raise_for_status()
    except requests.exceptions.RequestException as e:
        print(f"Error occurred while searching for Japanese translation of '{word}': {e}")
        return pronunciation, None, meaning, example

    jp_soup = BeautifulSoup(jp_response.text, 'html.parser')
    try:
        jp_translation_full = jp_soup.find('meta', {'name': 'description'}).get('content')
        jp_translation_parts = jp_translation_full.split('...【発音】')  # Split on the delimiter
        jp_translation = jp_translation_parts[0]  # Only keep the first part
    except AttributeError:
        jp_translation = None

    return pronunciation, jp_translation, meaning, example


def sync_anki():
    data = {
        "action": "sync",
        "version": 6
    }
    response = requests.post('http://localhost:8765', json=data)
    print(response.text)

@client.event
async def on_ready():
    print(f'{client.user} has connected to Discord!')

deck_name = "your_deck_name"
@client.event
async def on_message(message):
    if message.channel.id != CHANNEL_ID or message.author == client.user:
        return

    text = message.content.strip()
    if is_english_word_or_phrase(text):
        words = text.split()
        if len(words) == 1:
            word = words[0]
            pronunciation, jp_translation, meaning, example = search_word(word)
            if pronunciation or jp_translation or meaning or example:
                add_to_anki(deck_name, word, pronunciation, jp_translation, meaning, example)
            else:
                add_to_anki(deck_name, word, "", "", word, "")  # 単語が見つからない場合、その単語を表と裏にセット
        else:
            phrase = text
            add_to_anki(deck_name, phrase, "", "", phrase, "")  # フレーズの場合、そのフレーズを表と裏にセット

client.run(TOKEN)


ANKI_MEDIA_DIRのパスはOSによって違うので注意してください。

以下はOSごとの一般的なパスの場所です。

Windows: C:\Users\<YourUserName>\AppData\Roaming\Anki2\<YourProfileName>\collection.media
macOS: /Users/<YourUserName>/Library/Application Support/Anki2/<YourProfileName>/collection.media
Linux: ~/Documents/Anki/<YourProfileName>/collection.media

LaunchAgentやタスクスケジューラを使用してバックグラウンドで動かす場合にはcollection.mediaの権限を変更しないと音声ファイルの書き込みが出来ない場合があります。

#権限確認コマンド
ls -l ~/Library/Application\ Support/Anki2/User\ 1/collection.media

#権限変更コマンド
chmod 777 ~/Library/Application\ Support/Anki2/User\ 1/collection.media

それでも直らない場合はファイルのエラーログを確認して適切な対応をしてください。

例えば実行ファイルのパスが「/Users/user_name/Documents/anki_monitor.py」だとすると同じパスで拡張子の「.py」を「.err」に変えたファイルにログファイルがあると思います。

cat /Users/user_name/Documents/anki_monitor.err

単語流し込みスクリプト

せっかく自動化しましたが、例えばメモした単語などを1つ1つメッセージでDiscordに送るのは少し面倒です。

数個ならいいですが数十個一気にやるのは面倒なのでその作業を実行してくれるスクリプトにしました。

import discord
import asyncio
import os

intents = discord.Intents.default()

client = discord.Client(intents=intents)

TOKEN = ""
channel_id = 

def sync_anki():
    data = {
        "action": "sync",
        "version": 6
    }
    response = requests.post('http://localhost:8765', json=data)
    print(response.text)

async def send_words():
    
    channel = client.get_channel(channel_id)

    words = input('Enter words separated by commas: ').split(',')

    for word in words:
        await channel.send(word.strip())
        await asyncio.sleep(2)  # スパム防止のための待機時間。適宜調整してください

    await client.close()  # すべての単語を送信した後にBotをログアウトさせます
    sync_anki()


@client.event
async def on_ready():
    print('Bot logged in as {0.user}'.format(client))
    await send_words()

client.run(TOKEN)

上記のコードを実行するとInputで「Enter words separated by commas:」と聞かれるので以下のようにカンマ区切りで登録したい単語を入力してください。

flabbergasted, gobbledygook, brouhaha, lollygag, hullabaloo, nincompoop, skedaddle, malarkey, flibbertigibbet, shenanigans, whippersnapper, poppycock, knick-knack, hogwash, dillydally, gadzooks, kerfuffle, hodgepodge, flummoxed, ragamuffin, gumption, claptrap, folderol, gibberish, tomfoolery, balderdash

カンマ区切りにするPythonコードを書いてもいいのですが、それくらいの作業であればChatGPTが一番効率が良いと思うのでChatGPTを使用してください。

単語のリストを渡して「カンマ区切りにして」と命令すれば完璧にタスクをこなしてくれるはずです。

最後に

言語学習している場合はフラッシュカードに以下のように画像を登録できるとより記憶と結び好きやすいのでおすすめです。

ですが画像の取得は1対1の検索ではなく非常に難しいので現在は自動化は出来ていません。

機械学習で適切な画像を見つけるモデルの作成からしていかないといけないのでAnkiの為だけに作成するのは割りに合わないと思い、現在は画像は手動で挿入しています。

今回は音声の取得にgttsライブラリで音声の登録をしていますがGoogle CloudのAPIを使用して音声を使用するコードは以下に記載しているので気になる方は参考にしてみてください。

他には例文作成にChatGPTのAPIを使用したりすると自由度やクオリティが向上すると思います。

何かいい案がある方、コードが動かなかったなどありましたら是非、コメントで教えてください。

Follow me!

関連記事

プログラミングでAnkiにDsicordのチャンネルに送ったメッセージを自動で登録 意味と例文も自動取得・追加 Pythonスクリプト」への3件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

PAGE TOP