$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) } }