// voice recognition document.getElementById("voice_input_close").addEventListener("click", function () { CCB.downloadModelUrl = ''; $('#voice_input_modal').modal('close'); $('#setting_voice_input_modal').modal('open'); }); var processSpeechClick = true; // 选择什么方式发送数据 $('.select_send_way span').click(function () { if ($(this)[0].className.indexOf('translatable_send_cloud') > -1) { window.send = "cloud"; $('.send_cloud').css({ 'display': 'block', 'position': 'relative' }); $('.send_module').css({ 'display': 'none', 'position': 'relative' }); } else { window.send = "module"; $('.send_cloud').css({ 'display': 'none', 'position': 'relative' }); $('.send_module').css({ 'display': 'block', 'position': 'relative', "height": "100px" }); } console.log(window.send) $(this).addClass('select_send_way_color') $(this).siblings().removeClass('select_send_way_color') }) // 点击连接发送数据 $('.translatable_connectBtns').click(function () { $(this).css('display', 'none'); $(this).siblings().css({ "float": "right", 'margin-right': '5px', 'display': 'block' }) CCB.socket.emit('command', { cmd: 'open', option: { port: $('#ports').val(), baud: $('#serial_baud').val() } }); }) function sendModule(data, type) { if ((CCB.isOpen && CCB.userState) || type === "send") { CCB.socket.emit('command', { cmd: 'send', option: { msg: `SOF|${data}|`, postfix: "blc" } }) } } // 点击关闭socket连接 $('.translatable_disconnectBtns').click(function () { $(this).css('display', 'none'); $(this).siblings().css({ "float": "right", 'margin-right': '5px', 'display': 'block' }) CCB.socket.emit('command', { cmd: 'close' }); }) // 情绪识别发送脸部分析结果 var capture_type = 'emotionResults_age' $('#select_send_capture').change(function () { capture_type = $(this).val() console.log(capture_type) }); var speechDemo_gumStream; //stream from getUserMedia() var speechDemo_rec; //Recorder.js object var speechDemo_input; //MediaStreamAudioSourceNode we'll be recording var speechDemo_AudioContext = window.AudioContext || window.webkitAudioContext; var speechDemo_audioContext; //audio context to help us record function processSpeech() { var selectedLang = document.getElementById("speech_language_selection").options[document.getElementById("speech_language_selection").selectedIndex].value; // console.log($('#speech_button')[0].text); // if ($('#speech_button')[0].text === CCB.str_group.end_speech) { // return; // } if (selectedLang == "english") { console.log("selected english."); recognizeEnglish(); } else if (selectedLang == "cantonese") { console.log("selected cantonese."); recognizeChinese("cantonese"); } else if (selectedLang == "mandarin") { console.log("selected chinese."); recognizeChinese("mandarin"); } } function speechDemoSendCloudRequest(recognizedText) { var jsontoCloud = "{\"EM_data\": \"" + recognizedText + "\"}"; if (window.send == 'module') { sendModule(recognizedText) } else { var eventURL = $("#AI_voice_events").val() $('#speechDemoCloudRequest').css("color", "orange"); document.getElementById('speechDemoCloudRequest').innerHTML = CCB.str_group.cloud_event_syncing; $.ajax({ type: "POST", url: eventURL, data: jsontoCloud, contentType: "application/json; charset=utf-8", dataType: "json" }) .done(function (xhr) { // console.log("error"); // console.log(xhr.status); if (xhr.status == 200) { $('#speechDemoCloudRequest').css("color", "#2196f3"); document.getElementById('speechDemoCloudRequest').innerHTML = CCB.str_group.cloud_event_success; } else if (xhr.status !== 200) { $('#speechDemoCloudRequest').css("color", "red"); document.getElementById('speechDemoCloudRequest').innerHTML = CCB.str_group.cloud_event_failed; } }) .error(function (xhr) { // console.log("error"); // console.log(xhr.status); if (xhr.status == 200) { $('#speechDemoCloudRequest').css("color", "#2196f3"); document.getElementById('speechDemoCloudRequest').innerHTML = CCB.str_group.cloud_event_success; } else if (xhr.status !== 200) { $('#speechDemoCloudRequest').css("color", "red"); document.getElementById('speechDemoCloudRequest').innerHTML = CCB.str_group.cloud_event_failed; } }); } } /* start of baidu api */ //var speechBackendAPIURL = 'http://localhost:5000/api/speech'; // var speechBackendAPIURL = 'http://localhost:4003/speech'; var speechBackendAPIURL = '//ai-api.cocorobo.cn/speech'; // var speechBackendAPIURL = '//speech.ai-api.cocorobo.hk/speech'; function recognizeEnglish() { speechDemo_URL = window.URL || window.webkitURL; var constraints = { audio: true, video: false } navigator.mediaDevices.getUserMedia(constraints).then(function (stream) { // console.log("getUserMedia() success, stream created, initializing Recorder.js ..."); speechDemo_audioContext = new AudioContext(); speechDemo_audioContext.resume(); // document.getElementById("formats").innerHTML = "Format: 1 channel pcm @ " + speechDemo_audioContext.sampleRate / 1000 + "kHz" speechDemo_gumStream = stream; speechDemo_input = speechDemo_audioContext.createMediaStreamSource(stream); speechDemo_rec = new Recorder(speechDemo_input, { numChannels: 1 }); speechDemo_rec.record(); // console.log("Recording started"); // setTimeout(function () { $('#speech_process_title').html(CCB.str_group.speech_recognition_chinese_recordingcount5); }, 50); // setTimeout(function () { $('#speech_process_title').html(CCB.str_group.speech_recognition_chinese_recordingcount4); }, 1000); // setTimeout(function () { $('#speech_process_title').html(CCB.str_group.speech_recognition_chinese_recordingcount3); }, 2000); // setTimeout(function () { $('#speech_process_title').html(CCB.str_group.speech_recognition_chinese_recordingcount2); }, 3000); // setTimeout(function () { $('#speech_process_title').html(CCB.str_group.speech_recognition_chinese_recordingcount1); }, 4000); }).catch(function (err) { }); if (processSpeechClick) { $('#speech_button').html(CCB.str_group.end_speech) $('#speech_button').removeClass('blue') $('#speech_button').addClass('red') $('#speech_process_title').css("color", "red"); $('#speech_process_title').html(CCB.str_group.speech_recognition_chinese_recordingcount5); processSpeechClick = false; } else { $('#speech_button').html(CCB.str_group.start_speech) $('#speech_button').removeClass('red') $('#speech_button').addClass('blue') $('#speech_button').addClass('disabled') $('#speech_process_title').css("color", "#2196F3"); // CCB.str_group.speech_recognition_chinese_recorded_recognizing $('#speech_process_title').html(CCB.str_group.speech_recognition_chinese_recorded_recognizing); processSpeechClick = true; speechDemo_rec.stop(); speechDemo_gumStream.getAudioTracks()[0].stop(); speechDemo_rec.exportWAV(recogntionRequestEnglish); } // setTimeout(function () { // }, 5000); } function recogntionRequestEnglish(blob) { var url = speechDemo_URL.createObjectURL(blob); var filename = new Date().toISOString(); var formData = new FormData(); formData.append('file', blob, filename); formData.append('dev_pid', '1737'); $.ajax({ url: speechBackendAPIURL, data: formData, type: 'POST', contentType: false, // NEEDED, DON'T OMIT THIS (requires jQuery 1.6+) processData: false, // NEEDED, DON'T OMIT THIS timeout: 60000, }) .done(function (response, data) { $('#speech_button').removeClass("disabled"); if (response.data.err_msg == "success.") { // console.log(response); // console.log(response.data.result[0]); $('#speech_textarea').css("color", "rgba(0,0,0,.9)"); document.getElementById('speech_textarea').innerHTML = response.data.result[0]; $('#speech_process_title').css("color", "black"); $('#speech_process_title').html(CCB.str_group.speech_recognition_chinese_recognized); speechDemoSendCloudRequest(response.data.result[0]); } else if (response.data.err_msg !== "success.") { // console.log("bad"); $('#speech_process_title').css("color", "red"); $('#speech_process_title').html(CCB.str_group.speech_recognition_chinese_recognize_failed); } }) .error(function () { $('#speech_button').removeClass("disabled"); $('#speech_process_title').css("color", "red"); $('#speech_process_title').html(CCB.str_group.speech_recognition_chinese_recognize_network_err); }); } function recognizeChinese(accent) { speechDemo_URL = window.URL || window.webkitURL; var constraints = { audio: true, video: false } navigator.mediaDevices.getUserMedia(constraints).then(function (stream) { // console.log("getUserMedia() success, stream created, initializing Recorder.js ..."); speechDemo_audioContext = new AudioContext(); speechDemo_audioContext.resume(); // document.getElementById("formats").innerHTML = "Format: 1 channel pcm @ " + speechDemo_audioContext.sampleRate / 1000 + "kHz" speechDemo_gumStream = stream; speechDemo_input = speechDemo_audioContext.createMediaStreamSource(stream); speechDemo_rec = new Recorder(speechDemo_input, { numChannels: 1 }); speechDemo_rec.record(); }).catch(function (err) { }); if (processSpeechClick) { $('#speech_button').html(CCB.str_group.end_speech) $('#speech_button').removeClass('blue') $('#speech_button').addClass('red') $('#speech_process_title').css("color", "red"); $('#speech_process_title').html(CCB.str_group.speech_recognition_chinese_recordingcount5); processSpeechClick = false; } else { $('#speech_button').html(CCB.str_group.start_speech) $('#speech_button').removeClass('red') $('#speech_button').addClass('blue') $('#speech_button').addClass('disabled') $('#speech_process_title').css("color", "#2196F3"); // CCB.str_group.speech_recognition_chinese_recorded_recognizing $('#speech_process_title').html(CCB.str_group.speech_recognition_chinese_recorded_recognizing); speechDemo_rec.stop(); speechDemo_gumStream.getAudioTracks()[0].stop(); processSpeechClick = true; if (accent == "mandarin") { speechDemo_rec.exportWAV(recogntionRequestMandarin); } else if (accent == "cantonese") { speechDemo_rec.exportWAV(recogntionRequestCantonese); } } } function recogntionRequestMandarin(blob) { var url = speechDemo_URL.createObjectURL(blob); var filename = new Date().toISOString(); var formData = new FormData(); formData.append('file', blob, filename); formData.append('dev_pid', '1536'); $.ajax({ url: speechBackendAPIURL, data: formData, type: 'POST', contentType: false, // NEEDED, DON'T OMIT THIS (requires jQuery 1.6+) processData: false, // NEEDED, DON'T OMIT THIS timeout: 60000, }) .done(function (response, data) { $('#speech_button').removeClass("disabled"); if (response.data.err_msg == "success.") { // console.log(response); // console.log(response.data.result[0]); $('#speech_textarea').css("color", "rgba(0,0,0,.9)"); document.getElementById('speech_textarea').innerHTML = response.data.result[0]; $('#speech_process_title').css("color", "black"); $('#speech_process_title').html(CCB.str_group.speech_recognition_chinese_recognized); speechDemoSendCloudRequest(response.data.result[0]); } else if (response.data.err_msg !== "success.") { // console.log("bad"); $('#speech_process_title').css("color", "red"); $('#speech_process_title').html(CCB.str_group.speech_recognition_chinese_recognize_failed); } }) .error(function () { $('#speech_button').removeClass("disabled"); $('#speech_process_title').css("color", "red"); $('#speech_process_title').html(CCB.str_group.speech_recognition_chinese_recognize_network_err); }); } function recogntionRequestCantonese(blob) { var url = speechDemo_URL.createObjectURL(blob); var filename = new Date().toISOString(); var formData = new FormData(); formData.append('file', blob, filename); formData.append('dev_pid', '1637'); // console.log("recognizing"); $.ajax({ url: speechBackendAPIURL, data: formData, type: 'POST', contentType: false, // NEEDED, DON'T OMIT THIS (requires jQuery 1.6+) processData: false, // NEEDED, DON'T OMIT THIS timeout: 60000, }) .done(function (response, data) { $('#speech_button').removeClass("disabled"); if (response.data.err_msg == "success.") { // console.log(response); // console.log(response.data.result[0]); $('#speech_textarea').css("color", "rgba(0,0,0,.9)"); var resultToTraditionChinese = $.s2t(response.data.result[0].substring(0, response.data.result[0].length - 1)); document.getElementById('speech_textarea').innerHTML = resultToTraditionChinese; $('#speech_process_title').css("color", "black"); $('#speech_process_title').html(CCB.str_group.speech_recognition_chinese_recognized); speechDemoSendCloudRequest(resultToTraditionChinese); } else if (response.data.err_msg !== "success.") { console.log("bad"); $('#speech_process_title').css("color", "red"); $('#speech_process_title').html(CCB.str_group.speech_recognition_chinese_recognize_failed); } }) .error(function () { $('#speech_button').removeClass("disabled"); $('#speech_process_title').css("color", "red"); $('#speech_process_title').html(CCB.str_group.speech_recognition_chinese_recognize_network_err); }); } /* End */ // emotion recognition Webcam.set({ width: 320, height: 240, dest_width: 320, dest_height: 240, image_format: 'jpeg', jpeg_quality: 90 }); $('#update_Coevent_web').on('click', function () { getCoCloudEvent(); }); $('#update_Coevent_voice').on('click', function () { getCoCloudEvent(); }); $('#update_Coevent_web_recorg').on('click', function () { getCoCloudEvent(); }) function take_snapshot() { // take snapshot and get image data Webcam.snap(function (data_uri) { // display results in page document.getElementById('emotionResults').innerHTML = ''; }); } function cameraSwitch() { //if checked, turn on camera of computer if ($('#camera_switch').prop('checked') == true) { document.getElementById("webCamPlaceholder").style.display = "none"; document.getElementById("webCamPlaceholder").style.margin = "0"; Webcam.attach('#webCamera'); $("#emotionRequestStatus").removeClass("disabled"); Materialize.toast(CCB.str_group.speech_recognition_cameraon, 1500); } else { document.getElementById("webCamPlaceholder").style.display = "block"; document.getElementById("webCamPlaceholder").style.margin = "-240px 0 0 0"; Webcam.reset(); $("#emotionRequestStatus").addClass("disabled"); Materialize.toast(CCB.str_group.speech_recognition_cameraoff, 1500); } } function jump(h) { var url = location.href; //Save down the URL without hash. location.href = "#" + h; //Go to the target element. history.replaceState(null, null, url); //Don't like hashes. Changing it back. } document.getElementById("emotion_recognition_close").addEventListener("click", function () { CCB.downloadModelUrl = ''; $('#webcam_capture_modal').modal('close'); $('#setting_webcam_capture_modal').modal('open'); document.getElementById("webCamera").style.width = "0"; document.getElementById("webCamera").style.height = "0"; document.getElementById("webCamPlaceholder").style.display = "block"; document.getElementById("webCamPlaceholder").style.margin = "0"; if (document.getElementById('camera_switch').checked == true) { document.getElementById('camera_switch').checked = false; Webcam.reset(); } }); function processImage() { var mscsImageUrl; jump('emotionRecognitionTitle'); // CCB.str_group.emotion_recognition_button_analyzing document.getElementById("emotionRequestStatus").innerHTML = CCB.str_group.emotion_recognition_button_analyzing; document.getElementById("emotionRequestStatus").setAttribute("class", "waves-effect waves-light btn blue translatable_face_analyze disabled") // webcam part Webcam.snap(function (data_uri) { // display results in page document.getElementById('emotionResults').innerHTML = ''; document.getElementById("SnapshotPlaceholder").style.display = "none"; var imageURLbase64 = data_uri; Materialize.toast(CCB.str_group.emotion_recognition_image_captured, 1000); var ImageURL = imageURLbase64; var block = ImageURL.split(";"); var contentType = block[0].split(":")[1]; var realData = block[1].split(",")[1]; var blob = b64toBlob(realData, contentType); var formData = new FormData(); formData.append('avatar', blob); //params // var params = { // "returnFaceId": "true", // "returnFaceLandmarks": "false", // "returnFaceAttributes": "age,gender,facialHair,glasses,emotion,hair,accessories" // }; var yekReverse = "NmJhZjc4NzUzMmVmNGVlYzhiYzkzYzg4NTE4Yjg5MTY="; // console.log(atob(yekReverse)); $.ajax({ // url: "https://emotion-recognition-cocoblockly.cognitiveservices.azure.com/face/v1.0/detect?" + $.param(params), url: "https://ai-api.cocorobo.cn/face", type: "POST", headers: { "Ocp-Apim-Subscription-Key": atob(yekReverse) }, contentType: 'application/json', // processData: false, data: JSON.stringify({ 'image': realData }), timeout: 10000, // set timeout for 10 seconds }) .done(function (data) { var emotionState; /*if there is no face image, no data response * response data: [] */ document.getElementById("emotionRequestStatus").innerHTML = CCB.str_group.emotion_recognition_button_analyze; document.getElementById("emotionRequestStatus").setAttribute("class", "waves-effect waves-light btn blue translatable_face_analyze") setTimeout(function () { jump('emotionRequestStatus'); }, 500); if (data.data.error_code !== 0) { // CCB.str_group.emotion_recognition_results_title document.getElementById("facialanalysistitle").innerHTML = CCB.str_group.emotion_recognition_results_title; document.getElementById("emotionResults_emotion").innerHTML = CCB.str_group.emotion_recognition_results_failed_guess; document.getElementById("emotionResults_age").innerHTML = CCB.str_group.emotion_recognition_results_failed_guess; document.getElementById("emotionResults_gender").innerHTML = CCB.str_group.emotion_recognition_results_failed_guess; document.getElementById("emotionResults_glasses").innerHTML = CCB.str_group.emotion_recognition_results_failed_guess; Materialize.toast(emotionState, 1000); var eventURL = $("#AI_webcam_events").val(); return; } else { var hans = { "angry": "angry(愤怒)", "disgust": "disgust(厌恶)", "fear": "fear(恐惧)", "happy": "happy(快乐)", "sad": "sad(悲伤)", "surprise": "surprise(惊讶)", "neutral": "neutral(中性)", "pouty": "pouty(撅嘴)", "grimace": "grimace(鬼脸)" } var hant = { "angry": "angry(憤怒)", "disgust": "disgust(厭惡)", "fear": "fear(恐懼)", "happy": "happy(快樂)", "sad": "sad(悲傷)", "surprise": "surprise(驚訝)", "neutral": "neutral(中性)", "pouty": "pouty(撅嘴)", "grimace": "grimace(鬼臉)" } if (localStorage.getItem("handPyLanguage") == "zh-hans") { document.getElementById("emotionResults_emotion").innerHTML = hans[data.data.result.face_list[0].emotion.type]; document.getElementById("emotionResults_age").innerHTML = data.data.result.face_list[0].age; document.getElementById("emotionResults_gender").innerHTML = data.data.result.face_list[0].gender.type == "male" ? data.data.result.face_list[0].gender.type + "(男)" : data.data.result.face_list[0].gender.type + "(女)"; document.getElementById("emotionResults_glasses").innerHTML = data.data.result.face_list[0].glasses.type == "common" ? data.data.result.face_list[0].glasses.type + "(有)" : data.data.result.face_list[0].glasses.type + "(无)"; // document.getElementById("emotionResults_appearance").innerHTML = data.data.result.face_list[0].beauty; document.getElementById("emotionResults_expression").innerHTML = data.data.result.face_list[0].expression.type == "smile" ? data.data.result.face_list[0].expression.type + "(微笑)" : (data.data.result.face_list[0].expression.type == "laugh" ? data.data.result.face_list[0].expression.type + "(大笑)" : data.data.result.face_list[0].expression.type + "(无)"); } else if (localStorage.getItem("handPyLanguage") == "zh-hant") { document.getElementById("emotionResults_emotion").innerHTML = hant[data.data.result.face_list[0].emotion.type]; document.getElementById("emotionResults_age").innerHTML = data.data.result.face_list[0].age; document.getElementById("emotionResults_gender").innerHTML = data.data.result.face_list[0].gender.type == "male" ? data.data.result.face_list[0].gender.type + "(男)" : data.data.result.face_list[0].gender.type + "(女)"; document.getElementById("emotionResults_glasses").innerHTML = data.data.result.face_list[0].glasses.type == "common" ? data.data.result.face_list[0].glasses.type + "(有)" : data.data.result.face_list[0].glasses.type + "(無)"; // document.getElementById("emotionResults_appearance").innerHTML = data.data.result.face_list[0].beauty; document.getElementById("emotionResults_expression").innerHTML = data.data.result.face_list[0].expression.type == "smile" ? data.data.result.face_list[0].expression.type + "(微笑)" : (data.data.result.face_list[0].expression.type == "laugh" ? data.data.result.face_list[0].expression.type + "(大笑)" : data.data.result.face_list[0].expression.type + "(無)"); } else { document.getElementById("emotionResults_emotion").innerHTML = data.data.result.face_list[0].emotion.type; document.getElementById("emotionResults_age").innerHTML = data.data.result.face_list[0].age; document.getElementById("emotionResults_gender").innerHTML = data.data.result.face_list[0].gender.type; document.getElementById("emotionResults_glasses").innerHTML = data.data.result.face_list[0].glasses.type; // document.getElementById("emotionResults_appearance").innerHTML = data.data.result.face_list[0].beauty; document.getElementById("emotionResults_expression").innerHTML = data.data.result.face_list[0].expression.type; } if (window.send == 'module') { sendModule(document.getElementById(capture_type).innerHTML) } else { document.getElementById("facialanalysistitle").innerHTML = CCB.str_group.emotion_recognition_results_title_default; $('.emotionResultsAll_single').css("color", "rgba(0,0,0,1)"); var jsontoCloud = "" if (document.getElementById("emotionResults_emotion").innerHTML.indexOf("(") != -1) { jsontoCloud = "{\"emotion\": \"" + document.getElementById("emotionResults_emotion").innerHTML.split("(")[0] + "\"," + " \"age\": \"" + Number(document.getElementById("emotionResults_age").innerHTML) + "\", " + " \"gender\": \"" + document.getElementById("emotionResults_gender").innerHTML.split("(")[0] + "\"," + " \"glasses\": \"" + document.getElementById("emotionResults_glasses").innerHTML.split("(")[0] + "\"," + " \"expression\": \"" + document.getElementById("emotionResults_expression").innerHTML.split("(")[0] + "\"}"; } else{ jsontoCloud = "{\"emotion\": \"" + document.getElementById("emotionResults_emotion").innerHTML + "\"," + " \"age\": \"" + Number(document.getElementById("emotionResults_age").innerHTML) + "\", " + " \"gender\": \"" + document.getElementById("emotionResults_gender").innerHTML + "\"," + " \"glasses\": \"" + document.getElementById("emotionResults_glasses").innerHTML + "\"," + " \"expression\": \"" + document.getElementById("emotionResults_expression").innerHTML + "\"}"; } // 颜值 + " \"appearance\": \"" + document.getElementById("emotionResults_appearance").innerHTML + "\"," // var eventURL = document.getElementById("webcam-event-url-input").value; var eventURL = $("#AI_webcam_events").val(); $('#cloudRequestStatus').css("color", "orange"); document.getElementById('cloudRequestStatus').innerHTML = CCB.str_group.cloud_event_syncing; $.ajax({ type: "POST", url: eventURL, data: jsontoCloud, contentType: "application/json; charset=utf-8", dataType: "json" }) .done(function () { if (xhr.status == 200) { $('#cloudRequestStatus').css("color", "#2196f3"); document.getElementById('cloudRequestStatus').innerHTML = CCB.str_group.cloud_event_success; } else if (xhr.status !== 200) { $('#cloudRequestStatus').css("color", "red"); document.getElementById('cloudRequestStatus').innerHTML = CCB.str_group.cloud_event_failed; } }) .error(function (xhr) { if (xhr.status == 200) { $('#cloudRequestStatus').css("color", "#2196f3"); document.getElementById('cloudRequestStatus').innerHTML = CCB.str_group.cloud_event_success; } else if (xhr.status !== 200) { $('#cloudRequestStatus').css("color", "red"); document.getElementById('cloudRequestStatus').innerHTML = CCB.str_group.cloud_event_failed; } }); } } }) .error(function (xhr) { $("#emotionRequestStatus").removeClass("disabled"); document.getElementById("emotionRequestStatus").innerHTML = CCB.str_group.emotion_recognition_button_analyze; $('#azureRequestStatusText').css("color", "red"); document.getElementById('azureRequestStatusText').innerHTML = CCB.str_group.emotion_recognition_anaylze_status; setTimeout(function () { document.getElementById('azureRequestStatusText').innerHTML = ""; }, 2000); }); }); }; /* gesture recognition */ var gestureRecognitionAPIUrl = "//ai-api.cocorobo.cn/gesture"; var gestureRecognitionButtonClickCount = 0; document.getElementById("gesture_recognition_close").addEventListener("click", function () { CCB.downloadModelUrl = ''; $('#gesture_recog_modal').modal('close'); $('#setting_gesture_recog_modal').modal('open'); if (document.getElementById('camera_switch_gesture').checked == true) { document.getElementById('gestureAnalyzeButton').innerHTML = CCB.str_group.gesture_recognition_button_analyze; document.getElementById('cloudRequestStatuss').innerHTML = ''; document.getElementById('gestureResultAreaContent').innerHTML = CCB.str_group.gesture_recognition_button_result; document.getElementById('camera_switch_gesture').checked = false; Webcam.reset(); $("#gestureAnalyzeButton").addClass("disabled"); document.getElementById("gesture_webCamPlaceholder").style.display = "block"; document.getElementById("gesture_webCamPlaceholder").style.margin = "-240px 0 0 0"; $('#webCameraGesture').removeClass("webCameraGestureCapturedStyling"); } }); function cameraSwitchGesture() { Webcam.set({ // live preview size width: 320, height: 240, // device capture size dest_width: 320, dest_height: 240, // final cropped size crop_width: 280, crop_height: 240, // format and quality image_format: 'png', jpeg_quality: 90 }); document.getElementById('cloudRequestStatuss').innerHTML = ''; //if checked, turn on camera of computer if ($('#camera_switch_gesture').prop('checked') == true) { document.getElementById("gesture_webCamPlaceholder").style.display = "none"; document.getElementById("gesture_webCamPlaceholder").style.margin = "0"; document.getElementById("gestureAnalyzeButton").innerHTML = CCB.str_group.gesture_recognition_button_analyze; $('#webCameraGesture').addClass("webCameraGestureStyling"); Webcam.attach('#webCameraGesture'); $("#gestureAnalyzeButton").removeClass("disabled"); gestureRecognitionButtonClickCount = 0; Materialize.toast(CCB.str_group.speech_recognition_cameraon, 1500); } else { document.getElementById("gesture_webCamPlaceholder").style.display = "block"; document.getElementById("gesture_webCamPlaceholder").style.margin = "-240px 0 0 0"; document.getElementById("gestureAnalyzeButton").innerHTML = CCB.str_group.gesture_recognition_button_analyze; Webcam.reset(); $("#gestureAnalyzeButton").addClass("disabled"); $('#webCameraGesture').removeClass("webCameraGestureCapturedStyling"); gestureRecognitionButtonClickCount = 0; Materialize.toast(CCB.str_group.speech_recognition_cameraoff, 1500); } } function gestureRecognize() { // Webcam.freeze(); gestureRecognitionButtonClickCount += 1; if (gestureRecognitionButtonClickCount == 2) { // recognized not clicked gestureRecognitionButtonClickCount = 0; document.getElementById('gestureAnalyzeButton').innerHTML = CCB.str_group.gesture_recognition_button_analyze; // Webcam.unfreeze(); $('#webCameraGesture img')[0].parentNode.removeChild($('#webCameraGesture img')[0]); document.getElementById('gestureResultAreaContent').innerHTML = CCB.str_group.gesture_recognition_button_result; $('#webCameraGesture').removeClass("webCameraGestureStyling"); $('#webCameraGesture').removeClass("webCameraGestureCapturedStyling"); $('#webCameraGesture').addClass("webCameraGestureCapturedRestoreStyling"); document.getElementById('cloudRequestStatuss').innerHTML = '' } else if (gestureRecognitionButtonClickCount == 1) { // recognize clicked document.getElementById('gestureAnalyzeButton').innerHTML = CCB.str_group.gesture_recognition_button_analyzing; $("#gestureAnalyzeButton").addClass("disabled"); gestureRequestBaiduCloud(); $('#webCameraGesture').removeClass("webCameraGestureStyling"); $('#webCameraGesture').addClass("webCameraGestureCapturedStyling"); $('#webCameraGesture').removeClass("webCameraGestureCapturedRestoreStyling"); } } function gestureRequestBaiduCloud() { // CCB.str_group.emotion_recognition_button_analyzing // webcam part Webcam.snap(function (data_uri) { let divBefore = $('#webCameraGesture div')[0]; let imgs = document.createElement('img'); imgs.src = data_uri; imgs.setAttribute("style", "width:260px;height:220px;margin-left:20px;"); // Webcam.freeze(); // 给webCameraGesture 第一个元素之前添加一个元素 divBefore.parentNode.insertBefore(imgs, divBefore) var gesture_imageURLbase64 = data_uri; var gesture_ImageURL = gesture_imageURLbase64; var gesture_block = gesture_ImageURL.split(";"); var gesture_contentType = gesture_block[0].split(":")[1]; var gesture_realData = gesture_block[1].split(",")[1]; // 将base64 图片转换成 blob对象 var gesture_blob = b64toBlob(gesture_realData, gesture_contentType); // 将blob对象装换成file对象 let str = new File([gesture_blob], "filename.png", { type: "image/png" }) if (gesture_blob.size / (1024 * 1024) > 4) { window.alert('上传的图片不能超过3M') return; } Materialize.toast(CCB.str_group.emotion_recognition_image_captured, 1000); var gesture_formData = new FormData(); gesture_formData.append('image', str); document.getElementById('cloudRequestStatuss').innerHTML = '' $.ajax({ url: gestureRecognitionAPIUrl, data: gesture_formData, type: 'POST', contentType: false, // NEEDED, DON'T OMIT THIS (requires jQuery 1.6+) processData: false, // NEEDED, DON'T OMIT THIS timeout: 10000, }) .done(function (response, data) { if (response.data.result.length > 0) { document.getElementById('gestureResultAreaContent').innerHTML = `${response.data.result[0].classname}`; document.getElementById('gestureAnalyzeButton').innerHTML = CCB.str_group.gesture_recognition_button_retake; $("#gestureAnalyzeButton").removeClass("disabled"); if (window.send == 'module') { console.log(response.data.result[0].classname) sendModule(response.data.result[0].classname) } else { // 手势识别同步数据 let eventURL = document.getElementById('AI_gesture_events').value $('#cloudRequestStatuss').css("color", "orange"); document.getElementById('cloudRequestStatuss').innerHTML = CCB.str_group.cloud_event_syncing; var jsontoCloud = `{"gesture":"${response.data.result[0].classname}"}` $.ajax({ type: "POST", url: eventURL, data: jsontoCloud, contentType: "application/json; charset=utf-8", dataType: "json" }) .done(function () { // console.log("error"); // console.log(xhr.status); if (xhr.status == 200) { $('#cloudRequestStatuss').css("color", "#2196f3"); document.getElementById('cloudRequestStatuss').innerHTML = CCB.str_group.cloud_event_success; } else if (xhr.status !== 200) { $('#cloudRequestStatuss').css("color", "red"); document.getElementById('cloudRequestStatuss').innerHTML = CCB.str_group.cloud_event_failed; } }) .error(function (xhr) { // console.log("error"); // console.log(xhr.status); if (xhr.status == 200) { $('#cloudRequestStatuss').css("color", "#2196f3"); document.getElementById('cloudRequestStatuss').innerHTML = CCB.str_group.cloud_event_success; } else if (xhr.status !== 200) { $('#cloudRequestStatuss').css("color", "red"); document.getElementById('cloudRequestStatuss').innerHTML = CCB.str_group.cloud_event_failed; } }); } } else { document.getElementById('gestureAnalyzeButton').innerHTML = CCB.str_group.gesture_recognition_button_retake; $("#gestureAnalyzeButton").removeClass("disabled"); document.getElementById('gestureResultAreaContent').innerHTML = `${CCB.str_group.gesture_file_result}` } }); }); } //get cococloud events function captureCloudEvents(demo) { let api_key = USER.api_key || ""; $.ajax({ url: '//api.cocorobo.cn/iot/data/apikey/' + api_key + '/event/', xhrFields: { withCredentials: true }, type: 'GET', success: function (data) { if (data != null) { let select1 = $('#AI_webcam_events'); let select2 = $('#AI_voice_events'); let select3 = $('#AI_gesture_events'); let fragment = document.createDocumentFragment(); $.each(data, function (i, obj) { let option = document.createElement('option'); option.textContent = obj.name; option.value = obj.url.replace("http", "https"); // console.log(option.value); // console.log(option) fragment.appendChild(option); }); select1.empty().append(fragment).material_select(); select2.empty().append(fragment).material_select(); select3.empty().append(fragment).material_select(); } }, error: function (error) { console.log("error"); } }); }; //get cococloud events function AICloudEvents(data) { if (data != null) { let select1 = $('#AI_webcam_events'); let select2 = $('#AI_voice_events'); let select3 = $('#AI_gesture_events'); let fragment1 = document.createDocumentFragment(); let fragment2 = document.createDocumentFragment(); let fragment3 = document.createDocumentFragment(); $.each(data, function (i, obj) { let option1 = document.createElement('option'); option1.textContent = obj.name; option1.value = obj.url.replace("http", "https"); let option2 = document.createElement('option'); option2.textContent = obj.name; option2.value = obj.url.replace("http", "https"); let option3 = document.createElement('option'); option3.textContent = obj.name; option3.value = obj.url.replace("http", "https"); // console.log(option.value); // console.log(option) fragment1.appendChild(option1); fragment2.appendChild(option2); fragment3.appendChild(option3); }); select1.empty().append(fragment1).material_select(); select2.empty().append(fragment2).material_select(); select3.empty().append(fragment3).material_select(); } }; // image conversion function b64toBlob(b64Data, contentType, sliceSize) { contentType = contentType || ''; sliceSize = sliceSize || 512; var byteCharacters = atob(b64Data); var byteArrays = []; for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) { var slice = byteCharacters.slice(offset, offset + sliceSize); var byteNumbers = new Array(slice.length); for (var i = 0; i < slice.length; i++) { byteNumbers[i] = slice.charCodeAt(i); } var byteArray = new Uint8Array(byteNumbers); byteArrays.push(byteArray); } var blob = new Blob(byteArrays, { type: contentType }); return blob; } // 机器人控制 var obj = { top: "top", right: "right", bottom: "bottom", left: "left", triangle: "X", wrong: "A", circle: "B", square: "Y", } function sendLeft(type) { var sendData = ""; if (CCB.isOpen && CCB.issend) { obj.top = $("#controller_top").val() || obj.top; obj.right = $("#controller_right").val() || obj.right; obj.bottom = $("#controller_bottom").val() || obj.bottom; obj.left = $("#controller_left").val() || obj.left; obj.triangle = $("#controller_triangle").val() || obj.triangle; obj.wrong = $("#controller_wrong").val() || obj.wrong; obj.circle = $("#controller_circle").val() || obj.circle; obj.square = $("#controller_square").val() || obj.square; for (const key in obj) { if (key === type) { sendData = obj[key] } } $('.send_data').text(sendData) sendModule(sendData, 'send') } } $(document).keydown(function (event) { var sendData = ""; let key = event.keyCode if (CCB.isOpen && CCB.issend) { if (key == 38) { sendData = $("#controller_top").val() || obj.top; } else if (key == 40) { sendData = $("#controller_bottom").val() || obj.bottom; } else if (key == 39) { sendData = $("#controller_right").val() || obj.right; } else if (key == 37) { sendData = $("#controller_left").val() || obj.left; } else if (key == 88) { sendData = $("#controller_triangle").val() || obj.triangle; } else if (key == 66) { sendData = $("#controller_circle").val() || obj.circle; } else if (key == 89) { sendData = $("#controller_square").val() || obj.square; } else if (key == 65) { sendData = $("#controller_wrong").val() || obj.wrong; } if (sendData) { $('.send_data').text(sendData) sendModule(sendData, 'send') } } });