6.4 KiB
Alexa 日本語 TTS 問題 試行記録
最終更新: 2026-03-03
担当: akira + AI (Antigravity)
現在の問題
/api/behaviors/preview + Alexa.Speak を使って日本語テキストを TTSで発話させようとしているが、
日本語Unicode文字だけが Amazon 側でフィルタリングされ、発話されない。
ASCII文字(英語)は正常に発話される。
環境
- テスト用スクリプト:
alexa-api/test_tts.js(ローカルPCから直接 alexa.amazon.co.jp を叩く) - 本番:
alexa-api/server.js(VPS上のDockerコンテナ) - テストデバイス: オフィスの右エコー (serial: G0922H08525302K5, type: A4ZXE0RM7LQ7A)
- Alexaアプリでデバイス言語設定: 日本語 に設定済み(確認済み)
- VPS IP: 162.43.33.56(大阪・Xserver Inc. = 日本国内 ✅ )
試行ログ(時系列)
【サーバー側での試行】(ChatGPT との会話ログより、2026-03-02〜03)
❌ speakType: 'ssml' を operationPayload に追加
"type": "Alexa.Speak",
"operationPayload": { ..., "speakType": "ssml" }
→ 変化なし。Alexa.Speak はSSML非対応のため無効。
❌ type: 'Alexa.SpeakSsml' に変更 + textToSpeak にSSMLなし
"type": "Alexa.SpeakSsml",
"operationPayload": { ..., "textToSpeak": text }
→ 英語も含めて完全無音(LEDも反応なし)。
❌ Alexa.SpeakSsml + textToSpeak: '<speak>'+text+'</speak>'
→ 英語も無音。Alexa.SpeakSsml は textToSpeak ではなく別キーを要求する模様。
❌ Alexa.SpeakSsml + ssml: ssml(キー名を変更)
→ 英語も発話せず。
ChatGPTの最終見解: /api/behaviors/preview では Alexa.SpeakSsml は動作しない(APIの癖)。Alexa.Speak に戻すしかない。
【ローカルPCでの試行】(2026-03-03 午前)
❌ locale: 'ja-JP' + 日本語テキスト(test_tts.js デフォルト)
locale: 'ja-JP',
textToSpeak: 'テストです。聞こえますか'
→ 「エ」だけ発話(最初の「テ」の母音のみ)。
✅ locale: '' + ASCII: 'hello'
→ 「ハロー」と正常発話。英語は問題なし。
❌ locale: '' + 日本語: 'テストです。聞こえますか'
→ 「エ」のみ。デバイス言語が英語設定ならこの動作になるが、日本語設定確認済みのため別原因。
❌ locale: 'ja-JP' + 日本語: 'テストです。これは日本語のテストです'
→ 「えんえ」のような音のみ(断片的な音)。
❌ locale: 'ja-JP' + ひらがな: 'あいうえお'
→ 無音(LEDは点滅 = 通知は届いている)。
🔍 locale: 'ja-JP' + 混在: 'あいうえおThis is Testあいうえお'
→ 「ディスイズテスタ」のみ発話。
重要: 日本語部分は無音、ASCII部分のみ日本語アクセントで読まれる。
→ Amazon側で日本語Unicodeを除去している証拠。
❌ locale: 'ja-JP' + Unicodeエスケープ: '\u3053\u308c\u306f\u30c6\u30b9\u30c8\u3067\u3059'
→ 無音。ファイルエンコード問題ではない(Unicodeエスケープ = これはテストです と同一)。
→ 文字コードの問題ではないことが確定。
❌ type: 'AlexaAnnouncement' + locale:'ja-JP' + content[].speak構造
"type": "AlexaAnnouncement",
"operationPayload": {
"content": [{ "locale": "ja-JP", "speak": { "type": "text", "value": "日本語のテストです" } }],
"target": { "devices": [...] }
}
→ 「えんえせんと」("AlexaAnnouncement" を日本語発音で読んだもの)。
コンテンツではなくノード型名が読まれた → このノードタイプは別用途。
確定した事実
| 事実 | 根拠 |
|---|---|
| 通知自体は届いている | LEDが点滅する |
| 英語ASCIIは正常発話 | "hello" → 「ハロー」、"This is Test" → 「ディスイズテスタ」 |
| 日本語Unicodeのみ除去される | 混在テキストで確認。Unicodeエスケープでも同じ |
| デバイス言語設定は日本語 | Alexaアプリで確認済み |
| サーバーIPは日本(大阪) | ipinfo.io で確認: Xserver Inc., JP |
| 文字コードは問題なし | Unicodeエスケープテストで確定 |
Alexa.SpeakSsml 系は全て失敗 |
英語含め無音 |
AlexaAnnouncement は別用途 |
ノード型名が読まれた |
仮説(現在)
Amazon の /api/behaviors/preview エンドポイントが、
何らかの理由で textToSpeak 内の日本語Unicodeを除去している。
考えられる原因:
- セッション/Cookie が古くなりJapanese TTS権限が変わった(Cookie の再生成で解消する可能性)
- Amazonが API の挙動を変更した(非公開APIのためいつでも変更しうる)
- 別のAPIエンドポイントが必要(未探索のルートがある可能性)
試行ログ続き(2026-03-03 午後)
Cookie 新規取得(auth4.js 再実行)
→ 変化なし。Cookie は原因ではなかった。
❌ AlexaAnnouncement ノードタイプ
→ 「えんえせんと」("AlexaAnnouncement" を日本語で読んだ)。コンテンツではなくノード名が読まれた。別用途のノード。
✅ 解決! sequenceJson の non-ASCII を \uXXXX エスケープに変換
var rawSequenceJson = JSON.stringify(sequenceObj).replace(
/[\u0080-\uffff]/g,
function(c) { return '\\u' + ('0000' + c.charCodeAt(0).toString(16)).slice(-4); }
);
→ 「これは日本語のテストです」が完璧に発話された!
✅ 解決済み(2026-03-03)
根本原因: sequenceJson 内の日本語文字を raw UTF-8 のまま Amazon に送ると、Amazon 側のパーサーがそれをフィルタリングして無視する。
解決策: JSON.stringify(sequenceObj) 後に non-ASCII 文字(\u0080 以上)を \uXXXX 形式のJSONエスケープシーケンスに変換してから sequenceJson として送る。
修正箇所: alexa-api/server.js と alexa-api/test_tts.js
確定したパラメータ:
type: 'Alexa.Speak'locale: 'ja-JP'textToSpeak: <日本語テキスト>sequenceJsonは non-ASCII を\uXXXXエスケープして送る
参考
- 実装記録:
docs/alexa-api/10_Alexa TTS API 実装記録 (2026-03-02).md