1年程前にHTML5の音声入力とGoogle翻訳APIを使ってこんなのを作ってみたけど、
HTML5の音声入力とGoogleの翻訳APIを試してみた | Shimabox Blog
Google翻訳APIがフリーで使えなくなっていて全然動かなくなってた。。
※参考記事
Google Translate API v2 有料化と v1廃止に伴って、Microsoft Translatorを使って見る余地はあるかもという話 – くるえるはてなくしょん
いやぁ〜、何というファ○ク。でもまぁ、そのままにしとくのも悔しいので、
こちらの記事にある通りMicrosoftの翻訳APIを試してみる事にしました。
Microsoftの翻訳APIは上記の参考記事中にもありあますが、
使ってみよう! Windows Live SDK/API:第38回 使ってみようMicrosoft Translator|gihyo.jp … 技術評論社
こちらの記事通りに進めたらあっさり使えました。
本当にあっさり。
完成品
んで、出来たのがこれです。
Microsoft Translation API And WebkitSpeech
※前作ったのとUI変わってません(キリッ
というか、めちゃくちゃAPIの返答が遅いです。
※応答が遅すぎるので翻訳結果が返ってくるまではラジオボタンをdisabledにしたりとかしてます
GoogleのAPIは早かったから使えなくなってしまったのは悔やまれますなぁ。。
ソース
拙いですが一応ソースコードも晒しときます。
要素名とか、関数名とか酷いですけど勘弁です。
HTML ※input周り
<input type="text" id="webkitSpeech" x-webkit-speech lang="ja" onwebkitspeechchange="translate(this.value);" />
<input type="radio" name="langAtt" id="inputJa" class='inputLangChoiceParts' value="ja" checked="checked">
<label for="inputJa" class="label">Input Japanese</label>
<input type="radio" name="langAtt" id="inputEn" class='inputLangChoiceParts' value="en">
<label for="inputEn" class="label">Input English</label>
<div class="choiceLang firstColumn label">
<input type="radio" name="lang" id="en" class='langChoiceParts' value="en" checked="checked"><label for="en" id="langToEn">To English</label>
<input type="radio" style="display:none;" name="lang" id="ja" class='langChoiceParts' value="ja"><label for="ja" id="langToJa" class='langChoiceParts' style="display:none;">To Japanese</label>
<input type="radio" name="lang" id="zh-CHS" class='langChoiceParts' value="zh-CHS"><label for="zh-CHS">To Chinese</label>
<input type="radio" name="lang" id="ar" class='langChoiceParts' value="ar"><label for="ar">To Arabic</label>
<input type="radio" name="lang" id="fr" class='langChoiceParts' value="fr"><label for="fr">To French</label>
</div>
<div class="choiceLang label">
<input type="radio" name="lang" id="de" class='langChoiceParts' value="de"><label for="de">To German</label>
<input type="radio" name="lang" id="it" class='langChoiceParts' value="it"><label for="it">To Italian</label>
<input type="radio" name="lang" id="ru" class='langChoiceParts' value="ru"><label for="ru">To Russian</label>
<input type="radio" name="lang" id="ko" class='langChoiceParts' value="ko"><label for="ko">To Korean</label>
</div>
<div class="choiceLang label">
<input type="radio" name="lang" id="pt-PT" class='langChoiceParts' value="pt-PT"><label for="pt-PT">To Portuguese</label>
<input type="radio" name="lang" id="es" class='langChoiceParts' value="es"><label for="es">To Spanish</label>
<input type="radio" name="lang" id="nl" class='langChoiceParts' value="nl"><label for="nl">To Dutch</label>
</div>
<div id="resultArea">
<textarea id="result"></textarea>
</div>
javascript ※ajaxがあったのでjQueryを利用
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script>
jQuery(function($){
// 翻訳を行う ※global
translate = function(text){
var fromLang = $('#webkitSpeech').attr('lang'),
toLang = getToLang();
obtainResult(text, fromLang, toLang);
};
// Event付与
var addEvents = function(){
$("input[name='langAtt']:radio").change(function(){
setAttributeLang($(this).val());
});
$("input[name='lang']:radio").change(function(){
changeLang();
});
$('#webkitSpeech').keyup(function(){
translate($(this).val());
});
};
// API result
var obtainResult = function(text, fromLang, toLang, doRecursive){
$.ajax({
type: "GET",
url: "http://api.microsofttranslator.com/V2/Ajax.svc/Translate",
dataType: "jsonp",
data: {
appId: appId, // 取得したBing APIのApplication ID
text: text,
from: fromLang,
to: toLang
},
jsonp: "oncomplete",
beforeSend : function(){
// 返答が遅いのでチェックボックスをdisabledに
$('input:radio').attr('disabled', true);
},
success : function(ret){
$('#result').val(ret);
// disabled解除
$('input:radio').attr('disabled', false);
// 翻訳結果を入力BOXに移してもう一度翻訳
if(doRecursive === true){
$('#webkitSpeech').val(ret);
translate(getInputBoxValue());
}
},
error : function(XMLHttpRequest, textStatus, errorThrown){
$('#result').val(textStatus);
$('input:radio').attr('disabled', false);
}
});
}
// 何語に翻訳するか
var getToLang = function(){
return $('input[name=lang]:checked').val();
}
// 入力言語(ja or en)の設定
var setAttributeLang= function(val){
$('#webkitSpeech').attr('lang', val);
changeDisplayLang(val);
changeAttributeLang(val);
}
// htmlの表示変更(入力言語変更後)
var changeDisplayLang = function(val){
var jaEle = $('#ja'),
enEle = $('#en'),
langToEn = $('#langToEn'),
langToJa = $('#langToJa');
if(val === 'ja'){
jaEle.css('display', 'none');
langToJa.css('display', 'none');
enEle.css('display', 'inline');
langToEn.css('display', 'inline');
if(jaEle.attr('checked') === 'checked'){
enEle.attr('checked', 'checked');
}
}else if (val === 'en'){
enEle.css('display', 'none');
langToEn.css('display', 'none');
jaEle.css('display', 'inline');
langToJa.css('display', 'inline');
if(enEle.attr('checked') === 'checked'){
jaEle.attr('checked', 'checked');
}
}
};
// 入力言語(ja or en)変更時処理
// 翻訳結果文字列を翻訳して入力BOXに移してからもう一度翻訳させる
var changeAttributeLang = function(fromLang){
var toLang = getToLang(),
inputFromLang = fromLang === 'en' ? 'ja' : 'en',
inputToLang = fromLang === 'en' ? 'en' : 'ja';
obtainResult(
getInputBoxValue(),
inputFromLang,
inputToLang,
doRecursive = true // もう一度APIを叩かせる
);
}
// 入力BOXの文字列取得
var getInputBoxValue = function(){
return $('#webkitSpeech').val();
}
// 翻訳言語変更
var changeLang = function(){
translate(getInputBoxValue());
}
// addEvent
addEvents();
});
</script>
余談
ちなみにdemoではajaxでサーバーに投げてphpのfile_get_contentsで
翻訳結果を取得してます。※appidあんまり見せたくし
で、そうすると何故か翻訳結果がダブルクォーテーションで囲まれて返ってくるのでダブルクォーテーションを取り除いてから翻訳結果を表示しています。
翻訳結果にこんな関数を挟んでます。※demoのソース参照
var doublequotationTrim = function(str){
var len = str.length;
return str.substr(1, len).substr(0, len - 2);
}
いやぁ、それにしてもめっちゃ応答遅いっすわぁ。。
それとも、他に早くする方法とかあるのかなぁ???Helpっす。。