・モヤさまのショウ君にいろいろ喋らせるVBAマクロ(1)
//www.ka-net.org/blog/?p=4714
・モヤさまのショウ君にいろいろ喋らせるVBAマクロ(2)
//www.ka-net.org/blog/?p=4718
で紹介した「VoiceText Web API」を、今度はGoogle Apps Scriptから使ってみました。
※ APIキーの申請や利用方法については上記記事をご参照ください。
※ Webアプリケーションとしてスクリプトを作成する方法は「[Google Apps Script]Webアプリケーションを作成する。」をご参照ください。
※ 拡張サービスを使用しているので、「[Google Apps Script]拡張サービスを使用する。」を参考にDrive APIを有効にしてください。
・コード.gs
function doGet() {
return HtmlService.createTemplateFromFile('page').evaluate().setSandboxMode(HtmlService.SandboxMode.NATIVE);
}
function getVoice(api_key, txt) {
var file_name = "tts_file.wav";
var fol = DriveApp.getRootFolder();
//wavファイルを事前に削除
try {
fol.removeFile(fol.getFilesByName(file_name).next());
} catch(e) {
//何もしない
}
//VoiceText Web API呼び出し
var url = "https://api.voicetext.jp/v1/tts";
txt = encodeURIComponent(txt);
var dat = "text=" + txt + "&speaker=show";
var opt = {
"contentType" : "application/x-www-form-urlencoded",
"method" : "POST",
"headers" : {
"Authorization" : " Basic " + Utilities.base64Encode(api_key + ":")
},
"payload" : dat
}
//Google ドライブにwavファイル保存
var res = UrlFetchApp.fetch(url, opt);
var file = fol.createFile(res.getBlob());
file.setName(file_name);
file.setSharing(DriveApp.Access.ANYONE, DriveApp.Permission.VIEW); //権限設定(誰でも閲覧可)
return file.getUrl();
}
・page.html
<style>
* {
padding: 5px;
}
td {
border-style: none;
}
</style>
<table>
<tr>
<td>APIキー</td>
<td><input id="txtKey" type="text" size="30" value=""></td>
</tr>
<tr>
<td>テキスト</td>
<td><textarea id="txtTarget" cols=40 rows=4>こんにちは。</textarea></td>
</tr>
<tr>
<td colspan="2"><input id="btnCall" type="button" value="VoiceText Web API呼び出し"></td>
</tr>
<tr><td colspan="2"> </td></tr>
<tr>
<td colspan="2"><div id="divWav"></div></td>
</tr>
</table>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
$(function(){
$("#btnCall").click(function(){
$(this).attr("disabled", "disabled");
$("#divWav").empty();
google.script.run.withSuccessHandler(onSuccess).getVoice($("#txtKey").val(), $("#txtTarget").val());
});
});
function onSuccess(dat) {
$("#divWav").append('<a href="' + dat + '" target="_blank" title="wavファイル">リンクをクリックするとwavファイルのダウンロードページが表示されます。</a>');
$("#btnCall").removeAttr("disabled");
}
</script>
動作としては、
- VoiceText Web APIを呼び出します。
- 返ってきたwavファイルをGoogle ドライブに保存します。
- Google ドライブに保存したwavファイルを開いて再生します。
といった流れになっています。
■ 使い方
- Webアプリケーションを実行します。
- APIキーと読み上げるテキストを入力し、「VoiceText Web API呼び出し」ボタンをクリックします。
- wavファイルへのリンクをクリックします。
- Google ドライブ上のファイルが開かれます。このときMusic Player for Google Driveを使うと、ローカルにダウンロードすることなく、直接wavファイルを再生することができます。
Google Apps ScriptはUrlFetchApp.fetchメソッドを使うと簡単にWeb APIが呼び出せるので便利です。
・・・上記スクリプト、本当は下記のように動的にaudio要素を追加してwavファイルを再生(wavファイル受取 → Base64エンコード → data URI Schemeでソース指定)する予定でした。
・コード.gs
// Script-as-app template.
function doGet() {
return HtmlService.createTemplateFromFile('page').evaluate().setSandboxMode(HtmlService.SandboxMode.NATIVE);
}
function getVoice(api_key, txt) {
var url = "https://api.voicetext.jp/v1/tts";
txt = encodeURIComponent(txt);
var dat = "text=" + txt + "&speaker=show";
var opt = {
"contentType" : "application/x-www-form-urlencoded",
"method" : "POST",
"headers" : {
"Authorization" : " Basic " + Utilities.base64Encode(api_key + ":")
},
"payload" : dat
}
var res = UrlFetchApp.fetch(url, opt);
return Utilities.base64Encode(res.getContent());
}
・page.html
<style>
* {
padding: 5px;
}
td {
border-style: none;
}
</style>
<table>
<tr>
<td>APIキー</td>
<td><input id="txtKey" type="text" size="30" value=""></td>
</tr>
<tr>
<td>テキスト</td>
<td><textarea id="txtTarget" cols=40 rows=4>こんにちは。</textarea></td>
</tr>
<tr>
<td colspan="2"><input id="btnCall" type="button" value="VoiceText Web API呼び出し"></td>
</tr>
<tr><td colspan="2"> </td></tr>
<tr>
<td colspan="2"><div id="divAudio"></div></td>
</tr>
</table>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
$(function(){
$('#btnCall').click(function(){
google.script.run.withSuccessHandler(onSuccess).getVoice($("#txtKey").val(), "こんにちは。");
});
});
function onSuccess(dat) {
$("#divAudio").empty();
var audio = $('<audio />', {
autoPlay : 'autoplay',
controls : 'controls'
});
$('<source />').attr('src', 'data:audio/wav;base64,' + dat).appendTo(audio);
$("#divAudio").append(audio);
}
</script>
が、「Issue 1601 – google-caja – HTML5 audio element integration」にもあるように、Cajaが余計なことをしてくれたばっかりに、audio要素での再生ができず、結局、Google ドライブにwavファイル保存 → 再生、というワンクッション置く形になりました・・・orz






















VoiceText Web APIは使っていませんが、
“`
“`
でMP3の再生を試したところうまくいきました。
お試しなので、Base64のデータは以下のサイトで用意しました。
Base64エンコード(ファイル)(Base64 Encode Binary)|Web便利ツール@ツールタロウ
https://tool-taro.com/base64_encode_binary/