thedesk/app/js/tl/speech.js
2019-11-24 23:53:35 +09:00

185 lines
5.3 KiB
JavaScript

'use strict'
var $voise = null
var isBouyomi = localStorage.getItem('voice_bouyomi')
var $voiseName = lang.lang_speech
var $voices = speechSynthesis.getVoices()
var $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)
}
var voiceRate = localStorage.getItem('voice_speed')
$synthes.rate = voiceRate
var voicePitch = localStorage.getItem('voice_pitch')
$synthes.pitch = voicePitch
var voiceVol = localStorage.getItem('voice_vol')
$synthes.volume = voiceVol
function say(msgr) {
var 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)
}
}
var $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 = '<bouyomi>'
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) {
var 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 = '<bouyomi>'
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)
}
}