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

简介

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

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

这时当微信或者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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容