<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>TTS on あるエンジニアのログブック</title><link>https://cloud-aws.net/tags/tts/</link><description>Recent content in TTS on あるエンジニアのログブック</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Wed, 08 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://cloud-aws.net/tags/tts/index.xml" rel="self" type="application/rss+xml"/><item><title>自宅の個人AIアシスタントで、読み上げをedge-tts→ElevenLabs→Amazon Pollyと乗り換えた</title><link>https://cloud-aws.net/post/tts-provider-migration/</link><pubDate>Wed, 08 Jul 2026 00:00:00 +0000</pubDate><guid>https://cloud-aws.net/post/tts-provider-migration/</guid><description>&lt;p&gt;自宅で動かしている音声AIアシスタントは、&lt;a class="link" href="https://cloud-aws.net/post/personal-ai-model-split/" &gt;対話とコード開発でモデルを分けた話&lt;/a&gt;を書いた同じやつだ。今度は読み上げ(TTS)側を触った。&lt;/p&gt;
&lt;p&gt;きっかけはiOSネイティブアプリでSTT(音声認識)をブラウザのWeb Speech APIからiOS標準のオンデバイス認識に変えたこと。ネットワーク往復が消えて、聞き取りの確定が速くなった。そうなると今度は、TTSの遅さが相対的に目立つようになった。実測すると、非キャッシュ時で470〜570ms、短い一文でこれだけかかっていた。&lt;/p&gt;
&lt;p&gt;それまで使っていたのはedge-tts。Microsoft Edgeの読み上げ機能を流用した非公式ルートで、無料だがSLAはない。&lt;code&gt;ja-JP-KeitaNeural&lt;/code&gt;、レートは+20%で運用していた。&lt;/p&gt;
&lt;p&gt;まず検討したのがAzure Speech(公式)とAmazon Polly、そしてElevenLabsの3つ。Azureはedge-ttsと同じ声質・同じレイヤーなので、公式契約になるだけで速度向上はほぼ見込めない。Pollyは当時「安定しているが最速ではない」という位置づけで見送った。ElevenLabsはFlash v2.5というモデルが推論レイテンシ約75msをうたっていて、速度優先ならここ一択に見えた。&lt;/p&gt;
&lt;p&gt;7/7、ElevenLabsに乗り換えた。edge-ttsをフォールバックに残し、3回連続失敗で60秒間ElevenLabsへの試行を止めるサーキットブレーカーを挟んだ。発音辞書とキャッシュ機構はそのまま流用できたので、変更はTTSエンジン呼び出し部分に閉じた。フロントエンドとiOSアプリ側は無改修。&lt;/p&gt;
&lt;p&gt;最初に選んだ声(Adam、英語ネイティブの男声)は、多言語モデル経由で日本語を読ませると発音と強調が文脈とズレる違和感があった。翌日、日本語ネイティブの声(Asahi)に切り替えた。&lt;/p&gt;
&lt;p&gt;実測では、ElevenLabsは文字数が伸びてもレイテンシがほぼ横ばいだった。18字で304ms、57字で323ms、90字で349ms。一方edge-ttsは文字数に比例して伸び、30字で約500ms、長文だと700msを超える。短い相槌はほぼ互角、1文以上になるとElevenLabsが優位という結果だった。&lt;/p&gt;
&lt;p&gt;ここでedge-tts時代に付けていた+20%のレート感が、ElevenLabsには引き継がれていないことに気づいた。ElevenLabsのAPIには話速パラメータ(&lt;code&gt;voice_settings&lt;/code&gt;)があるので、環境変数&lt;code&gt;ELEVENLABS_SPEED&lt;/code&gt;(既定1.1、許容範囲0.7〜1.2)を追加してこれを埋めた。&lt;/p&gt;
&lt;p&gt;そしてもう1日経った7/8、3つ目の選択肢だったAmazon Pollyを改めて測り直した。結果は18字で112ms、63字で213ms、99字で312ms。短文〜中文でElevenLabsもedge-ttsも上回っていた。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;文字数の目安&lt;/th&gt;
					&lt;th&gt;edge-tts&lt;/th&gt;
					&lt;th&gt;ElevenLabs&lt;/th&gt;
					&lt;th&gt;Amazon Polly&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;短文(20字前後)&lt;/td&gt;
					&lt;td&gt;約500ms&lt;/td&gt;
					&lt;td&gt;304ms&lt;/td&gt;
					&lt;td&gt;112ms&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;中文(60字前後)&lt;/td&gt;
					&lt;td&gt;-&lt;/td&gt;
					&lt;td&gt;323ms&lt;/td&gt;
					&lt;td&gt;213ms&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;長文(90〜100字)&lt;/td&gt;
					&lt;td&gt;700ms超&lt;/td&gt;
					&lt;td&gt;349ms&lt;/td&gt;
					&lt;td&gt;312ms&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Pollyは声をTakumi(Neural)、リージョンは東京、話速は1.2倍にした。このマシンは既にAWS認証(SSM Hybridの&lt;code&gt;credential_process&lt;/code&gt;)が設定済みなので、新規のアカウント登録も契約も不要だった。初年度は実質無料。boto3の呼び出しは同期APIなので、&lt;code&gt;asyncio.to_thread&lt;/code&gt;でオフロードしてある。&lt;/p&gt;
&lt;p&gt;主系をPollyに切り替え、環境変数&lt;code&gt;TTS_PROVIDER&lt;/code&gt;で3つのプロバイダを選べるようにした。edge-ttsは常時フォールバックとして残し、プロバイダごとに独立したサーキットブレーカーを持たせ、キャッシュキーにもプロバイダ・声・話速を織り込んだ。ElevenLabsとedge-ttsの実装はコードごと残してあるので、環境変数を書き換えるだけでいつでも戻せる。&lt;/p&gt;
&lt;p&gt;2日で3段階乗り換えたことになる。速度だけを見るなら、最初からPollyを測っていればElevenLabsは経由しなくてよかったかもしれない。ただ最初の見立て(「Pollyは安定重視、最速はElevenLabs」)は検討時点では妥当な判断で、実測して初めて逆転が分かった。数字は都度測るしかない。&lt;/p&gt;
&lt;p&gt;いまは主系がPolly、副系がedge-tts、ElevenLabsは設定を残したまま待機中。&lt;/p&gt;</description></item></channel></rss>