MacとiPhone/iPadを使った単語暗記の最強プロセスのメモ

 コンピュータ 語学学習  3916

 今回は、単語の暗記において筆者が最も効率的だと考えているプロセスを紹介する。このプロセスは、単語を自動的に登録するためのプログラムを作成することによって実現される。 プログラムは、Pythonの知識がある人なら誰でも作成することができるだろう。

 単語を効率よく覚えることは、語学力の向上にとって重要なカギとなる。 人それぞれに最適な方法は異なるが、一つの例として参考になれば幸いである。

どんな人に向いているか

 この方法は、単語を暗記することが非常にめんどくさい、しかも暗記カードを作ることもめんどくさいと感じる人に向いている。また、紙のフラッシュカードでは正確な発音がわからないので嫌だという人にも適している。

メリット

 この方法のメリットは、①知らない単語を登録する、②単語を覚えるという、2つのプロセスだけで、暗記カードを作る手間がほとんどないことである。一度構築すれば、同じ方法で色々な単語を覚え続けられるため、英語だけでなく、仏語や中国語なども覚えることができる。

デメリット

 Apple製品(Mac、iPhone)を持っていない人は、初期投資がそれなりに必要になる。また、各自の環境に合わせてプログラムを作成する必要がある。ちなみに、筆者はPythonを使用してプログラムを作成している。


必要なもの

・Mac
 今回のタスクで使用するアプリケーションやPythonプログラムを実行するには、Macが必須である。


・iPhone / iPad + ApplePencil
 iPhoneやiPadを使用することで、単語を効率的に覚えることができる。特にiPadを使用する場合は、単語を書いて覚えることが容易になる。最近の製品であれば、どれを使用しても問題ない。


Loopback(MacOS用のアプリケーション/有料)

 Macはデフォルトではパソコンの音声を録音することができないため、録音するためのソフトウェアが必要になる。無料で公開されている他のソフトウェアでも可能であるが、信頼できる老舗のものを使用している。
 なお、音質は悪くなるが、このソフトウェアを使用せずにMacのマイクから録音する方法もある。


・Dictionaries(物書堂)(MacOS,iOS,iPadOS用のアプリケーション/有料)
 このアプリは、いろんな辞書を一つにまとめて使うことができ、MacOSにも対応している。また、登録した単語リストをiCloudで共有することもできる。ただし、各辞書は有料となる。例えば、フランス語の場合には、プチ・ロワイヤル仏和辞典や小学館ロベール仏和大辞典などがある。


・Anki(WEB,PC,iOS,AndroidOSなど何でも対応しているアプリケーション/有料)

 これは、最も強力な暗記ツールの一つである。自分自身の単語帳を簡単に作成することができ、他のユーザーが作成した単語帳もダウンロードして使用することができる。また、ユーザー側で設定できる範囲が広く、暗記したいものがあれば単語に限らず、何にでも使用することができる。


単語暗記のプロセス

 このプロセスは、単語を効率的に暗記するためのもので、以下のように進行する。

① 気になった単語があれば、Dictionariesの辞書で調べてブックマークに登録する。

② 登録した単語が溜まってきたら、まとめてMac上でAnkiに単語を追加する。この作業はPythonを使って自動化する。

③ iPhoneやiPadのAnkiアプリでひたすら単語を覚える。

 このプロセスのポイントは、②の部分を自動化することで、手動での入力を省き、効率的に単語を暗記することができることである。

 ②を自動化するためのプログラムは、RPA(ロボティクス・プロセス・オートメーション)と呼ばれるもので、以下のような単純な流れによって実現できる。

プログラムの基本的な流れ

# メインルーチン
bookmarks = X #登録したい単語数
count = 0
while(bookmarks > count):
    #辞書アプリに登録してある単語をコピー 画像処理はOpenCVライブラリ
    #Ankiにペースト
    #単語に音声データがある場合は音声録音処理 Pyaudioライブラリ
    count = count + 1

プログラムを動作させた際の様子

 

プログラム作成のポイント

1)ブックマークした単語数を把握する方法

 ブックマークした単語数をプログラム側で自動的に把握するようにするには、ブックマークフォルダに保存された単語が無い場合に表示される「No bookmarks(ブックマークは登録されていません)」で画像判断(プログラムの終了条件)するのが簡単だ。

Ankiに登録した単語は、別のブックマークフォルダに移動させる処理にする。この例だと、Ankiに登録するブックマークフォルダ名は「Uncategorized(分類なし)」、登録後の移動先は「済み」にしている。(Dictionaries画面)

 単語が全て登録されたら「No bookmarks(ブックマークは登録されていません)」が表示される。(Dictionaries画面)

2)スクロールが必要な長い単語の意味を1枚の画像として保存する方法

 Dictionariesの辞書に載っている単語の意味は、画像データとして保存して、Ankiのデータベースにも追加している。

 PythonのOpenCVを使用して、画面のスクリーンショットを切り出している。意味が複数あって1枚のスクリーンショットで収まらない場合は、複数枚のスクリーンショットをcv2.vconcat()で縦に結合している。

import cv2
import os
import pyautogui

# 一時保存用のフォルダのパス
_DIR_TEMP = 'path/to/temp/folder/'

def capture_all(coordinates):
    """
    スクリーンショットを取得し、特定の範囲を切り取り、
    最終的な画像に結合します。
    """
    y2 = 0
    # 最初のスクリーンショットを取得し、切り取り
    capture_and_crop("out_1.png", coordinates)

    while(True):
        for i in range(2):
            # スクロール処理
            pyautogui.press('down')

        # 次のスクリーンショットを取得し、切り取り
        capture_and_crop("out_2.png", coordinates)
        x, y = get_center_position("out_1.png", "out_cut.png")

        # 特定の要素の位置が前回と同じなら終了
        if(y == y2):
            break
        else:
            y2 = y

        if(x != -1):
            # 画像を結合
            crop_image("out_1.png", 0, y)
            img1 = cv2.imread(_DIR_TEMP + 'out_1.png')
            img2 = cv2.imread(_DIR_TEMP + 'out_2.png')
            im_v = cv2.vconcat([img1, img2])
            cv2.imwrite(_DIR_TEMP + 'out_1.png', im_v)

    img1 = cv2.imread(_DIR_TEMP + 'out_1.png')
    # 画像圧縮
    cv2.imwrite(_DIR_TEMP + 'output.jpg', img1, [int(cv2.IMWRITE_JPEG_QUALITY), 10])

def capture_and_crop(file_name, coordinates):
    """
    スクリーンショットを取得し、特定の範囲を切り取り、保存する
    """
    os.system("screencapture " + _DIR_TEMP + "_capture.png")
    img = cv2.imread(_DIR_TEMP + "_capture.png", cv2.IMREAD_COLOR) 
    img1 = img[coordinates[0]:coordinates[1], coordinates[2]:coordinates[3]]
    cv2.imwrite(_DIR_TEMP + file_name, img1)

def crop_image(file_name, start_y, end_y):
    """
    画像を切り取り、保存する
    """
    img = cv2.imread(_DIR_TEMP + file_name, cv2.IMREAD_COLOR) 
    img1 = img[start_y:end_y, :]
    cv2.imwrite(_DIR_TEMP + file_name, img1)

def get_center_position(file_name1, file_name2):
    """
    画像から特定の要素の位置を取得する
    """
    # 画像から中心位置を取得するコード
    return x, y

capture_all((240, 840, 643, 1427))

3)音声再生後の終了判断

 音声の録音は、Ankiの機能を使うことで簡単に行うことができる。①Ankiの録音開始ボタンを押し、②単語の音声を再生し、③再生が終わったら録音終了ボタンを押すという流れである。③については、以下のようなプログラムを使用して判断することができる。

import pyaudio # 音声入力に必要なライブラリ
import numpy as np

# 定数
FORMAT = pyaudio.paInt16 # 音声フォーマット
CHANNELS = 1 # チャンネル数

def check_audio():
    """
    音声入力を取得し、終了判定を行う
    """
    p = pyaudio.PyAudio()
    stream = p.open(format=FORMAT, # 音声フォーマット
                    channels=CHANNELS, # チャンネル数
                    rate=RATE,
                    input=True,
                    frames_per_buffer=chunk)

    count = 0

    while True:
        data = stream.read(chunk)
        audio_data = np.frombuffer(data, dtype="int16") / 32768.0

        if audio_data.max() < threshold:
            count += 1
        if count > 20:
            break
    stream.close()
    p.terminate()
    return 0

Ankiの単語カードのサンプル

 以下が実際に作成した単語カードである。なかなか覚えられない単語は、後から手動でネットから写真や画像を拾って追加している。

単語の意味はDictionariesの PETIT ROYAL 5引用。(Anki)

Ankiの単語カードから辞書に直接アクセスする方法

 Ankiのカードタイプに辞書アプリへのリンクを追加することで可能である。

<A href="mkdictionaries:///?text={{text:Word}}">{{Word}}</A>

Ankiの小技

 Ankiはスクラッチパッドを設定することで手書き入力を行うことができる。指で書くのは難しいが、iPadとApplePencilの組み合わせで利用すると書いて覚えるのに便利である。

単語の意味はDictionariesの PETIT ROYAL 5引用。(Anki)



関連記事
コメント
  • 132 nan 2023年8月28日 12:39 AM

    物書堂ブックマークをAnkiに追加できたらいいのになぁ〜、でも不可能でしょって思い込んでたら、まさかこんな夢のようなことを実現されてる人がいらして脱帽です! 私も真似したくてワクワクしながら拝見させて頂きました! 
    でも読んだあとは、ガックリ…。

    Ankiは、テンプレートをカスタマイズしてブラウザ検索を埋め込んだり辞書検索を色々追加するのは簡単。 MacPCでAutomatorやコンテキストメニューなどもテンプレートがあれば簡単に真似できます。 
    こちらのページに書かれてある用意するものは全て揃っています

    ですが、そもそもPythonを用いてというくだりがわかりません。 
    1)ソースコードは、コピペしてカスタマイズ出来そうですが、どこにコピペするのだろう?
    2)デッキを新規作成して貼り付ければいいのだろうか? 
    3)デッキテンプレートをシェアしていただけたら、私のAnkiでも物書堂ブックマークを自動追加できるのだろうか?
    といったところで私は止まっています。 
    すごく当たり前すぎる知識がなくて変な質問をしてしまってたらすみません。
    物書堂とAnkiを使う人も増えて、Anki自体、日本語話者ユーザーが増えたので、私のように憧れてる人がきっとたくさんいるだろうなと思いコメントさせて頂きました。

    ソースコードをコピペして使えるところまでのくだりをもりこんだ備忘録の更新、(勝手に)待っています

    • 133 legato 2023年8月30日 10:12 PM

      nanさん

      コメント頂きありがとうございます。
      そして、ガッカリさせてしまい申し訳ないです。

      Pythonというのはプログラミング言語の1つです。
      Ankiのアプリに組み込むものではないので、デッキとは全く関係ないPythonのプログラムを作っています。
      もう少し簡単にできる方法がないか考えてみますね。

      legato

  • 146 nan 2024年1月10日 8:34 AM

    返信が来たらメールで通知されるのかと思い込んでて返信気づかずすみませんでした
    私がAnkiを使う一番の目的は中国語、2番目が韓国語、3番目が英語
    Ankiのアドオンを駆使しながらいろんなノートをた〜くさん試してみてるのですが
    やはり、これだというものができあがりません…
    パイソンは名前だけは知ってたのですが、一から学ぶのはきっと無理だろうと諦めてたんですが、このまま何年たってもずっと心残りになるので
    パイソンの本を読むとこからスタートしてみようかな…
    Ankiアプリ自体は、めちゃくちゃ使いこなしてるけど
    悲しいくらいに満足のいくデッキが一つもないので
    グーグル(パイソン)も試しながらやってみようと思います
    私のようなおばかちゃんでも真似っこでけたぞ〜🎵となればいいのですが、、、
    もし進捗その他、教えて頂けることがありましたらぜひメールででもお返事頂ければ大変大変助かります😭

  • 170 Bokuboku 2024年7月3日 12:22 AM

    このようなシステムを切望していました。
    先にコメントされているかもいましたが、プログラムや導入の方法を教えていただくことは可能でしょうか。メールでも構いません。お返事頂ければ大変助かります。

    • 171 legato 2024年7月7日 10:24 AM

      Bokubokuさん

      コメントありがとうございます。このようなシステムを切望していただいていたとのことで、大変嬉しく思います。

      ご質問のプログラムや導入方法についてですが、現在ご紹介している内容は特定の環境に依存するため、どなたの環境でも使える汎用的なプログラムとして提供することが難しい状況です。そのため、記事の内容以上の詳細な情報をお伝えすることができません。申し訳ございません。

      今後、汎用的なものができれば公開していきたいとは思っておりますので、引き続きよろしくお願いいたします。

      legato