美文网首页
基于百度语音的微信&QQ信息语音播放

基于百度语音的微信&QQ信息语音播放

作者: 789lszt | 来源:发表于2017-09-11 22:49 被阅读0次

简介

在日常生活中我们常遇到一些腾不开手操作手机的时候,有时手机离自己还有一段距离,如:

  • 做饭
  • 洗澡
  • 收拾
  • 健身

这时当微信或者QQ有消息却不知道是否应该放下手中的任务去查看是谁发来的什么消息,如果能用语音播放消息并且通过语音进行回复就可以带来极大的方便。

语音播放的实现

方便起见,通过NotificationListenerService从系统通知中抓取微信和QQ的信息。

实现NotificationListenerService

NotificationListenerService在API level 18中加入,当有新的通知、现有通知移除和通知的排序发生变化时,系统会唤起该服务,通过实现该类可以捕获微信和QQ的信息。

该类中的onNotificationPosted回调函数会传递一个StatusBarNotification数据结构,通过该结构的getPackageName方法获取发送该通知的包名,通过getNotification方法获取通知的标题和内容。

...
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
...
public class NotificationListener extends NotificationListenerService{
...
public void onNotificationPosted(StatusBarNotification sbn) {
        super.onNotificationPosted(sbn);
        Bundle bundle = sbn.getNotification().extras;
        String notificationPkg = sbn.getPackageName();
        String title=bundle.getString(Notification.EXTRA_TITLE);
        String text= bundle.getString(Notification.EXTRA_TEXT);
...
  }
...
}

将捕获到的信息通过广播传递给主程序:

 Intent i= new Intent("com.hit.lszt.getnote.receive");
 i.putExtra("POSTED",false);
 i.putExtra("PACKAGENAME",notificationPkg);
 i.putExtra("TITLE",title);
 i.putExtra("TEXT",text);
 sendBroadcast(i);

此外,还需要在AndroidManifest.xml中声明该服务和BIND_NOTIFICATION_LISTENER_SERVICE权限:

 <service
    android:name="com.hit.lszt.getnote.NotificationListener"
    android:label="@string/service_name"
    android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
    <intent-filter>
        <action android:name="android.service.notification.NotificationListenerService" />
    </intent-filter>
</service>

基于百度语音的微信&QQ信息语音播放的实现

百度离线语音合成

注册成为百度语音的开发者,创建应用并为其开通离线语音合成服务,下载安卓离在线融合SDK

离在线融合SDK

将SDK中的data拷贝到app/libs中,data拷贝到app/src/main/assets中。

其中,so库需要在在build.gradle中添加如下代码导入:

sourceSets {
    main {
       jniLibs.srcDirs = ['libs']
    }
}

初始化百度语音的代码可以在SDK中的samples中找到,这里只提几个关键的代码:

 // 请替换为语音开发者平台注册应用得到的APPID
this.mSpeechSynthesizer.setAppId("APPID");
 // 请替换为语音开发者平台注册应用得到的apikey和secretkey
this.mSpeechSynthesizer.setApiKey("apikey",  "secretkey");
// 设置Mix模式的合成策略
this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_HIGH_SPEED_SYNTHESIZE_WIFI);

百度提供的合成器参数设置说明

参数名称 默认值 备注
PARAM_MIX_MODE MIX_MODE_DEFAULT MIX_MODE_DEFAULT(mix模式下,wifi使用在线合成,非wifi使用离线合成)
MIX_MODE_HIGH_SPEED_NETWORK(mix模式下,wifi,4G,3G使用在线合成,其他使用离线合成)
MIX_MODE_HIGH_SPEED_SYNTHESIZE(mix模式下,在线返回速度如果慢(超时,一般为1.2秒)直接切换离线,适用于网络环境较差的情况)
MIX_MODE_HIGH_SPEED_SYNTHESIZE_WIFI(mix模式下,仅wifi使用在线合成,返回速度如果慢(超时,一般为1.2秒)直接切换离线,适用于仅WIFI网络环境较差的情况)

但是我在自己手机(Huawei P9)上测试的时候,MIX_MODE_DEFAULT模式只在wifi下进行语音合成,而使用MIX_MODE_HIGH_SPEED_SYNTHESIZE_WIFI则工作正常,非wifi环境下使用离线合成。

初始化成功后,通过调用

public int speak(String text)

合成并播放文本。

实现BroadcastReceiver

实现一个BroadcastReceiver接收刚才实现的NotificationListenerService发出的广播信息:

 private class NotificationReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getBooleanExtra("POSTED", true)) {
                String pkg = intent.getStringExtra("PACKAGENAME");
                if (pkg.contains("tencent")) {
                    String TEXT=intent.getStringExtra("TEXT");
                    String TITLE=intent.getStringExtra("TITLE");
                    if(!TEXT.contains(TITLE)){
                        mSpeechSynthesizer.speak(intent.getStringExtra("TITLE")+"说"+intent.getStringExtra("TEXT"));
                    }
                    else {
                        mSpeechSynthesizer.speak(intent.getStringExtra("TEXT"));
                    }
                }
            }
        }
    }

如果包名中包含tencent字段则判断为微信或者QQ的信息,通过百度语音合成引擎进行播放。

总结

本程序可以实现语音播放微信和QQ信息,界面图如下:

界面图

使用方式为点击ACCESS按钮并授权,如果要取消语音播放则取消授权。
目前程序不论是界面还是操作方式都有些简陋,但是不影响正常使用。


源代码&下载

https://github.com/shibajiu/ReadWeChatNotifications

参考


TODO

  • 过滤名单
  • 语音发送信息

相关文章

  • 基于百度语音的微信&QQ信息语音播放

    简介 在日常生活中我们常遇到一些腾不开手操作手机的时候,有时手机离自己还有一段距离,如: 做饭 洗澡 收拾 健身 ...

  • QQ音乐没声音

    问题描述 QQ音乐不能播放音乐 音乐网站不能播放音乐 微信不能播放别人发送的语音消息 微信只能有消息提醒音 解决方...

  • 留声:帮助

    1. QQ / TIM中的语音不能备注 原因:因为这类语音文件名并没有包含联系人信息,不像微信语音文件名中包含了代...

  • Android语音录制和播放封装库(提供JS调用demo)

    实现功能: 语音录制、播放模块 支持基于Media和Audio的语音录制和播放 支持基于PCM的格式扩展操作 提供...

  • 切换听筒/扬声器播放

    场景:微信语音消息,靠近听筒切换为听筒播放

  • xf-项目问题总结-1

    问题: 项目为webapp,需要调用微信语音,使用微信公众平台调用其语音功能需要域名 ==>>1. 基于NATAP...

  • 玩转社交软件语音 文字输入哪个合适

    你们发信息的时候喜欢,发语音还是文字呢,不管在微博还是微信或者任何社交帐号上包括qq,我特别喜欢用语音去表达,因为...

  • iOS音频工具箱

    iOS音频工具箱 我们都知道,微信语音播放下可以切换听筒和扬声器,那么它是怎么实现的呢? 微信语音播放之切换听筒和...

  • 录音、语音如何成为诉讼证据

    手机录音、微信、QQ语音如何成为诉讼证据,维护自身权益 手机录音、微信语音能否成为证据,首先看其是否符合民事证据...

  • 产业龙头股的比较分析,周黑鸭VS绝味食品

    语音同步播放 点击语音播放的朋友请注意,因本期内容在微信公众号是粉两期发送的,所以语音分为两段,收听完链接中的上半...

网友评论

      本文标题:基于百度语音的微信&QQ信息语音播放

      本文链接:https://www.haomeiwen.com/subject/hogfsxtx.html