Files
windmill_workflow/docs/archive/alexa-tts/12_ローカルで試したこと.md

6.4 KiB
Raw Permalink Blame History

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.jsVPS上の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.SpeakSsmltextToSpeak ではなく別キーを要求する模様。

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を除去している。

考えられる原因:

  1. セッション/Cookie が古くなりJapanese TTS権限が変わったCookie の再生成で解消する可能性)
  2. Amazonが API の挙動を変更した非公開APIのためいつでも変更しうる
  3. 別のAPIエンドポイントが必要(未探索のルートがある可能性)

試行ログ続き2026-03-03 午後)

→ 変化なし。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.jsalexa-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