GoogleのSpeechToTextとTranslateを利用して、日本語で音声入力した結果を英語に翻訳するものを作りたいと考えております。
ボタンで音声入力をするのですがその入力画面と処理結果を表示させる画面を分けたいと考えております。
処理結果のみ別HTMLで表示させるにはどうしたらよいのでしょうか。
プログラミングの学習を始めたばかりで、とても初歩的な質問だと思いますがご回答お願いいたします。
main.html
1<!DOCTYPE html> 2<html> 3<head> 4 <meta charset="UTF-8" /> 5 <title>サンプル</title> 6</head> 7<body> 8<button onclick="startRecording()">開始</button> 9<button onclick="endRecording()">終了</button> 10<div class="japanese" id="output_ja"></div> 11<div class="english" id="output_en"></div> 12 13<script src="api_key.js"></script> 14<script src="./lib/recorder.js"></script> 15<script src='main.js'></script> 16</body> 17</html>
main.js
1let audio_context; 2let recorder; 3 4function arrayBufferToBase64(buffer) { 5 let binary = ''; 6 let bytes = new Float32Array(buffer); 7 let len = bytes.byteLength; 8 for (let i = 0; i < len; i++) { 9 binary += String.fromCharCode(bytes[i]); 10 } 11 return window.btoa(binary); 12} 13 14function startUserMedia(stream) { 15 let input = audio_context.createMediaStreamSource(stream); 16 17 recorder = new Recorder(input); 18} 19 20 21let startRecording = function () { 22 audio_context.resume() 23 recorder && recorder.record(); 24 console.log("record start") 25}; 26 27let endRecording = function () { 28 recorder && recorder.stop(); 29 console.log("record stop"); 30 31 // create WAV download link using audio data blob 32 audioRecognize(); 33 34 recorder.clear(); 35}; 36 37function audioRecognize() { 38 recorder && recorder.exportWAV(function (blob) { 39 let reader = new FileReader(); 40 reader.onload = function () { 41 let result = new Uint8Array(reader.result); // reader.result is ArrayBuffer 42 let data = { 43 "config": { 44 "encoding": "LINEAR16", 45 "sampleRateHertz": 48000, 46 "languageCode": "ja-JP" 47 }, 48 "audio": { 49 "content": arrayBufferToBase64(result) 50 } 51 }; 52 console.log("audio send..."); 53 fetch('https://speech.googleapis.com/v1/speech:recognize?key=' + apiKey, { 54 method: 'POST', 55 headers: { 56 'Content-Type': 'application/json; charset=utf-8' 57 }, 58 body: JSON.stringify(data) 59 }).then(function (response) { 60 return response.text(); 61 }).then(function (text) { 62 let result_json = JSON.parse(text); 63 text = result_json.results[0].alternatives[0].transcript 64 output_ja.innerHTML += "\n" + text 65 console.log("RESULT: " + text); 66 console.log(result_json.results[0].alternatives[0].transcript); 67 console.log(data) 68 69 let fromLang = 'ja'; 70 let toLang = 'en'; 71 let URL = "https://translation.googleapis.com/language/translate/v2?key="+apiKey+"&q="+encodeURI(text)+"&source="+fromLang+"&target="+toLang 72 let xhr = new XMLHttpRequest() 73 xhr.open('POST', [URL], false) 74 xhr.send(); 75 if (xhr.status === 200) { 76 let json = xhr.responseText; 77 let obj = JSON.parse(json); 78 result = obj.data.translations[0].translatedText 79 output_en.innerHTML += "\n" + result 80 console.log("RESULT: " + text); 81 console.log(obj.data.translations[0].translatedText); 82 } 83 }); 84 }; 85 reader.readAsArrayBuffer(blob) 86 87 }); 88} 89 90window.onload = function init() { 91 try { 92 // webkit shim 93 window.AudioContext = window.AudioContext || window.webkitAudioContext; 94 navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia; 95 window.URL = window.URL || window.webkitURL; 96 97 audio_context = new AudioContext(); 98 } catch (e) { 99 alert('No web audio support in this browser!'); 100 } 101 102 navigator.getUserMedia({audio: true}, startUserMedia, function (e) { 103 }); 104};

回答1件
あなたの回答
tips
プレビュー