0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【一覧】edge-tts の322音声を全部調べた(日本語2・英語17・多言語12)

0
Posted at

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を普段使わない人向け)

  1. 上のコードを try_voices.py という名前で保存する

メモ帳でも構いません。保存先はどこでもよいですが、ここでは「ダウンロード」に置いた前提で進めます。

  1. ターミナルを開いて、そのフォルダへ移動する

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?