{"id":21438111,"url":"https://github.com/wukan1986/kwebspeaker","last_synced_at":"2025-06-19T23:40:24.670Z","repository":{"id":126950764,"uuid":"137986519","full_name":"wukan1986/KWebSpeaker","owner":"wukan1986","description":"保持原排版可选段的网页朗读神器","archived":false,"fork":false,"pushed_at":"2019-10-18T14:13:45.000Z","size":997,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-23T09:44:48.308Z","etag":null,"topics":["tts","web"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wukan1986.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-06-20T05:57:44.000Z","updated_at":"2021-06-21T09:12:32.000Z","dependencies_parsed_at":"2023-06-19T05:09:08.604Z","dependency_job_id":null,"html_url":"https://github.com/wukan1986/KWebSpeaker","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wukan1986%2FKWebSpeaker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wukan1986%2FKWebSpeaker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wukan1986%2FKWebSpeaker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wukan1986%2FKWebSpeaker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wukan1986","download_url":"https://codeload.github.com/wukan1986/KWebSpeaker/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243950809,"owners_count":20373664,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["tts","web"],"created_at":"2024-11-23T00:33:00.701Z","updated_at":"2025-03-16T23:43:00.366Z","avatar_url":"https://github.com/wukan1986.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# KWebSpeaker可选段的网页朗读神器\n此APP最大的特点就是可以通过点击选取不同的段，直接进行朗读。\n\n## 背景\n由于IT人员长时间用眼，过于疲惫，一直想解决如果让眼休息的方法。2017年时在想是否有类似的软件能将公众号朗读出来就好了。\n试用了好几款APP，存在以下问题。\n1. 从头开始朗读。不能选段\n2. 可以中间开始读的又需要在新窗口读，丢失了排版\n3. 系统内置的Talkback，改变了操作方式，很难退出。\n4. 系统内置的随选朗读只能读当前界面，没办法自动滚屏。\n\n直到找到了Web Page Reader这款软件。满足了我的要求。但它也有缺陷：\n1. 免费版锁屏时自动停止朗读，收费版只能在Google商店中下载，需翻墙，目前已经下架\n2. N年没有更新维护\n3. 不支用浏览器打开功能\n4. 发送到功能，不能提前编辑，导致不能与国内大量APP兼容\n5. 部分网页无法正常朗读\n\n为了解决“用浏览器打开”问题，本人当时做了一个小APP,能注册成浏览器，然后转成发送到。两个软件配合使用。\n\n最近忽心血来潮，要是能做成一个APP，能注入到微信一类的APP中，不用每次新打开公众号，这下能省不少流量吗？\n故研究了一下微信抢红包外挂，结果发现AccessibilityService老读不到WebView控件，再加上选段功能需要获取DOM对象，但AccessibilityService拿到的对象只支持取文本和点击等功能，最后只好放弃。\n\n但通过研究发现选段加朗读的功能并不复杂，不如干脆做成开源库。让微信、网易新闻客户端、UC浏览器、知乎（目前只是部分文章可朗读）等应用能酌情添加此功能，方便用户。\n\n## 原理\n通过JavaScript与WebView交互，实现选段与朗读。\n1. setJavaScriptEnabled/addJavascriptInterface:启用JavaScript，并注册回调函数，这些函数需要添加@JavascriptInterface\n2. 编写特殊的脚本，由WebView.loadUrl进行执行\n3. 在网页中调用脚本中注册的回调函数，实际上调用到Java中对应的函数，实现了朗读\n\n## 调试\n由于遇到一些网页无法朗读，是构造的特殊脚本不兼容，需要调试。如何调试呢？本人将原来硬编码的脚本提取成了js文件，方便修改。\n1. WebView.setWebContentsDebuggingEnabled(true)启用调试功能，默认已经开启\n2. PC端通过数据线连接手机\n3. 打开PC端Chrome浏览器，输入chrome://inspect/#devices，即可调试JS\n4. 优先读取外部存储器的/storage/emulated/0/Android/data/com.github.wukan1986.kwebspeaker/cache/bell_pepper_info.js，文件不存在才读取assets下的bell_pepper_info.js\n5. 使用传输文件(MTP)模式，将assets下的bell_pepper_info.js编辑好，然后覆盖到外部存储器相应文件即可。只有刷新页面，对应的js才会重新读取。\n6. js中可以加console.log方便调试\n\n通过此方法已经修复或找到了原因的网站有：\n1. 凤凰网无法朗读（已修复）\n2. 知乎遇到图片时总读一段乱码（已修复）\n3. 百度手机版，无法朗读正文（iframe跨域，未解决，但可以全选复制绕过）\n\n## 开源\n协议：Apache Licene 2.0\n\n为何开源？\n1. 此技术和方法并非原创\n2. 通过一个软件外挂其它软件的方式暂时本人技术上没走通，也许能有高手可以解决\n3. 想让更多的软件开发商借此将朗读功能集成，方便广大用户\n4. 想让安全专业人士帮验证一下WebView与JavaScript互调的方式是否有安全问题\n5. 本人没有开发过iOS程序，也没有相应设备，希望有网友能与我联系(wu-kan@163.com)，接手iOS版的开发，所用到的关键技术iOS都支持。\n\n## 捐赠\n如果您觉得这个软件能帮助到您的朋友，可向他们推荐。\n\n如果您觉得某个软件很有必要加朗读功能，可以将此项目推荐给相应的产品经理和开发人员。\n\n如果此软件对您有帮助，可以考虑捐赠来支持我。非常感谢！\n\n捐赠方式：支付宝wu-kan@163.com（*侃）\n![](./img/alipay.png)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwukan1986%2Fkwebspeaker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwukan1986%2Fkwebspeaker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwukan1986%2Fkwebspeaker/lists"}