不信人间有白头

曲淡歌
曲淡歌@admin

2024 年 7 月 16 日

语音笔记AudioPen的“平替” 

前言

在b站发出AudioPen的视频后,有网友问有没有能自己部署的项目做平替,那今天就来分析一下如何找到AudioPen的平替。

现有项目

AudioPen的工作原理其实并不复杂,语音转文字–>文字发给LLM,也就是说它并没有核心技术,只是现有技术的整合,因此如果去google以audio notes为关键词搜索,能找到好几个类似的软件,但是他们的定价策略甚至还比不过AudioPen,因此不考虑这类软件。

语音输入法+LLM

最简单的办法就是用语音输入法输入一段文字,然后发给任何一个大语言模型(比如ChatGPT),然后告诉它:“你现在是速录员,请把下面的口语整理为通顺的书面表达”,通过微调提示词,可以得到不同的效果。

Alog:ios平台+需要网络

如果使用的苹果设备,可以去app store搜索alog,这是一个可以使用自己的LLM key的软件,同时还支持apple watch端,是一个我比较看好的软件,它采用ios内置的本地语音转文字功能,仅需要自己去解决第二步的问题,而互联网上有很多免费的key获取途径。

OralPen:ios平台+需要网络

Allwillcome/OralPen: 出口, AI 成章| Record voice and refine it into language ChatGPT understands.

这是一个使用ios的快捷指令实现的脚本,也是通过ios内置的本地语音转文字,然后将转录稿发送给自定义的LLM,其实只要读懂了这个脚本,几乎就可以在任何一种设备上复刻AudioPen。

![[assets/Pasted image 20240716175420.png|assets/Pasted image 20240716175420.png]]

whisper+llm本地离线:任何平台+无需网络

通过上面的两个例子,我们完全可以通过whisper本地模型来转录语音,再用LLM来处理文字,如果本地算力足够,可以通过如ollama等服务在本地部署自己的LLM并通过api来使用它。

小结

看上去有很多方法,但殊途同归,他们都是采用的同样一套原理。但是AudioPen的效果出奇的好,可能作者在某些细节进行了处理,因此,如果想得到最好的效果,目前来看,我还是推荐付费使用产品。如果只是想尝鲜,完全可以用语音输入法那个方案,同时像ChatGPT本身就支持语音输入,也可以直接让它帮你总结。

本文永久更新地址:

https://blogs.qudange.top/p/2024-07-16-audiopen-substitute/

#[17] #[4] #[3] #知识管理 #笔记软件
2024 年 7 月 16 日 75 43

Reply

曲淡歌
曲淡歌@admin

2024 年 7 月 15 日

AudioPen:让Ai帮你整理碎碎念,语音转书面化文字的利器 

AudioPen:让Ai帮你整理碎碎念,口语文字书面化的利器

本文标题又为:除非你比我的独处更迷人

前言

你在独处的时候,会自言自语吗?

你觉得你的自言自语有没有价值呢?

如果有,应该如何利用它?

如果上述的3个问题的答案都是肯定的,那么请你看下去,一定会有所收获。


利用ChatGPT将口语书面化

本节标题又为:一个不破碎的你,终于拯救了一个破碎的我

在上班的路上,在放学的途中,在独处的思维漫步时,在骑着单车享受夏风时,我都喜欢碎碎念。

诸军,我喜欢碎碎念。因为我喜欢和自己对话,这让我感觉自己的思绪从未如此清晰过。

我和我谈天说地,从宇宙大爆炸聊到国际局势,从游戏版本平衡聊到习习晚风,从花前月下聊到幽微……

曾经我苦于无法将这些独处的迷人记录,而现在我发现了一种方法:语音识别+大语言模型总结。

有很多办法去实现它,如ios的捷径,一个名叫alog的app,但是我最后选择了AudioPen这个web应用,只有一个原因:它的综合效果最好。

AudioPen简介

简单介绍一下它的使用方法:
打开网页–>开始录音–>对着麦克风谈天说地–>完成录音,app开始总结–>得到一个书面化的文字总结,包括标题和内容(如果不满意的话,可以调整书面化的力度)

书面化力度分三档:
1. 低:稍微清理,去除口语词
2. 中:保留口语结构与词汇,以选定的风格重写
3. 高:在中等基础上,可能会重组其内容,可以设置长度限制

预设的风格如下:
1. Casual Memo:Write in a clear, slightly formal, and witty style. Don’t use very complex language or sentence structure.
2. Simple & Clear:Friendly, flowing, simple sentences. Use simple words. Prioritize clarity above all else.
3. Descriptive:Create vivid images for the reader using sensory language, metaphors, similes, and other figures of speech.
4. Legal:Write in a legal style. Use highly formal language that is precise, includes complex sentences, and legal terminology.
5. List:Create a bulleted list. Use short sentences. Ensure each point is written within a bullet.
6. Write like me:Write in a style similar to the following text:【】Replace this text with a few paragraphs of your own writing.

AudioPen效果展示

如果你对它的不同档位感兴趣的话,下面附上原始转录的文本与低中高三档重写后的文本。风格均采用Casual Memo

1. 原始转录

注:这里的原始转录已经被去除了语气词,如果想看直接录音后识别重写的效果,请前往我的b站账号【曲淡歌】查看相关视频。

来聊一下我对守望先锋的一些感受和看法。 第一点先聊一下地图设计吧。 我觉得地图设计首先要遵循一个底层逻辑, 就是优秀的地图设计必须做到 让玩家凭借着直觉也能获得较好的游戏体验。 或者换句话说,整个游戏的底层逻辑都应该是这样。 为什么说要让玩家凭借直觉也能获得较好的游戏体验呢? 我们这里举一个正向例子和一个反面例子。 正面例子就是国王大盗。 国王大盗作为一个几乎所有人都喜欢的地图, 他的优秀在哪?我们后面会谈到。 然后我们再举一个反面例子,月球基地。 为什么大家都讨厌月球基地? 那么我们结合国王大盗的优秀, 我们来谈一谈他们的差别在哪? 我觉得一言以蔽之就是 国王大盗是一个任何玩家凭着直觉都能获得较好体验的地图, 而月球基地是反直觉的,也不是完全不能玩, 但是如果没有经过刻意的分析和训练, 没有经过学习,你很难获得一个良好的体验。 就像一款游戏,如果需要看攻略才能够玩得舒服, 那作为游戏,它本身是比较失败的, 或者说是有很高能量的。 国王大盗他不需要引导, 然后凭着直觉就能玩的一个重要的表现就在于 他给进攻方和防守方都提供了相对来说比较平等的地理环境。 一般来说,守望先锋的非对称地图, 防守方都是有优势的, 而进攻方因为重生点更近, 所以一般会有一些地形上的劣势, 往往体现为防守方有高台可以高打低, 防守方有更多的掩体可以借助掩体来回避伤害, 然后获得喘息的机会。 那我们接着看国王大盗, 他的A点进攻是平地, 防守方虽然有一个高台, 但这个高台踩着没有这么舒服, 因此大部分人都会站在一楼和进攻方在同一个平面交战, 同时他的掩体又是相对来说比较公平的, 也就是说防守方和进攻方都有足够多的掩体使用, 同时进攻方又可以从左手的小房间进行绕后偷袭, 但是这个绕后也可以由防守方执行, 也就是说进攻方和防守方在根据直觉向前走的路上 就能够获得他们需要获得的一切。 而相比之下,为什么月球基地让大部分人都很讨厌? 其中有一点就是月球基地的防守方是自然而然的踩到了二楼, 而进攻方是自然而然的走一楼。 当然月球基地可以走二楼进攻, 但走二楼是需要付出一定的代价的, 因为前往二楼的路上需要被对面收很多过路费。 其次,因为进攻有三条路线可以选择, 所以在玩家没有足够的经验支撑的前提下, 有很多玩家不会选择走二楼。 这就是地图的设计对玩家的引导作用。 然后我再谈一谈英雄设计。 依然延续我之前说的一个观点, 就是优秀的设计是要让玩家凭着直觉就可以做出正确的行为。 那么,什么叫优秀的英雄设计呢? 首先我们要确定我们想把这个游戏变成什么样子, 究竟是团队作战还是单打独斗? 什么叫优秀的顺应直觉的设计? 比如说,法机会飞,天使也会飞, 法机和天使一般会被放到一起使用, 这个就是符合直觉的。 大锤可以举盾,但盾碎掉之后是需要一定的缓冲时间, 这个时候可以用矛魅来提供一个短暂的护盾来渡过他的技能增攻期, 所以就形成了经典的逼推体系。 而到了守望先锋2,从6v6变成5v5之后, 我们可以看到有很多经典的设计被破坏了, 同时带来了很多强调单打独斗、个人英雄主义的设计, 这就导致这个游戏在团队和个人之间不断地来回拉扯, 让玩家感觉到很痛苦。 典型例子就是伊拉瑞,作为一个辅助, 他的奶量大部分都来自于他的炮台, 而他的炮台是不可以移动的, 每次释放都要很小心, 这就带来一个后果就是在很多地图他都不是很好用, 然后他过于强大的输出, 就让玩家用他的时候会经常忘记来人。 更有甚者,有些伊拉瑞玩家会自己一个人走一遍, 然后把光塔放出来给自己一个人用, 相当于队友就少了一个辅助。 这个就是很差的设计。 然后在最近的古丁更新了这么一条, 就是增大了光塔的奶量, 但是伊拉瑞自己受到光塔的治疗会减慢。 我觉得这就是一个很好的设计, 通过这样的设计就可以自然而然地引导玩家去为团队做贡献。 当然我并不是说单打独斗是错误的, 但是如果要把这款游戏定位成团队英雄设计游戏, 那么你就不应该出太多的个人英雄主义英雄。 但我当初对守望天空下的这样一个判断, 如果这款游戏想要活得长久, 那就应该让全员都转向个人英雄主义, 因为这样可以尽量减少玩家的挫败感。 当然这个问题在于, 如果你不去修改老英雄, 只是出新英雄, 那么会诱导玩家群体的分裂, 因为新的个人英雄主义英雄和旧的团队主义英雄 势必会产生割裂。 那么我们再谈一谈 守望先锋一和守望先锋二。 我觉得守望先锋一是一款很有匠心的游戏, 而守望先锋二明显是一款为了市场和金钱妥协的游戏。 它其实在我心中根本算不上二代, 因为它没有出现本质上的区别, 也没有足够多的内容。 它只是在一代的基础上换了一个皮。 而且换皮这个动作本身也让人感到很失望, 因为一代的UI音乐,包括很多功能, 其实已经做得很好。 二代为了凸显它和一代的不同, 强行修改了这些东西。 即便到现在都有很多不完善的地方。 至于很多人说一代台速度很慢, 更新这些东西, 它本质上是为了二代买单的呀。 守望先锋一末期有两年停更的时间, 没有更新。 没有更新所以导致游戏玩家流失严重, 然后越来越多的玩家走了, 导致排位速度变慢。 那如果它正常更新, 肯定不可能是现在这个样子。 但是守望先锋二更新的内容, 其实就是守望先锋一本来该更新的内容。 你不能拿守望先锋一没有更, 但它本应该更新的东西, 来作为守望先锋二打败守望先锋一的坛子。 这样去对比是不合理的。 而守望先锋二它自己独特的卖点, 比如PVE这些东西, 其实它都没有实现, 它只是出了新地图新英雄, 这些本来就应该由守望先锋一推出的东西。 然后守望先锋二其实就是为了改变 守望先锋一的付费方式的一个噱头。 本来是当年承诺的买单自由行, 现在却要改成内购点卡自由, 内购游戏,微交易游戏, 因此它需要了一些借口。 包括它当年留下的承诺, 玩家是可以选择玩守望先锋一还是守望先锋二, 这些承诺都被出耳翻耳, 这也是让人觉得很好笑的事情。

2. 低档

本例子无法用低档重写,原因未知。

3. 中档

标题:《守望先锋》感受分享

内容:

来聊一下我对《守望先锋》的感受和看法。

先说地图设计。我觉得优秀的地图设计要让玩家凭直觉就能获得好的游戏体验。举个例子,国王大道是一个大家都喜欢的地图,因为它让玩家凭直觉就能玩得很好。而月球基地则相反,需要经过分析和训练才能获得良好体验。游戏如果需要看攻略才能玩得舒服,那它本身就是失败的。

国王大道的设计给进攻方和防守方提供了相对平等的地理环境。进攻方和防守方都有足够的掩体使用,可以绕后偷袭。相比之下,月球基地的防守方自然占据二楼,而进攻方走一楼。虽然进攻可以选择二楼,但需要付出代价。因此,很多玩家不愿意走二楼,这就是地图设计对玩家引导作用的体现。

再谈英雄设计。优秀的设计要让玩家凭直觉做出正确行为。例如,法鸡和天使会飞,一般会被放到一起使用,这符合直觉。而大锤可以举盾,但盾碎掉后需要缓冲时间,可以用毛妹提供短暂护盾。这些都是经典的设计。

到了《守望先锋2》,从6v6变成5v5,很多经典设计被破坏,带来了强调单打独斗的设计,让玩家感觉痛苦。例如伊拉瑞,她的大部分治疗来自炮台,而炮台不能移动,每次释放都要小心。这导致她在很多地图上不好用,并且她强大的输出让玩家常常忘记团队合作。

最近更新增大了光塔治疗量,但伊拉瑞自己受到治疗会减慢,这是一个好的设计,引导玩家为团队做贡献。如果游戏定位是团队合作,就不应该有太多个人英雄主义英雄。但如果想让游戏长久,就应该转向个人英雄主义,以减少玩家挫败感。

最后谈《守望先锋1》和《守望先锋2》。我觉得《守望先锋1》是一款很有匠心的游戏,而《守望先锋2》明显为了市场和金钱妥协。它没有本质上的区别,只是在一代基础上换了个皮。即使这样,《守望先锋2》也没有实现它独特的卖点,比如PVE模式,只是推出新地图新英雄,这些本来就应该由一代推出。

总之,《守望先锋2》只是为了改变付费方式而存在,本来承诺买断制,现在改成内购,这让人感到失望。

4. 高档

标题:《守望先锋》体验分析

内容:

让我来谈谈我对《守望先锋》的感受和看法。首先,我们聊聊地图设计。优秀的地图设计应遵循一个底层逻辑:让玩家凭借直觉也能获得良好的游戏体验。举个例子,《国王大道》几乎人人喜爱,因为它的设计让玩家不需特别引导就能享受游戏。而《月球基地》则相反,防守方天然占据二楼优势,进攻方如果不经过刻意学习,很难有好的体验。

再谈英雄设计。优秀的英雄设计也是顺应直觉的,比如法鸡和天使常被搭配使用,这符合直觉。而大锤举盾后可以用矛魅提供短暂护盾,这形成了经典的逼推体系。但在《守望先锋2》中,从6v6变成5v5后,很多经典设计被破坏,强调个人英雄主义的设计让团队合作变得痛苦。比如伊拉瑞,她的大部分治疗来自炮台,但炮台不能移动,这在某些地图上效果不好。

最后,我们比较《守望先锋1》和《守望先锋2》。一代是一款匠心独具的游戏,而二代明显为了市场和金钱妥协。它没有本质上的区别,只是在一代基础上换了个皮,而且很多功能反而不如一代完善。更糟糕的是,二代为了改变付费方式,违背了当初的承诺,让人觉得很失望。

总之,《守望先锋2》并没有带来足够的新内容,只是利用了原本一代该有的更新。这种做法不仅让人失望,还破坏了玩家对游戏的信任。


前人工智能时代,ASR悄然积蓄力量

自动语音识别,即ASR(Automatic Speech Recognition, ASR ),在那个ChatGPT还没有出现的年代,就已经很成熟了,即便是面向大众的民用技术,也能做到百分之九十左右。我印象中,十年前就有用语音输入法写小说的网文作者,像科大讯飞更是以语音识别为核心技术卖点,它家的语音输入效果也确实很好。

那个时代,我们就已经习惯了生活中的语音输入,但是它的作用好像也仅限于“唤狗”这种层级的操作,就像现在依然还停留在上个时代的智能语音助手,往往靠复杂的脚本来完成功能,因此说一句话让它“设置一个早上八点的闹钟”,和用一种独特的口哨来达到相同的目的,从原理上并没有区别。


后人工智能时代,LLM让Ai再次伟大

十年前吴恩达就说过,99%的准确度是语音识别的质变时刻,而即便到今天,单纯的ASR也不敢保证做到99%的精确度。

或者从某种意义上讲,人类的非标性让机器伤透了脑筋。如果你曾经进行过演讲/口播,就会发现人的说话其实充斥着没有意义的停顿和语气词,也就说完全准确的识别一个人的话语,并不能准确得到他想表达的意思。换言之,话语的冗余量很大。

但是人为什么可以理解另一个人的所说?因为人能够理解并筛选。而大语言模型(LLM)的出现,为机器理解人提供的出路。现在我们只需要用已经很成熟的ASR技术识别完语音,再把转录好的文字稿发送给LLM,让LLM来理解并以书面化的表达来重写口语稿,就能得到容易理解的文字了。

本文永久更新地址:

https://blogs.qudange.top/p/2024-07-15-audiopen/

#[17] #[4]
2024 年 7 月 15 日 96 82
曲淡歌
曲淡歌@admin

2024 年 7 月 14 日

obcsapi —— 最好的obsidian工具(需要云部署) 

前言

为什么很多人会纠结用notion还是obsidian?因为notion具有强大的在线功能,一旦使用场景超越了单设备,obsidian用户就不得不面临诸如“同步”、“发布”和“跨设备”的问题。

我使用obsidian三年有余,尝试了几乎所有同步方式,最终得出结论:目前现成的解决方法不可能得到完美体验(指对标原生在线的笔记应用,如notion)。

因此首先需要厘清自己的需求,再因地制宜去改造obsidian,这也是obsidian最大的优点:客制化潜力巨大(来源于它使用md格式文件和它繁荣的插件社区)。

比如我的工作流包括以下场景:
1. 在pc上使用obsidian客户端写笔记
2. 在手机上看b站视频、浏览器网页的时候想要分享我看的东西
3. 在手机上记录memos
4. 在手机上查看我的obsidian笔记库并编辑

其中最麻烦的事是如何在手机上得到良好体验,obsidian虽然有官方的app,但是体验不佳。而且在手机端进行复杂编辑还想要好体验本身就是一个伪命题(除非外接显示器和键盘),因此我选择使用网页(当然这里做出了妥协,即放弃了ob各种强大的功能,网页上只做简单的文字编辑),这样直接解决了跨平台的问题。

通过上面的分析后,拆解我的工作流来分析需求,可以得到三个版块
1. 同步
2. 信息输入
3. web发布

obcsapi几乎完美的符合了我的需求,下面我将正式开始介绍obcsapi这个开源项目。

obcsapi是由中国obsidian用户恐咖兵糖开发的一款obsidian工具,其官方介绍如下:

基于 Obsidian S3 存储, CouchDb ,本地存储和WebDAV 的后端 API ,可借助 Obsidian 插件 Remotely-Save 插件,或者 Self-hosted LiveSync (ex:Obsidian-livesync) 插件 CouchDb 方式,保存消息到 Obsidian 库。或者支持本地文件夹的文本编辑器。特点

  • 前端添加 Memos / 简答编辑 , 支持指令模式,有黑暗主题 ,是 PWA 应用
  • 微信测试号 微信到 Obsidian
  • 支持简悦 SimpRead Webook 裁剪网页文章
  • 支持 fv悬浮球文字图片分享保存
  • 静读天下 MoonReader 高亮标注 仿 ReadWise API
  • 通用 http api
  • 使用 Lua & Bash 拓展功能。用户可以处理任何请求
  • WebDAV 服务
  • 一个简易图床,附带命令行上传工具。
  • 云函数 或者 Dokcer 部署

可以看到obcsapi的使用前提是需要自己部署,我个人是采用自租vps部署,当然也可以使用云函数+对象存储,Nas+内网穿透等方法。

它可以做到包括但不限于如下功能:

  • 部署一个web页面,可以访问、搜索并修改obsidian整个库
  • web页面类memos,可以快速记录灵感想法

图片

  • 支持api输入,可以使用任何支持http quest的工具集成,如fv悬浮球/静读天下/简悦/ios的捷径/tasker/Windows Quicker等
  • 支持微信公众号测试号、企业微信,可以从微信端传入信息
  • 自带webdav服务,可以把obsidian库作为webdav的目录,这样就能与remotely-save等插件集成,进行同步
  • 自带图床,web上传图片自动存到图床并插入笔记
  • 支持分钟级待办提醒(微信推送、邮件提醒),邮件提醒可以自动识别最近三天日记中的所有待办并且每天早上发送邮件提醒,即每日提醒功能

还有更多功能见文档Obcsapi使用说明

最后实际的使用效果见我的b站视频:Obcsapi:如何让obsidian和notion打擂台?【元知识】_哔哩哔哩_bilibili

本文永久更新地址:

https://blogs.qudange.top/p/2024-07-14-obcsapi/

#[17] #[4]
2024 年 7 月 14 日 299 76
曲淡歌
曲淡歌@admin

2024 年 7 月 13 日

如何下载网易云音乐的普通歌词与双语歌词 

下载网易云歌词的办法

参考资料:无需下载软件!网易云歌词下载&网站生成SRT字幕方法_哔哩哔哩_bilibili

简要总结:

F12 打开控制台,搜索 lrc 能找到 lyric?csrf_token=29d51bc21214a2b0039928c8dc704967 这种格式的网址,然后右键复制响应,把包含歌词的json文件粘贴到一个word文档内,搜索替换换行符 \n 为手动分页符(替换的高级功能中手动选择)

然后把格式化完成的歌词放到 .lrc 文件中

下载双语歌词

原文地址:[下载网易云音乐的双语歌词](https://umi.im/cloud-music-lrc/

==网易云音乐==是国内最好的音乐平台,歌曲丰富,而且很多外语歌都有双语歌词。但是==网易云音乐==不提供歌词下载,用手机客户端可以一键获取,但是获取到的歌词并非 LRC 格式的,而且文件名是纯数字,不方便用。

在 PC 端,可以通过一段 JS 脚本直接获取到双语的歌词。

使用方法:

  • 打开需要下载歌词的歌曲==网易云音乐==链接,通过地址栏 URL 获取到歌曲 ID 。

cloud-music-lrc-1

  • 按 F12 打开审查元素(Chrome浏览器),点击 Console 。

cloud-music-lrc-3

  • 把下面代码最后一行里面的歌曲 ID 替换成自己需要下载歌词的歌曲 ID ,复制粘贴并回车运行。
(function(songID){
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://music.163.com/api/song/lyric?lv=-1&tv=-1&id=' + songID, true);
    xhr.send();
    xhr.onload = function() {
        var data = JSON.parse(xhr.responseText);
        var lrc = data.lrc.lyric.match(/\[\d+:\d+\.\d+[^\[]+/g);
        var tLrc = data.tlyric.lyric.match(/\[\d+:\d+\.\d+[^\[]+/g);
        var newLrc = [];
        lrc.map(function() {
            newLrc.push(lrc[arguments[1]]);
            newLrc.push(tLrc[arguments[1]]);
        });
        window.open('', "_blank", '').document.write(newLrc.join('<br>'));
    };
}('28870317')); // 歌曲 ID
  • 弹出阻止运行窗口请允许。

cloud-music-lrc-2

  • 完美得到带时间轴的双语歌词,自行保存为 LRC 格式就好了,或者直接嵌入歌曲标签里面。

cloud-music-lrc-4

感谢 V2EX 用户 demo 贡献此脚本。

GitHub地址:anonymous/concat_163_music_lrc.js

本文永久更新地址:

https://blogs.qudange.top/p/2024-07-13-how-to-download-the-lyrics/

#[17] #[2]
2024 年 7 月 13 日 42 68
曲淡歌
曲淡歌@admin

2024 年 7 月 13 日

安卓端用tasker实现ai总结b站 

前言

本文的实现方式受到chrome拓展ChatGPTBox的启发,原理是通过b站的api和cookie获得自动ai字幕,然后用大语言模型(LLM)来总结字幕,从而获得视频的总结。

此工具的功能是帮助用户快速总结视频内容,以提高信息获取的速度。诚然,b站自己也推出了ai总结功能,但是那个功能很不稳定,有时候对一个视频有详细而结构化的总结,有时却只能得到一句话的概括,即便LLM已经火了两三年了,b站仍没有在这块投入过多,因此只能自己动手,丰衣足食。

本工具的缺点:
1. 无法总结没有字幕的视频(但是像bibigpt和b站官方的ai总结有时候能总结没有字幕的视频,我怀疑是有其他途径获取字幕)
2. 对视频内容和音频内容非强相关的视频无效(例如一个ASMR催眠视频,如果只用声音来判断,可能整个视频都是没有意义的。我们期待在未来多模态的ai能解决这个问题)
3. 需要使用b站的cookie才能获取视频字幕,而cookie是动态变化的,因此需要cookie刷新机制,我的处理办法是使用cookiecloud(需要自己的服务器/托管在别人的服务器上)

安卓端利用tasker实现ai总结b站

工作原理

  1. 如果视频是手机分享的短链接形式(https://b23.tv/xxxxx ),则通过域名重定向获取bid(BVxxxxxx)
  2. 已知bid后,获取cid https://api.bilibili.com/x/web-interface/view?bvid=%bid
  3. 已知bid和cid后,获取包含字幕链接subtitle_url的信息https://api.bilibili.com/x/player/v2?cid=%cid&bvid=%bid
  4. 将字幕发送通过api发送给ai,让ai总结

案例:

以视频【游戏试玩】杀戮尖塔+娃娃机=抓抓地牢?游戏实况 为例,如果采用安卓端国内版bilibili应用分享链接,得到的链接为【【游戏试玩】杀戮尖塔+娃娃机=抓抓地牢?-哔哩哔哩】 https://b23.tv/jpcq7rz

(隐藏的第一步为获取最新的cookie,因为实现方法不唯一,在下一章节介绍)

因此第一步是要从文字中提取出链接,一般采用正则

(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]

得到结果为https://b23.tv/jpcq7rz,然后我们需要将短链接转为长链接,最简单的办法就是使用浏览器的重定向功能,最终将得到https://www.bilibili.com/video/BV1DC411J7Wy/

然后使用正则提取出bid,正则如下:

BV([^/?]+)

即得到BV1DC411J7Wy

然后执行http get https://api.bilibili.com/x/web-interface/view?bvid=BV1DC411J7Wy 可以获取一个json文件,需要从中提取cid,因此执行两次正则

正则1(先匹配cid):

"cid":(\d+)

得到:"cid":1524209082

正则2(提取cid的值):

(\d+)

得到1524209082

然后获取字幕url,执行http get https://api.bilibili.com/x/player/v2?cid=1524209082&bvid=BV1DC411J7Wy
注意,header中需要加入cookie,如

User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36
Cookie:%cookieString

然后会获得一个包含键为subtitle_url的json文件(前提是视频有字幕),因此这里为了避免不存在字幕产生的误会,需要做一个有无的判断

用正则进行匹配

//[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]

如果不匹配,则提示此视频无字幕,若满足则进行下一步

subtitle_url执行http get,获得json,提取键content

然后把content的内容http post给LLM

headers:

Authorization: Bearer %api_key

body:

{
    "model": "%llm_model",
    "messages": [
        {
            "role": "user",
            "content": "用尽量简练的语言,采用markdown语法书写(不要用代码块包裹),联系视频标题,对视频进行内容摘要,同时仍要保留重要细节和标题信息,视频标题为:%bili_name,字幕内容为:%subtitle"
        }
    ],
    "use_search": true,
    "stream": false
}

然后就能获得ai总结的内容了

同步cookie

我选择使用开源项目CookieCloud实现cookie的同步

变量解释:
%cookiecloud_urlcookiecloud服务器域名,例如:https://cookiecloud.25wz.cn/,注意,结尾没有/
%cookiecloud_uuid:见cookiecloud插件文档
%cookiecloud_key:见cookiecloud插件文档

步骤详解:

执行http get %cookiecloud_url/get/%cookiecloud_uuid
请求的body如下:

password%cookiecloud_key

这一步会获得解码后的json,包括cookie和localdata

然后通过JavaScriptlet来格式化cookie

var jsonData = JSON.parse(local('%http_data'));
var cookies = jsonData.cookie_data[".bilibili.com"];
var result = [];

for (var i = 0; i < cookies.length; i++) {
    var name = cookies[i].name;
    var value = cookies[i].value;
    result.push(name + "=" + value);
}

// 将结果存储在Tasker的全局变量中
setGlobal('cookieString', result.join(';'));

注:其实这一步理论上只需要SESSDATA,我为了省事这么写了。
格式化得到a=1,b=2,c=3格式的cookie信息,然后参见上一章完成目标即可。

本文永久更新地址:

https://blogs.qudange.top/p/2024-07-13-android_tasker_ai_summary/

#Ai #[5] #[17] #gpt #LLM
2024 年 7 月 13 日 160 63
曲淡歌
曲淡歌@admin

2024 年 7 月 13 日

。。玩笑归玩笑,绝区零真的是动作游戏爱好者福音吧。本人爱丽丝摇篮45小时,魔女复仇之夜82小时,棘罪修女60小时,哥特修女勇闯恶魔城一71小时,哈奇娜怪异谭79小时,阿尔卑斯与危险森林67小时,深海姐妹42小时,银白猎人91小时,​夏哈塔遭​难的一天88小时,圣骑士莉卡79小时,悲剧森林34小时,乱斗少女53小时,wings of blood 55小时,深渊之魂62小​群青的魔​女魔女49小时,玉莲之剑21小时,永恒的欠损79小时很多老动作游戏也都玩过了,只有绝区零能给我一种刚接触动作游戏时的感动。​

#[4]
2024 年 7 月 13 日 33 40

Loading...
Loading

Finished

No more pages to load

C
Compose new post
S
Search
J
Next post/Next comment
K
Previous post/Previous comment
R
Reply
E
Edit
O
Show/Hide comments
T
Go to top
L
Go to login
H
Show/Hide help
Ctrl+Enter
Submit post
ESC
Cancel and clear content