単語帳の音声ファイル → Anki用CSV文字起こし → Ankiに登録(音声付)
🧩はじめに
単語帳アプリAnkiに、購入した英単語帳の単語・例文データを効率良く導入していく方法として、
Python と OpenAIのWhisperを使って「単語帳の音声 → 文字 → CSV→ Anki」という手順の一例を解説します。
Ankiで利用できるところまで解説したつもりです
この記事では、
- 単語帳音声データから、Anki用の音声も再生できる形式のCSVとするまでの流れをなるべく丁寧に紹介します
背景
- 画像認識+音声データからの作成を試みるも断念。写真撮ってらんない
- 音声データ→これで文字起こせるかな→そこそこ精度いい
⚙️ 動作環境 / 前提条件
出力データには、音声認識精度に依存して、ちょくちょく誤字が残ります。
- OS | Windows 11
- Python | 3.10.13(Whisper 安定動作のため)
- 必要ライブラリ |
- openai-whisper(OpenAIの音声認識モデル)
- pandas(データフレーム操作)
- pydub(MP3→WAV変換)
- ffmpeg(pydubで必要、外部バイナリ)
- os, subprocess(標準ライブラリ)
- エディタ |
Visual Studio Code - 音声形式 |
.mp3または.wav - 出力 |
CSV(Ankiにインポート可能)
元々はatsu_eigoさんのDistinctionを利用しましたが、著作権保護のため記事内では触れてません。
⚠️ 注意
・この記事は素人が調べ調べ、学習目的で作成したものです
・利用は自己責任でお願いします。
*記事修正は積極的に行うつもりです
🚀 手順
🗂️ フォルダ構成
mp3_Anki #フォルダ名
├── .venv/ #仮想環境
├── media/ #音声ファイル保存先
│ ├── sound_file1
│ │ ├──001_word1.mp3
│ │ ├──001_exB.mp3
│ │ ├──001_exC.mp3
│ │ ├──001_exD.mp3
│ │ ├──001_word2.mp3
│ │ ├──・・・
│ └── sound_file2
└── mp3_2_csv.py #メインスクリプト
ダウンロードした音声ファイルをmediaファイルの下に置きます。
今回、コードが mp3_2_csv.py のみでしたので、root(mp3_Anki)の直下に置き、出力csvもroot直下にしています。
1.
Whisperの準備
Whisperを使うためには、あらかじめffmpegが必要です。
私の場合は、インストール後、手動で環境変数を通し、かつ、以下のようにコード内でパスを通しました。
ライブラリのインストール:
pip install ffmpeg
windows検索「環境変数を編集」 → Path → 新規追加:
C:\ffmpeg\bin
pythonコードでpathを明示
os.environ["PATH"] += r";C:/ffmpeg/bin"
os.environ["FFMPEG_BINARY"] = r"C:/ffmpeg/bin/ffmpeg.exe"
動作確認:
import subprocess
result = subprocess.run(["ffmpeg", "-version"], capture_output=True, text=True)
print(result.stdout)
・調べた範囲では、無料利用可能でした。(2025/5くらいのとき)
・確か、whisperのpath通しに手間取りました。
・また、毎回仮想環境構築にも手間取るので↓メモctrl+shift+P→">python:interpreter"→仮想環境構築
terminal で .venv\Scripts\activate
2.
コード全体像
必要なライブラリのインストール:
pip install openai-whisper pandas pydub
コード(mp3_2_csv.py)
import os
import whisper
import pandas as pd
from pydub import AudioSegment
os.environ["PATH"] += r";C:/ffmpeg/bin"
os.environ["FFMPEG_BINARY"] = r"C:/ffmpeg/bin/ffmpeg.exe"
import subprocess
result = subprocess.run(["ffmpeg", "-version"], capture_output=True, text=True)
print(result.stdout)
# Whisper モデルをロード
model = whisper.load_model("base", device="cpu"
# メディアフォルダ、出力csvのパス(手動で変更)
MEDIA_FOLDER = os.path.abspath("media/**手動でフォルダ名を指定**") # 絶対パスを取得
OUTPUT_CSV = "transcriptions_dict3.csv"
# 文字起こし結果を一時的に保存するリスト
data = []
wav_path = "temp.wav"
# mediaフォルダ内のすべてのMP3ファイルを取得しwav形式に変換
for file_name in os.listdir(MEDIA_FOLDER):
file_path = os.path.join(MEDIA_FOLDER, file_name)
if file_name.endswith(".mp3"):
audio = AudioSegment.from_mp3(file_path)
audio.export(wav_path, format="wav")
elif file_name.endswith(".wav"):
wav_path = file_path
print(f"Processing: {file_name}...")
# Whisperで文字起こし
result = model.transcribe(wav_path, fp16=False)
text = result["text"]
# リストに追加(ファイル名を手動で指定)
data.append({"File Name": file_name, "**ファイル名を手動で指定**": text})
# CSVファイルに保存
df = pd.DataFrame(data)
df.to_csv(OUTPUT_CSV, index=False, encoding="utf-8")
print(f"文字起こし完了!結果は '{OUTPUT_CSV}' に保存されました。")
なぜかは忘れましたが、mp3ではなくwav形式にする必要があったため、このようなコードになっています。
terminalから
python mp3_2csv.py
を実行すると、うまくいけば、csvが出力されるはずです。
2~3秒の音声ファイル一つでも処理に1秒くらいかかるのでしばらく放置が必要です。(PCによる)
3.
CSVを暗記用に加工
Anki用にエクセルやスプレッドシートの式を活用してcsvを加工します。
音声ファイルを読み込むために↓の形式にする必要があります。
[sound:001_word1.wav]
例えば、↓とかをうまく使って整形しました。
="[sound:" &A1&"]"
=FILTER(B1:C1600, ISERROR(FIND("B.wav", A1:A1600)) * ISERROR(FIND("C.wav", A1:A1600)) * ISERROR(FIND("D.wav", A1:A1600)))
あとは、
- Ankiに音声ファイルと上記csvをインポート
- Ankiカードの作成
をすればうまくいくはずです。
Windowsなら、ここ↓に移動
%APPDATA%\Anki2\collection.media
Appendix.
Ankiカードの編集
私はデフォルトのものを編集して作成しました。
単語帳ごとの例文の数などに合わせて作り直してください。
1:Word
2:Sound_word
・
・
{{Word}}
<div style='font-family: Arial; font-size: 20px;'>{{Sound_word}}</div>
{{FrontSide}}
<hr>
<div style='font-family: Arial; color; text-align:left;'>
→ Ex1: {{ex1}}
{{Sound_ex1}}
</div>
<br>
<div style='font-family: Arial; color; text-align:left;'>
→ Ex2: {{ex2}}{{sound:Sound_ex2}}
</div>
<p class="jpn"> </p>
<hr>
<div style='font-family: Arial; text-align:left;'>
<center>{{Meaning}}
</div>
<div style='font-family: Arial; text-align:left;'>
<center>{{Sound_meaning}}</div>
<hr>
</br>
<a href="https://www.google.co.jp/search?tbm=isch&hl=ja&source=hp&biw=1026&bih=781&q={{text:Word}}">Image</a>
<a href="https://www.oxfordlearnersdictionaries.com/definition/english/{{text:Front}?q={{text:Word}}">Oxford</a>
</br></br>
{{Tags}}
.card {
font-family: arial;
font-size: 20px;
text-align: center;
color: white;
background-color: black;
}
.jpn {
text-align: left;
font-size: 16px;
}
おわりに
お疲れさまでした。この方法だとうまくいったという報告でした。
フィードバック大歓迎ですのでお気軽にコメントいただけるとありがたいです。