edge-tts は Microsoft の読み上げを無料・APIキー不要で使える Python ライブラリです。
使い始めてすぐ詰まるのが、どの声を使えばいいのかでした。
edge-tts --list-voices を叩くと322行返ってきます。ShortName が並ぶだけなので、 どれが日本語なのか、どれが自然なのかが分かりません。
全部調べて表にしました。 あわせて、その場で全部聴き比べるスクリプトを置いておきます。
検証環境:Windows 11 / Python 3.13 / edge-tts 7.2.8(2026年9月20日時点)
まず結論(迷ったらこれ)
用途 声
日本語 ja-JP-NanamiNeural(女性)/ ja-JP-KeitaNeural(男性)この2つしかない
英語・語学学習 en-US-AriaNeural(Positive, Confident)
英語・落ち着いた解説 en-US-AndrewNeural(Warm, Confident, Authentic)
英語・明るい案内 en-US-EmmaNeural(Cheerful, Clear)
多言語を1つの声で en-US-AvaMultilingualNeural
語学用途なら rate="-20%" を付けてください。 通常速度だと聞き取れない単語が拾えます。
全体の数字
音声の総数 322
言語(ロケール) 142
日本語 2(Nanami / Keita)
英語(米国) 17
Multilingual(1つの声で複数言語) 12
性格タグの種類 27
日本語は2つだけです。ここは選ぶ余地がありません。
日本語(ja-JP)
ShortName 性別 性格タグ
ja-JP-NanamiNeural 女性 Friendly、Positive
ja-JP-KeitaNeural 男性 Friendly、Positive
英語(米国)
ShortName 性別 性格タグ
en-US-AriaNeural 女性 Positive、Confident
en-US-AvaNeural 女性 Expressive、Caring、Pleasant、Friendly
en-US-EmmaNeural 女性 Cheerful、Clear、Conversational
en-US-AnaNeural 女性 Cute
en-US-AndrewNeural 男性 Warm、Confident、Authentic、Honest
en-US-BrianNeural 男性 Approachable、Casual、Sincere
en-US-ChristopherNeural 男性 Reliable、Authority
en-US-EricNeural 男性 Rational
en-US-GuyNeural 男性 Passion
※ 上記に加えて AvaMultilingual AndrewMultilingual BrianMultilingual EmmaMultilingual の Multilingual 版があります(後述)。合計17種。
性格タグが選ぶ手がかりになります。 Reliable、Authority(Christopher)は解説向き、Cute(Ana)は子ども向け、という具合です。
韓国語(ko-KR)
ShortName 性別
ko-KR-SunHiNeural 女性
ko-KR-InJoonNeural 男性
ko-KR-HyunsuMultilingualNeural 男性
中国語(zh-CN)
ShortName 性別 性格タグ
zh-CN-XiaoxiaoNeural 女性 Warm
zh-CN-XiaoyiNeural 女性 Lively
zh-CN-YunxiNeural 男性 Lively、Sunshine
zh-CN-YunyangNeural 男性 Professional、Reliable
zh-CN-YunjianNeural 男性 Passion
zh-CN-YunxiaNeural 男性 Cute
中国語は性格タグが細かく分かれています。 英語と中国語は選ぶ楽しみがあります。
Multilingual(1つの声で複数言語を読める・12種)
これが意外と知られていません。
名前に Multilingual が入った声は、言語を切り替えずに複数言語を読めます。
ShortName 元の言語
en-US-AvaMultilingualNeural 英語(米国)・女性
en-US-AndrewMultilingualNeural 英語(米国)・男性
en-US-BrianMultilingualNeural 英語(米国)・男性
en-US-EmmaMultilingualNeural 英語(米国)・女性
ko-KR-HyunsuMultilingualNeural 韓国語・男性
使いどころ: 英語の例文と日本語訳を同じ声で読ませたいとき。 声を切り替えると、聞いていて違和感が出ます。
その場で全部聴き比べるスクリプト
表を見ても、結局は聴かないと決まりません。
指定した言語の声を全部まとめて mp3 にします。
-- coding: utf-8 --
"""指定した言語の声を全部まとめて試聴用mp3にする。
py -m pip install edge-tts
py try_voices.py ja-JP "こんにちは。これは読み上げのテストです。"
py try_voices.py en-US "Hello. This is a test."
py try_voices.py --list ja # ja を含むロケールを一覧表示
出力: voices_<ロケール>/.mp3
"""
import asyncio
import os
import sys
import edge_tts
CONCURRENCY = 8
async def pick(locale_prefix):
voices = await edge_tts.list_voices()
return [v for v in voices if v["Locale"].lower().startswith(locale_prefix.lower())]
async def one(voice, text, outdir, sem):
path = os.path.join(outdir, voice["ShortName"] + ".mp3")
if os.path.exists(path):
return
async with sem:
try:
await edge_tts.Communicate(text, voice["ShortName"]).save(path)
print(f" {voice['ShortName']}")
except Exception as e:
print(f" × {voice['ShortName']}: {e}")
async def main():
args = [a for a in sys.argv[1:]]
if not args:
print(doc)
return
if args[0] == "--list":
prefix = args[1] if len(args) > 1 else ""
for v in await pick(prefix):
tag = (v.get("VoiceTag") or {}).get("VoicePersonalities") or []
print(f"{v['ShortName']:<42} {v['Gender']:<7} {', '.join(tag)}")
return
locale = args[0]
text = args[1] if len(args) > 1 else "This is a test of the text to speech voice."
voices = await pick(locale)
if not voices:
print(f"{locale} に該当する声がありません。--list で探してください。")
return
outdir = "voices_" + locale
os.makedirs(outdir, exist_ok=True)
print(f"{len(voices)} 種類を生成します → {outdir}/")
sem = asyncio.Semaphore(CONCURRENCY)
await asyncio.gather(*(one(v, text, outdir, sem) for v in voices))
print("完了。フォルダを開いて順に再生してください。")
if name == "main":
asyncio.run(main())
動かし方(Pythonを普段使わない人向け)
- 上のコードを try_voices.py という名前で保存する
メモ帳でも構いません。保存先はどこでもよいですが、ここでは「ダウンロード」に置いた前提で進めます。
- ターミナルを開いて、そのフォルダへ移動する
Windows は PowerShell、Mac はターミナルです。
Windows
cd ~\Downloads
Mac
cd ~/Downloads
3. ライブラリを入れる
Windows
py -m pip install edge-tts
Mac
python3 -m pip install edge-tts
4. 実行する
Windows
py try_voices.py en-US "Hello. This is a test of this voice."
Mac
python3 try_voices.py en-US "Hello. This is a test of this voice."
こう出れば成功です。
17 種類を生成します → voices_en-US/
en-US-AriaNeural
en-US-AvaNeural
...
完了。フォルダを開いて順に再生してください。
同じ場所に voices_en-US フォルダができています。実測で3.6秒でした。 開いて順に再生すれば、その場で決まります。
日本語で試す:
py try_voices.py ja-JP "こんにちは。読み上げのテストです。"
声を探すだけ(音声は作らない):
py try_voices.py --list ja
py try_voices.py --list zh
動かないときの3つ
症状 原因と直し方
py は認識されません Windows に Python が入っていません。python.org から入れてください。インストール時に 「Add python.exe to PATH」にチェック
No module named 'edge_tts' pip install が別の Python に入っています。py -m pip install edge-tts のように同じ py 経由で入れ直すと揃います
インストールしたのにコマンドが見つからない ターミナルを開き直してください。 開いたままだと、入れた直後は認識されません
3つ目は私も踏みました。別のツールを入れたとき、入っているのに「見つかりません」と言われ続けて、原因が分かるまで3回やり直しました。
速度と音量も変えられる
await edge_tts.Communicate(
"slow down",
"en-US-AriaNeural",
rate="-20%", # 遅く
volume="+10%", # 大きく
).save("out.mp3")
語学用途では rate="-20%" が効きます。
詰まりどころ
症状 原因
coroutine was never awaited asyncio.run() で包んでいない
途中で止まる・弾かれる 同時数が多すぎる。Semaphore を8前後に
日本語の声が2つしかない 仕様です。ja-JP は Nanami と Keita のみ
単語ごとのタイムスタンプが取れない 7.2.8 の既定では WordBoundary が返らず SentenceBoundary のみ
最後の1つは、字幕を作ろうとして詰まりました。このバージョンでは単語単位では取れません。
おわりに
数字は2026年9月20日時点のものです。Microsoft 側で増減する可能性があります。 --list で自分の環境の最新を確認してください。
私はこの edge-tts を使って、TOEIC単語カード1,376枚とハングル358枚に音声を付けました。 音声の生成は1,376枚ぶんで約2分です。
その作り方(コードは1行も読まずにAIに作らせた記録)は、別で書いています。
→ コードを1行も読まずに、Ankiデッキ生成ツールを作らせた記録
https://qiita.com/dokulab/items/d88b6a72bd9e39292909