123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- import Speech from 'speak-tts';
- import http from '@/api';
- let speech: any = null;
- let myAudio: any = null;
- let myMusic: any = null;
- let browserSupport: boolean = false;
- let speechText: string = '';
- //初始化语音
- export const initSpeech = () => {
- speech = new Speech();
- // 检测浏览器是否支持
- if (speech.hasBrowserSupport()) {
- browserSupport = true;
- speech
- .init({
- volume: 1, // 音量
- lang: 'zh-CN', // 语言
- rate: 1.5, // 语速
- pitch: 1.0, // 音调
- splitSentences: true, // 在句子结束时暂停
- listeners: {
- // 事件
- onvoiceschanged: (voices: any) => {
- // console.log('事件声音已更改', voices);
- }
- }
- })
- .then(() => {
- console.log('语音播报初始化完成');
- });
- } else {
- browserSupport = false;
- let baiduTok = localStorage.getItem('tok');
- if (!baiduTok) {
- http?.common.baiduToken({}).then((res: any) => {
- let tok = res.token;
- localStorage.setItem('tok', tok);
- });
- }
- }
- };
- //播放语音
- export const speckText = (text: any) => {
- //console.log('text', text);
- //静音
- let voiceData: any = localStorage.getItem('voice');
- if (voiceData != undefined && voiceData == 'false') {
- return false;
- }
- console.log('speechText', speechText);
- if (speechText == text) {
- return false;
- }
- speechText = text;
- let list: any = [
- // '请看摄像头进行人脸识别': 'PleaseIdentify.mp3',
- // '腿部违规': 'LegViolation.mp3',
- // '手部违规': 'HandViolation.mp3',
- // '背部违规': 'BackViolation.mp3',
- // '臀部违规': 'HipViolation.mp3',
- // '踩线违规': 'LineViolation.mp3',
- // '肘部违规': 'Elbowiolation.mp3',
- // '下颌违规': 'HeightViolation.mp3',
- // '单脚跳违规': 'SingleLegJumpViolation.mp3',
- // '跳出测试区域违规': 'JumpAreaViolation.mp3',
- // '您已踩线违规': 'LineViolationed.mp3',
- // '测试结束,请下一位准备': 'TestEnd.mp3',
- // '开始': 'Start.mp3',
- // '测试完成': 'End.mp3',
- // '请开始测试': 'PleaseStartTest.mp3',
- // '请准备': 'PleaseReady.mp3',
- // '该摄像头已启用': 'CameraOpen.mp3',
- // '该考点已接受请求,请5秒后刷新考点状态后重试.': 'Accepted.mp3',
- // '工作站登录失败': 'WorkFailLogin.mp3',
- // '摄像头打开失败': 'openFail.mp3',
- // '网络错误,请检查网络': 'NetworkError.mp3',
- // '非法操作': 'IllegalOperation.mp3',
- // '工作站已断开!': 'WorkDisconnect.mp3',
- // '无可用工作站': 'NoWork.mp3',
- // '考试项目不存在': 'NoExam.mp3',
- // '该场地已被其他页面抢占': 'OtherPages.mp3',
- // '重连失败,对应工作站已被占用': 'ReconnectionFailed.mp3',
- // '自动人脸抓取返回result_id不正确': 'ResultIdFalse.mp3',
- // '系统错误!': 'SystemError.mp3',
- // '工作站已关闭,请重新上课!': 'WorkDown.mp3',
- // '初始化成功': 'InitializationSuccessful.mp3',
- // '有非测试人员进入测试区': 'InterferencePersonnel.mp3',
- // '布点文件视频尺寸和当前摄像头尺寸不一致': 'MarkInconsistency.mp3',
- // '各就位,预备': 'Ready.mp3',
- // '还有30秒,加油!': 'countdown30s.mp3',
- // '还有10秒,坚持住!': 'countdown10s.mp3',
- // '预备': 'Ready.mp3',
- { lable: '5', value: '5.mp3' },
- { lable: '4', value: '4.mp3' },
- { lable: '3', value: '3.mp3' },
- { lable: '2', value: '2.mp3' },
- { lable: '1', value: '1.mp3' },
- { lable: '各就位,预备!', value: 'runNew.mp3' },
- { lable: '跑', value: 'run.mp3' },
- { lable: '哨声', value: 'shaosheng.mp3' },
- { lable: '哨声2', value: 'shaosheng2.mp3' }
- ];
- speechText = '';
- console.log('播报', text);
- let obj = list.find((item: any) => {
- return item.lable == text;
- });
- if (obj != undefined) {
- //用本地文件
- let url = `./static/audio/${obj.value}`;
- myAudio = new Audio(url);
- myAudio.play();
- } else {
- if (browserSupport == true) {
- //用TTS
- speech.speak({ text: text.toString() }).then(() => {
- speech.cancel(); //播放结束后调用
- });
- } else {
- //用百度语音
- let tok = localStorage.getItem('tok') || '';
- let url = `https://tsn.baidu.com/text2audio?tex=${encodeURI(text)}&tok=${tok}&cuid=baike&lan=ZH&ctp=1&vol=15&rate=32&per=0&spd=7&pit=4`;
- myAudio = new Audio(url);
- myAudio.play();
- }
- }
- };
- //播放音乐
- export const playMusic = (url: any) => {
- let state = true;
- let voiceData: any = localStorage.getItem('voice');
- if (voiceData != undefined && voiceData == 'false') {
- state = false;
- }
- myMusic = new Audio(url);
- myMusic.muted = state ? false : true;
- myMusic.play();
- };
- //取消播放
- export const speckCancel = () => {
- if (speech && browserSupport == true) {
- speech?.cancel();
- } else {
- myAudio?.pause();
- }
- myMusic?.pause();
- };
- //控制音乐
- export const controlMusic = () => {
- let state = true;
- let voiceData: any = localStorage.getItem('voice');
- if (voiceData != undefined && voiceData == 'false') {
- state = false;
- }
- myMusic.muted = state ? false : true;
- };
- //小数播报格式
- export const chineseNumber = (num: any) => {
- const chineseNumbers = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
- let parts = String(num).split('.');
- let integerPart = parts[0];
- let decimalPart = parts[1];
- let chineseInteger = integerPart;
- let chineseDecimal = decimalPart
- ? '点' +
- decimalPart
- .split('')
- .map((digit) => chineseNumbers[parseInt(digit)])
- .join('')
- : '';
- return chineseInteger + chineseDecimal;
- };
|