uniapp-实现语音播报功能,实时收款播报

需求:收款时语音播报

思路:从通知栏获取通知=>通过通知栏消息传来的状态实行语音播报=>对传来的金额字符串进行替换存为数组=>播放数组音频,实现功能

进行开发时需要准备对应的音频文件:0~10,小数点,元,百,千,万文件等

话不多说,直接开发:

第一步获取通知栏的消息:

//利用h5+方法监听通知传来的消息,这里建议大家使用透传消息的方法,并且后台传值需要使用自己的格式,不能使用官方传值的格式
plus.push.addEventListener('receive', function(msg) {
		console.log("----用户收到通知信息---",msg)
},false);

第二步定义方法来对音频文件拼接:

//定义一个方法来拼接音频文件
function splicingAudioFiles(res){
    //res为对应的金额,接下来对金额进行替换音频文件的操作
    //这里定义的开关控制对应的零是否发声操作
    let afterDecimalPoint=false,beforeDecimalPoint=false,tenThousandDigits=false,Thousand=false,Tenthousand=false
    //arr保存对应的音频文件
	let arr=[],that = this
    //res进行保留两位小数的操作
	res=parseFloat(val).toFixed(2)
    //arrSplit将res切割保存为一个一个数组
	let arrSplit=res.split('')
    //定义一个循环从尾部开始进行替换,尾部开始时自动添加一个元的音频,然后开始一个一个数字进行替换
	for(let i=arrSplit.length-1;i>=0;i--){
		if(i==arrSplit.length-1){
		    arr.unshift('/static/yuyin/end.mp3')
		    if(arrSplit[i]==0){
					  
			}
			else{
				arr.unshift('/static/yuyin/'+arrSplit[i]+'.mp3')
				afterDecimalPoint=true  
			}
		}
		else if(i==arrSplit.length-2){
			if(arrSplit[i]==0){
				if(afterDecimalPoint){
					arr.unshift('/static/yuyin/'+arrSplit[i]+'.mp3')
				}
			}
			else{
				arr.unshift('/static/yuyin/'+arrSplit[i]+'.mp3')
				afterDecimalPoint=true 
			}
		}
		else if(i==arrSplit.length-3){
			if(afterDecimalPoint){
				arr.unshift('/static/yuyin/spot.mp3')
			}
		}
		else if(i==arrSplit.length-4){
			if(i==0){
				arr.unshift('/static/yuyin/'+arrSplit[i]+'.mp3')
			}else{
				if(arrSplit[i]==0){
						
				}else{
					arr.unshift('/static/yuyin/'+arrSplit[i]+'.mp3')
					beforeDecimalPoint=true
				} 
			}
		}
    }
     //创建播放器对象
	that.musicObj = uni.createInnerAudioContext();
    //src为播放器的播放路径
	that.musicObj.src='/static/yuyin/start.mp3'
    //play()为播放的方法
	that.musicObj.play()
    //onEnded()为播放结束的时候继续操作
	that.musicObj.onEnded(function(res){
        //这里调用playVoice()方法 arr为保存音频文件的数组 that.musicObj为播放器对象
		playVoice(arr,that.musicObj)
	})

}
//定义方法播放每个音频文件
function playVoice(arr,music){
    //playFile 保存arr头一个音频文件
    let playFile = arr.shift()
    //playFile 为空时结束语音播放
	if(!playFile) {
		music = null
		me.extractData()
		return
	}
	music.src= playFile
	music.play()
	music.onStop(function(res){
	    if(arr.length==0){
		    music = null
		}else{
			playVoice(arr,music)
		}
	})
}

第三步就是在接收到通知时调用方法,进行语音播报:

//监听消息,进行语音播报的操作
plus.push.addEventListener('receive', function(msg) {
	console.log("----用户收到通知信息---",msg)
    splicingAudioFiles('12.1')
},false);

到这里就可以正常的语音播报了,当然,深入一点还需要考虑正在播放音频文件时,又有一条通知时应该怎么做了

这里提供一个思路,队列,单线程

开源不易,请看完的朋友动动小手,点个赞哟,觉得对您有帮助,可以点个收藏

你可能感兴趣的:(uniapp,前端)