Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature Request] 希望可以添加在线朗读的离线预加载功能 #2071

Closed
lmst2 opened this issue Jul 13, 2022 · 17 comments
Closed

[Feature Request] 希望可以添加在线朗读的离线预加载功能 #2071

lmst2 opened this issue Jul 13, 2022 · 17 comments
Labels
Stale 需求 F.用户提出的功能意见

Comments

@lmst2
Copy link

lmst2 commented Jul 13, 2022

功能描述(请清晰的、详细的描述你想要的功能)

朗读分为系统离线朗读和在线朗读。离线的tts限于处理器性能等原因通常效果不尽如人意。在线的tts比如微软tts就可以达到很好的效果。
然而在线tts的性能会因为网络原因使体验感极差,比如突然网卡了,或者某个地区访问国外tts服务延迟非常大(会导致读完一句话之后要等好久才有第二句),又比如上飞机没网了就用不了了。
所以我在想tts既然是请求完了得到一段mp3或者是wav等音频文件,那何不写一个和离线下载章节一样的功能,按照顺序把请求的音频文件保存下来呢,这样也不会因为网络波动导致每一句话直接都要等上一会,在没有网络的情况下也可以获得在线版的良好体验。

期望实现方式(阅读应该如何实现该功能)

可以顺序把音频文件保存在一个文件夹里,按照顺序重命名,离线朗读的时候按照顺序播放音频文件就行。
也可以每次获取到下一段音频,就和上一段音频合成,形成一个完整的音频。
具体选哪种操作就怎么方便怎么来。

附加信息(其他的与功能相关的附加信息)

效果演示(可以手绘一些草图,或者提供可借鉴的图片)

@lmst2 lmst2 added the 需求 F.用户提出的功能意见 label Jul 13, 2022
@gedoor
Copy link
Owner

gedoor commented Jul 14, 2022

这样占用手机存储会非常大,目前是缓存一章的音频

@lmst2
Copy link
Author

lmst2 commented Jul 14, 2022

咦?已经可以缓存一章了吗可以告诉我在哪里缓存吗。这个我知道,不过按照我的使用来说,我在tts上设置的码率比较低,可以保证一句话只有几十kb这样子。占用存储并不是太多。而且这个可以给个提示,表明会占用比较大的内存。就像很多人会下载视频看一样。用户可以根据自己手机内存大小来决定要不要缓存呀,至少我手机256GB觉得应该还是可以缓存个几百章小说的

@lmst2
Copy link
Author

lmst2 commented Jul 15, 2022

这样占用手机存储会非常大,目前是缓存一章的音频

是这样的,我准备自己添加一下这个功能。但是整个app还是比较复杂的,一时间不太确定各个模块之间的关联。现在是知道这些该怎么做,但是不清楚该在哪里添加模块。所以想作者能够帮忙列出有哪些模块我需要改动和添加的。想必作者对整个APP应该是非常熟悉的了,稍微思考一下就能够给出大概思路了。
我的初步想法是在model里面添加一个新的downloadAudio类,这里面可以调用现成的download service 还有 在线朗读服务。但是其他的ui更新还有数据库操作等我就不知道该怎么做了,还没研究透
希望作者可以给个思路,比如该在哪里修改ui,该在哪里操作数据库,操作完了需要调用什么服务migrate数据库等等,指明一下名称就行,我可以自己看看怎么办。但是想获得一个思路好让我更快上手这个APP

@gedoor
Copy link
Owner

gedoor commented Jul 15, 2022

io.legado.app.service.HttpReadAloudService
这个就是在线朗读服务,下载朗读语音也在这个里面,缓存音频不需要什么界面吧

@lmst2
Copy link
Author

lmst2 commented Jul 15, 2022

io.legado.app.service.HttpReadAloudService 这个就是在线朗读服务,下载朗读语音也在这个里面,缓存音频不需要什么界面吧

啊,是我没说清楚,我是想搞成和离线下载章节以便于没网的时候看小说一样,搞出来个离线下载听书内容,没网的时候可以继续听书这样,所以需要界面进行操作,比如开始缓存和停止缓存,以及进阶的选择哪些章节缓存,还有显示到底哪些章节已经缓存了等等

@gedoor
Copy link
Owner

gedoor commented Jul 15, 2022

io.legado.app.ui.book.cache.CacheActivity
那界面参照这个就行

@lmst2
Copy link
Author

lmst2 commented Jul 15, 2022

io.legado.app.ui.book.cache.CacheActivity 那界面参照这个就行

好的,其他还有什么细节吗,比如缓存了之后应该会把已缓存的章节保存在数据库里面吧,这个数据库操作是在哪里完成的

@821938089
Copy link
Collaborator

没有数据库,这个是靠计算阅读文本的md5然后拼出路径来的。

@lmst2
Copy link
Author

lmst2 commented Jul 15, 2022

好的,另外我测试io.legado.app.ui.book.cache.CacheActivity的时候看到了这个
image
从代码来看按理说缓存activity是可以看到音频书籍的。然而实际测试的时候缓存只显示了小说。如下图所示
image
image
可以看到,我随便收藏了几本小说加上几本音频,点击缓存、导出的时候,只显示出了小说。而我看最上面那个方程明明是从数据库里select 所有种类的书籍。为啥音频不在里面,难不成是音频书籍的信息根本没有被添加进数据库?
还有这个
image
image
这应该是对应AppConst.bookGroupAudioId -> appDb.bookDao.flowAudio()这行代码,可见他从数据库里面没有找到任何书。

然后我点进章节信息,发现前几章的音频已经缓存下来了,说明自动缓存前十章的功能有在起作用。
image

但是在缓存/导出activity里面确实没有出现。我本来是想直接利用现成的音频缓存activity实现我的缓存在线tts功能的,准备在阅读界面放个按钮,可以自动创建另一个一模一样的音频书籍,并且把缓存功能替换成在线tts获取音频。所以试了一下音频书籍缓存功能,结果发现根本找不到音频书籍2333. 另外我看了一下,发现谷歌store上的pro版本也存在这个问题,不知道作者有没有发现这个问题以及怎么解决

@821938089
Copy link
Collaborator

音频书被下面的代码过滤掉了
image

这个音频缓存我估计就缓存个地址吧,我没找到哪里把音频下载下来了

@lmst2
Copy link
Author

lmst2 commented Jul 16, 2022

好家伙,为什么要过滤掉呀,是不是暂时只开发了小说缓存功能。。另,这个音频我也不清楚,我是直接点进去发现没有云符号的点开都是可以直接播放的所以想着应该是下载下来了,就是不知道下哪里去了

@lmst2
Copy link
Author

lmst2 commented Jul 16, 2022

好家伙,为什么要过滤掉呀,是不是暂时只开发了小说缓存功能。。另,这个音频我也不清楚,我是直接点进去发现没有云符号的点开都是可以直接播放的所以想着应该是下载下来了,就是不知道下哪里去了

更正,我断网试了一下,确实只缓存下来了url

@gedoor
Copy link
Owner

gedoor commented Jul 16, 2022

是的,音频只缓存了地址,所以过滤掉了

@lmst2
Copy link
Author

lmst2 commented Jul 17, 2022

遇到一个问题
image
这是BookHelp.kt里面有保存文件的function。我参照这个function的保存地址在HttpReadALoudService.kt里把音频保存在了缓存之外的一样的地方。
image
image
地址检查过了和txt文件在一起。但是运行起来他却报错说read only file system。
image
这是啥情况呀,按理说这个文件夹是应用内部文件夹,不存在read only的情况呀,况且另外一个地方的function都能保存,为啥我写的就不行呢
提前感谢了。。

@lmst2
Copy link
Author

lmst2 commented Jul 17, 2022

咳咳,发现问题了。。
image
习惯性在开头初始化变量,奈何开头的时候mIntent还没传进来。所以变成空字符串了,相当于直接在根目录写入了,当然没权限2333

@lmst2
Copy link
Author

lmst2 commented Jul 17, 2022

我暂时放弃写这个功能了。ReadAloudService是单线程的,和下载器的concurent并发严重冲突。(下载的内容混乱,或者干脆没下完就跑到下一章了)其中应该也有一些异步的问题。我想让它异步等待小说文本和声音一起下载完再下载下一章,但是基本上就是小说文本下载完了就下一章了。对于界面完全不了解,本来打算借用本来就有的缓存功能勉强实现一下的。但是发现我还是技术力不够。加上我对这个应用的异步处理不太了解。所以打算暂时放弃了。

大佬们如果有空闲时间可以帮我把这个功能实现一下吗,还是很想要这个功能的。过几天我再看看有什么思路吧 @gedoor @821938089

@github-actions
Copy link
Contributor

由于长期没有状态更新,该问题将于5天后自动关闭。如有需要可重新打开。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Stale 需求 F.用户提出的功能意见
Projects
None yet
Development

No branches or pull requests

3 participants