##目的
スプシのセルに入ってるテキスト(中国語)を発話させたい
##現状
以下のGASを書いてる横で対象のスプシのシートを開いて、実行ボタンを押すとReferenceError: SpeechSynthesisUtterance is not defined
と言われてしまうのですがどうしたらいいでしょうか。
また、SpeechSynthesisUtterance
はWeb Speech APIの仕様に書いてあったモジュール(?)なのですがこのように外部のAPIはGAS内で使えるのでしょうか?ちなみにセルに入ってるテキストが取得できることまでは確認できました。
調べて・下記の回答者のご助言でわかったこと
speech.htmlのようなHTMLファイルを別に作って、gasファイルで取得したセルの値を渡す。HTMLファイルはもう一つindex.htmlみたいなのが必要っぽい。
以下main.gsファイル
function speak (response_text) { // 現在アクティブなスプレッドシートを取得 var ss = SpreadsheetApp.getActiveSpreadsheet(); // そのスプレッドシートにあるn-1番目のシートを取得 // var sheet = ss.getSheets()[2]; // 現在開いているシートを取得 var sheet = ss.getActiveSheet(); // そのシートにあるアクティブなセルを取得 var text = sheet.getRange("B2").getValue(); Logger.log(text); var text = new SpeechSynthesisUtterance(); // 発言を作成 text.text = response_text; // 言語 中国語 text.lang = "zh-CH" // 速度 0.1-10 text.rate = 1 // 高さ 0-2 text.pitch = 1 // 音量 0-1 text.volume = 1 speechSynthesis.speak(text); }
Googleのサーバー側の不具合だったりしませんかね。
少し時間を空けて試してみるとどうでしょうか?
>以下のGASを書いてる
一応確認ですが、対象のスプレッドシートからエディタを開いて、そこにコードを書いて実行してますよね?
はい、スプシの「ツール>スクリプトエディタ」から開いたページで書きました。もしかして上記のファイル以外にHTMLファイルが必要だったりしますでしょうか?
すいません、ただいまセルの値が取れました。何回か試しても「不明なエラーが発生しました。」と出たのですが、不明なエラーと表示されたらGoogleのサーバーが不調を疑った方が良さそうですね。お騒がせしました、ありがとうございました。
sawa様
もしお分かりでしたら・お時間ありましたら上記に追記しました質問にお答えいただけると大変助かります。
質問を丸ごと差し替えるのはNGです。最初の件が解決したのであれば、自己解決でクローズして、新たな質問は別質問として立ち上げるべきです。
いずれにせよ、申し訳ないですが私は詳しくないので、別の回答者を待った方がいいです。
↓詳しくないなりに私見を
なんとなくですが、GASそのままで音声読み上げは出来ないと思うので、HTML側のjavascriptにセルの値を渡して読み上げるみたいな形にする方法がよいんじゃないでしょうか?
https://www.pre-practice.net/2016/06/blog-post_20.html
このサイトのをサイドバーでボタン押したらアクティブセル(B2セル?)を取得して読み上げって流れにアレンジする感じが良いと思います。
あと少し調べてみましたが、中国語は zh-CNでは?
>質問を丸ごと差し替えるのはNGです。最初の件が解決したのであれば、自己解決でクローズして、新たな質問は別質問として立ち上げるべきです。
失礼しました、気をつけます。
また、関連のリンクを添付してくださりありがとうございます。
>あと少し調べてみましたが、中国語は zh-CNでは?
ブラウザで下記のような処理を実行した結果ですか?
function loadVoices() {
console.log(window.speechSynthesis.getVoices().map(x => [x.name, x.lang].join("\t")).join("\r\n"));
};
loadVoices();
window.speechSynthesis.onvoiceschanged = function(e) { loadVoices(); }
いや、参考に掲載したサイトのコードで中国語を試してみたら、zh-CHだと発音が変だったんでgoogleで 中国語 zh-CH で検索したら、もしかして:中国語 zh-CN と、Google先生に指摘を受けました。で、こっち試したら中国語の発音だったんでそうかなと。
"x" is not definedタイプのエラーの場合は、gas側ではおそらく機能として使えるものではないと思われます(gasに表示されるエラーと正確に一致するかどうかはわかりませんが、参考にはなると思います→https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Errors/Not_defined)
軽く調べてウェブアプリ環境で試してみましたが、そこではAPI自体は機能しました。まず、JavaScript環境で機能するコードが記述できているかどうか確認してみては。
sawa様
そういうことでしたか。その辺りまでたどり着いたらまた試したいと思います、ありがとうございます。
3_April_2021様
はい、私もエディタで書いてブラウザにペっと貼ってAPI自体が機能することは確認できました。あとはGASに認識させる方法がわかれば良いのですが...
他の方法もあるかもしれませんが、とりあえずofficeの杜さん[https://officeforest.org/wp/2018/05/12/google-apps-scriptでダイアログボックスやサイドバーを作る/]のような方法でhtmlを使える状態にしてください。次に、セル値の代わりに適切な文字列を入力して(言い換えれば、html表示以外の処理でgsを使用せずに)、目的の処理を行えるかどうかを確認してください。
上の処理が可能であれば、残りはgoogle.script.runで解決できる問題だと思います。私も詳しいわけではないのでこの方法の適切性については言えない点と、投稿されたコードから理解度が図りかねたので具体的指摘ができなかった点は申し訳ありません。
私が書ける範囲で回答しときました。
同じような質問を別に立ち上げられてますが、そちらもクローズしておいてください。
回答1件
あなたの回答
tips
プレビュー