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 中集成和使用语音播报 API #### 选择合适的语音播报服务提供商 对于希望在 UniApp 应用程序中加入语音播报功能的企业来说,可以选择多种不同的服务商。例如百度提供了较为成熟的语音合成解决方案[^2]。 #### 注册并获取API权限 为了能够合法地调用这些服务,在实际操作前需先完成开发者注册过程,并按照指引创建相应的应用程序来获得必要的访问密钥等信息。 #### 编写Android原生插件以支持TTS(Text To Speech) 当目标平台为基于安卓系统的设备时,则可能涉及到通过编写自定义的Java类文件作为桥梁连接至底层操作系统所提供的`android.speech.tts.TextToSpeech`库函数来进行文字转语音处理工作[^1]。 ```java import android.content.Context; import com.alibaba.fastjson.JSONObject; public class TTSPlugin extends Plugin { private TextToSpeech tts; @Override public void onCreate() { super.onCreate(); tts = new TextToSpeech(getContext(), status -> {}); } /** * 发起一次语音播报请求. */ public void speak(String text) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, "uniqueId"); } else { tts.speak(text, TextToSpeech.QUEUE_FLUSH, null); } } } ``` 此部分代码展示了如何构建一个简单的 Android 插件用于执行基本的文字朗读任务。需要注意的是这里仅提供了一个简化版示例,具体实现还需考虑更多细节如错误处理机制以及性能优化等方面的问题。 #### 将编译好的Jar包引入项目依赖项内 一旦完成了上述 Java 类的设计之后就可以将其打包成 JAR 文件形式再导入到 UniApp 的 build.gradle 配置当中去以便后续可以顺利加载该组件。 ```gradle dependencies { implementation files('libs/your-tts-plugin.jar') } ``` #### 调用插件方法发起语音播报指令 最后一步就是在前端页面里边利用 JavaScript 或者 Vue.js 组件的方式向后台发送消息触发对应的逻辑从而达到最终目的即播放指定内容的声音效果。 ```javascript // 假设已经成功安装好插件并且命名为 'tts' export default { methods: { async playVoice(messageText){ try{ await plus.android.importClass("com.example.TTSPlugin"); let pluginInstance = new plus.android.runtimeMainActivity().$context().getApplicationContext().getClassLoader().loadClass("com.example.TTSPlugin").newInstance(); pluginInstance.speak(messageText); }catch(error){ console.error(`Failed to invoke TTS:${error.message}`); } } } }; ``` 这段脚本说明了怎样借助 Plus API 来实例化之前所提到过的那个 Native 层面的对象进而调用其公开的方法传递参数给它告诉它要说什么话。
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

✎﹏ℳ๓敬坤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值