$voise = null; isBouyomi = localStorage.getItem("voice_bouyomi"); $voiseName = lang.lang_speech; $voices = speechSynthesis.getVoices(); $synthes = new SpeechSynthesisUtterance(); $voise = $.grep($voices, function (n, i) { return n.name == $voiseName })[0]; $synthes.voice = $voise; // 音声の設定 localStorage.removeItem("voicebank"); speechSynthesis.cancel() if (!localStorage.getItem("voice_vol")) { localStorage.setItem("voice_vol", 1) } voiceRate = localStorage.getItem("voice_speed"); $synthes.rate = voiceRate voicePitch = localStorage.getItem("voice_pitch"); $synthes.pitch = voicePitch voiceVol = localStorage.getItem("voice_vol"); $synthes.volume = voiceVol function say(msgr) { msg = voiceParse(msgr); var voice = localStorage.getItem("voicebank"); var obj = JSON.parse(voice); if (!obj) { var json = JSON.stringify([msg]); localStorage.setItem("voicebank", json); } else { obj.push([msg]); var json = JSON.stringify(obj); localStorage.setItem("voicebank", json); } } $repeat = setInterval(function () { if (!speechSynthesis.speaking) { var voice = localStorage.getItem("voicebank"); if (voice) { var obj = JSON.parse(voice); if (obj[0]) { if (localStorage.getItem("voice_bouyomi")) { var delim = ""; var thisVoiceRate = voiceRate * 10 + 70 var thisVoicePitch = voicePitch * 50 + 70 var thisVoiceVol = voiceVol * 100 console.log(thisVoiceRate, thisVoicePitch, thisVoiceVol) var command = 0x0001; var type = 0; var sends = "" + command + delim + thisVoiceRate + delim + thisVoicePitch + delim + thisVoiceVol + delim + type + delim + obj[0]; bouyomiConnect(sends) } else { $synthes.text = obj[0]; speechSynthesis.speak($synthes); } obj.splice(0, 1); var json = JSON.stringify(obj); localStorage.setItem("voicebank", json); } } } }, 300); function voiceParse(msg) { msg = $.strip_tags(msg); msg = msg.replace(/#/g, ""); msg = msg.replace(/'/g, ""); msg = msg.replace(/"/g, ""); msg = msg.replace(/https?:\/\/[a-zA-Z0-9./-@_=?%&-]+/g, ""); return msg; } function voiceToggle(tlid) { var voiceck = localStorage.getItem("voice_" + tlid); if (voiceck) { localStorage.removeItem("voice_" + tlid); speechSynthesis.cancel() if (localStorage.getItem("voice_bouyomi")) { var command = 0x0010; var sends = "" + command; bouyomiConnect(sends) } $("#sta-voice-" + tlid).text("Off"); $("#sta-voice-" + tlid).css("color", 'red'); parseColumn(tlid); } else { localStorage.setItem("voice_" + tlid, "true"); $("#sta-voice-" + tlid).text("On"); $("#sta-voice-" + tlid).css("color", '#009688'); parseColumn(tlid); } } function voiceCheck(tlid) { var voiceck = localStorage.getItem("voice_" + tlid); if (voiceck) { $("#sta-voice-" + tlid).text("On"); $("#sta-voice-" + tlid).css("color", '#009688'); } else { $("#sta-voice-" + tlid).text("Off"); $("#sta-voice-" + tlid).css("color", 'red'); } } function voicePlay() { if (speechSynthesis.speaking) { speechSynthesis.cancel() } else { var text = $("#voicetxt").val(); var rate = $("#voicespeed").val(); var pitch = $("#voicepitch").val() var vol = $("#voicevol").val() if (localStorage.getItem("voice_bouyomi")) { var delim = ""; rate = rate * 1 + 70 pitch = pitch * 1 + 70 var command = 0x0001; // コマンドです。0x0001.読み上げ/0x0010.ポーズ/0x0020.再開/0x0030.スキップ /*var speed = 100; // 速度50-200。-1を指定すると本体設定 var pitch = 100; // ピッチ50-200。-1を指定すると本体設定 var volume = 100; // ボリューム0-100。-1を指定すると本体設定*/ var type = 0; // 声質(0.本体設定/1.女性1/2.女性2/3.男性1/4.男性2/5.中性/6.ロボット/7.機械1/8.機械2) var sends = "" + command + delim + rate + delim + pitch + delim + vol + delim + type + delim + text; bouyomiConnect(sends) } else { $synthes.text = text $synthes.rate = rate / 10 $synthes.pitch = pitch / 50 $synthes.volume = vol / 100; speechSynthesis.speak($synthes); } } } function voiceSettings() { var awk = $("[name=bym]:checked").val(); if (awk == "yes") { localStorage.setItem("voice_bouyomi", "yes"); M.toast({ html: "Bouyomi Chan connection requires WebSocket Plugin", displayLength: 3000 }) } else { localStorage.removeItem("voice_bouyomi"); } localStorage.setItem("voice_speed", $("#voicespeed").val() / 10); localStorage.setItem("voice_pitch", $("#voicepitch").val() / 50); localStorage.setItem("voice_vol", $("#voicevol").val() / 100); M.toast({ html: lang.lang_speech_refresh, displayLength: 3000 }) } function voiceSettingLoad() { var flag = localStorage.getItem("voice_bouyomi"); if (flag) { $("#bym_yes").prop("checked", true); } else { $("#bym_no").prop("checked", true); } var speed = localStorage.getItem("voice_speed"); var pitch = localStorage.getItem("voice_pitch"); var vol = localStorage.getItem("voice_vol"); if (speed) { $("#voicespeed").val(speed * 10); $("#voicespeedVal").text(speed * 10); } if (pitch) { $("#voicepitch").val(pitch * 50); $("#voicepitchVal").text(pitch * 50); } if (vol) { $("#voicevol").val(vol * 100); $("#voicevolVal").text(vol * 100); } } function bouyomiConnect(sends) { var socket = new WebSocket('ws://localhost:50002/'); socket.onopen = function () { socket.send(sends); } }