【2025.02】聊聊最近可以角色扮演的模型

有一段时间没推荐过新模型了,这次推荐的主要是长上下文模型,比较适合角色扮演(当然大部分也是通用模型)。

之前模型百花齐放,主要得益于Yi-34B和Qwen-32B的各种微调。现在这些内容有些过时了,所以这期主要是推荐一些云端模型。

这些模型要么没有审核,要么很容易jailbreak,具体就自己发挥吧。

MiniMax-Text-01

海螺AI的开源模型,角色扮演型模型。他们家主要就是做角色扮演的,旗下有个叫星野的APP,用的是一个小号模型。

和Deepseek一样,对个人来说开源了等于没开源,体积太大了。
官方的Demo:点这里,我适配的接口:点这里
要稳定的话自己官网注册账号,1M上下文,输入0.001元/千token, 输出0.008元/千token。

这个模型发布后登上了几天Huggingface热门榜,然后就没什么波澜了。官方模型介绍提到「其中每8层中有7个是基于Lightning Attention的线性注意力,有一层是传统的SoftMax注意力」,是不是有点像RWKV?

效果上看:适合角色扮演,但也只适合角色扮演。不要用在需要严谨推理的地方,尤其是不要问数学题。

Doubao-character

豆包专门用于角色扮演的模型,这是一个系列,有Lite和Pro以及最多32K上下文的版本,官方每个版本送500万tokens。
我只是浅浅试了一下jailbreak,几乎没有限制,更多的就没有深入体验。

character版本的低限制应该是有意设计的,普通的Pro版本很难越狱(Lite可以jailbreak,但文本质量差很多)。

Gemini-2.0-Flash

Gemini 2.0 Flash正式版发布了,可能是受股价下跌的刺激,这次来得很突然。正式版模型有1M上下文,限制比任何实验版都要少。这个模型很强,除了扮演也可以干正事。

在最近的审查选项里,除了BLOCK_NONE外还额外新增了一个OFF。在谷歌给的演示中,HARM_CATEGORY_SEXUALLY_EXPLICIT就是OFF,好像是在暗示什么。我不知道两者有什么区别,总之调成OFF后,正式版几乎不会中断输出。

关于Gemini还有两个小新闻。
第一是,实时搜索功能上线了,好像是仅限付费版,要在tool参数里设置。
第二是,API上的思维链被砍了,只能AI Studio里看到思考内容。我不知道谷歌为什么要这么做,而且就在Deepseek R1刚发布后,感觉纯纯有病。

Qwen-2.5-Max

也是在Deepseek发布后紧急上线的模型,能力比Deepseek强。通用能力强,扮演也强,和Gemini一样,可以作为主力,然后就是贵。刚发布时完全被R1的光芒掩盖了,春节后才开始登上榜单。

官方的Demo:点这里,我适配的接口:点这里
要稳定用的话去官网注册吧,应该是送不少tokens,我估计过阵子价格还会降。

deepseek-chat

我测试是可以扮演的,但是因为热度的关系,实在是太卡了,也就没深入测试。R1不适合扮演,莫要强求。


自从Yi-34B发布后,我就有个想法,以后只会有小模型和超大模型开源。
原因是小模型是端侧的玩具,几乎不能拿去卖钱;超大模型用来秀肌肉,开了等于没开,如开;中等体量是真的能用,只会便宜了用户和友商。
不过之后一段时间,Qwen仍在继续更新30-40B的模型,我觉得他们或许也是没什么KPI压力。

随着Deepseek R1的发布,我已经遇到了好几个人和我有同样的想法。在受到商业上的刺激后,不知道阿里还有没有心情做这种「慈善型」的中等体量模型。

再补充下R1蒸馏版的体验

我在之前的文章里说R1蒸馏进Llama 70B后继承了Llama重复的问题,不过话又说回来,后来我又发现R1蒸馏进Qwen-32B后,继承了审查宽松的特性。

目前R1-Qwen-32B可以通过我的这个接口配合自己的HF Token + Model:deepseek-ai/DeepSeek-R1-Distill-Qwen-32B体验。根据HuggingFace的惯例,一旦热度下降就会撤掉部署,估计随时失效吧。

R1-Llama-70B目前可以在Sambanova体验。不过呢,他们很快就要取消免费版了,所以也是随时失效。或者用我的CerebrasUnofficial也行。

蒸馏版纯属娱乐,不推荐自己部署。

对Deepseek R1的看法以及一个蒸馏版接口

蒸馏版接口 => CerebrasUnofficial

最近Deepseek R1很火,出圈首先是因其成本论述引发英伟达股价下跌而受到关注,之后以其独特的攻击性,再次带动了传播。

我实际体验了一下,说实话,感到一般。

我关注的几个问题:

  1. RL(强化学习)涌现CoT(思维链)?效果如何?
  2. 成本削减多大程度可以复制?
  3. 蒸馏进Llama后效果怎么样?

一、关于CoT(思维链)

我测试下来,效果和Gemini比,差了很多。Deepseek不像是think,而是在understand。

关于CoT我最先接触的是gemini-2.0-flash-thinking,觉得很有意思。当时我在解决一个网络问题,模型的thinking让我看到了它的回溯过程。
类似这样:「用户遇到了XX问题,XX结果说明XX没有问题,再看XX可以排除是XX问题。这也许是XX问题,但是从XX的结果看,问题应该也不在这里。这个问题很奇怪,最好再确认一下……(找不到问题,绕回来要求用户检查)」
虽然最终问题没有解决,不过整个CoT很有逻辑,我也学到了一些东西。

Deepseek给我的感觉不是这样,它更倾向于对输入进行复述。比如说,它会对我的要求分类汇总,然后写出需要遵从、注意的点,整体就是像是润色和扩写prompt,体现不出逻辑推理本身。(顺带一提,它有时还会不按think的内容回应,就好像无视了think过程。)

举个具体的例子,例子中的真实对话大约有17K tokens,这是一个比较长的上下文。内容关于一个盗贼角色,该角色被设定为喜欢“黑吃黑”,经常在交易时击晕交易对象,这次他要交易的是情报线索。「击晕」在这里实际上是陷阱,由于情报的特殊性,对方被击晕就无法说出情报了。

Deepseek在长上下文中表现出一定的混乱,从think阶段就经常搞混身份(很多模型都有这个毛病)。逻辑上,Deepseek也常常意识不到陷阱(中间重试多次),击晕对方后直接退场的几率很高。相比之下,Gemini几乎可以稳定发挥,在think阶段就能意识到需要先套取情报,再进行击晕,或者直接放弃击晕。

Grok、Qwen几乎不会出错,不过没有think过程,所以无法进一步判断。

二、关于成本

有兴趣的可以先了解一下友商零一万物 的文章,Deepseek用到的大部分的方法其中都有提到,包括MoE的优化,整体算是科普向。

Deepseek首次在超大模型中使用了混合精度,重点是给出了哪里可以省精度,哪里又不能省。这个属于「我的成功可以复制」,是很重要的贡献。

还有一些是不能复制的,比如说Deepseek训练框架,通过很底层的魔改,实现了更高的并行效率。这种魔改已经接近汇编了,独此一家。
题外话,有传言说Deepseek绕过了CUDA直接驱动显卡,这种能力可以立刻迁移到其他硬件,从而打破英伟达的垄断。这个说法是错误的,具体就不展开了。

这次成本很大一块是通过「CoT可以靠GRPO+RL涌现」来缩减。简单点说,就是不需要标注,直接告诉模型答案,但只能解决已知答案的问题,例如 数学问题,而RL达成了泛化(事实上对于没有答案的问题,还是加入了一定的SFT(监督微调))。我对此表示怀疑,目前Huggingface的团队正在尝试复现,可以继续关注。

Deepseek R1的创作能力排行已经超越Claude,表现在它很有趣、很会阴阳,这和语料是分不开的。实际上R1最后还是经过了两轮SFT,这个成本不仅省不了,而且对语料要求还很高。为了突显CoT部分省成本,这个成本被隐藏了。

还有一些推理方面的成本,不算很重点,略去。

三、蒸馏的效果

这里我使用的是Cerebras提供的deepseek-r1-distrill-llama-70B版本。
作为测试,我做了一个非官方接口。具体的部署方式,查看项目主页即可,此处不展开。

我对蒸馏效果的印象是:形似,但继承了各自的问题。

测试文本大约有15K tokens,此时模型大部分时候还保持think(有时会输出<think></think>省略思考),但很大概率会重复用户的话。这种重复几乎就是逐字逐句,整片大段的重复(这是很多模型在长上下文场景中的通病)。
总结就是,蒸馏版既有Deepseek think等于没think的问题,又有Llama 70B重复的毛病。当然,意义是把CoT迁移到小模型,对需要本地部署的人来说比较重要。

四、商业影响

Deepseek最重要影响是引发行业对成本的关注。从投资角度看,Deepseek冲击的是FOMO情绪,利好除了英伟达以外的所有巨头。
为什么说只利好巨头呢?因为从技术角度看,很难带来大规模的成本下降,也谈不上威胁英伟达的地位。要想实现人人有丹炼,短时间内还不太可能。

五、其他

自动Deepseek火了以后,本地部署Deepseek的文章、视频突然冒出来,这类内容大部分介绍的是完整版R1,实际部署的是蒸馏版,有些甚至是7B以下的超小版本。要知道,一个完整版的R1,在Q4精度下,大约需要400G的内存/显存。这种宣传和诈骗有什么区别?如果真的需要迷你模型,这个尺寸有非常多的选择。

我的建议是,个人用户不要尝试自己部署任何版本,真想用就用官方API。或者,用英伟达的NIM接口,每号1000次对话,可以无限注册。

彻底解决服务器失联问题

服务器因为用过warp脚本后定期失联的问题已经困扰我很久了。

用尽各种方式,以及各种缓解手段,服务器最后还是失联,甚至都找不到任何可疑的进程或服务。试了下debian,也是没辙。

俗话说天下无难事,只要肯放弃。

新开一个服务器,再也不碰warp了,以后就用redsocks+分流的方案。

不用warp让纯IPv6服务器支持IPv4

本站跑在Scaleway的纯IPv6服务器上,之前为了给它加上IPv4,用了Cloudflare warp脚本。

不知道从什么时候开始,服务器就开始经常掉线、失联,也查不出什么问题。后来,换了个脚本,服务器倒是不失联了,但就是连不上,表现为明明已经获得了IP,但不走warp线路。

所以,我决定索性放弃一键warp,只借用Cloudflare补全IPv4就行。

简单来说,新方案是在worker上部署一个vless服务,然后让IPv4走socks代理,IPv6不走代理。

配置代理

先找到另一台双栈服务器搭建服务,然后在本地创建socks5代理。

这里有个现成的在Cloudflare worker上部署vless的方案。
在Cloudflare面板里创建一个worker,然后把这个代码粘贴进去。
Cloudflare屏蔽vless关键词,现将它全局替换成其他词,然后把userID改为自己的UUID。

这就已经部署完了,不清楚vless配置的话访问 https://【your_domain】.workers.dev/【UUID】

一点小毛病

Worker无法访问已经套了Cloudflare CDN的网站。如果配置了socks5Address,就会改走socks5代理。没条件自己搭建socks5代理,或者不在意安全性,可以用这个修改版,里面内置了代理IP。
甚至也可以不配置,只是一些网站不能访问。

现在已经可以跳到下一个步骤——测试连通性。

如果一定要完全访问,且在意安全性,这里有两个方案。

【方案1:自有服务器搭建socks5】

找一台IPv4服务器,用glider配置socks5,例如:
./glider -listen user:pass@[::]:5005
然后将 socks5Address设定为user:pass@【yourServer】:5005

【方案2:无自有服务器建立代理链】

使用任意支持IPv4的代理服务,用CloudFlare作为跳板,承接所有流量。
例如:在HuggingFace Space上建立一个vless服务(复制别人的项目作为参考)
本地连接命令形如:./glider -listen :14159 -forward=wss://【CF-sub】.workers.dev,vless://【CF-UUID】@,wss://【HF-sub】.hf.space,vless://【HF-UUID】@
此时,CloudFlare仅用于桥接用途。

测试代理连通性

由于我的VPS可以直连Worker,所以没有绑定域名。

在服务器上用glider测试一下IPv4连接:

./glider -listen=127.0.0.1:14159 -forward=wss://【your_domain】.workers.dev/?ed=2048,vless://【userID】@
# 有结果,代表CF代理正常。
curl -4 -x socks5h://127.0.0.1:14159 https://google.com

# 有结果,代表可访问CF CDN网站(非必要)
curl -4 -x socks5h://127.0.0.1:14159 https://stackoverflow.com

配置redsocks

安装:apt install redsocks

socks5代理将运行在14159端口,对应的/etc/redsocks.conf配置如下:

base {
  log_debug = off;
  log_info = off;
  daemon = on;
  redirector = iptables;
}
redsocks {
  local_ip = 127.0.0.1;
  local_port = 12345;
  ip = 127.0.0.1;
  port = 14159;
  type = socks5;
}
# 启动redsocks
systemctl restart redsocks
systemctl enable redsocks

设置IPv4转发

# 启用IP转发
sysctl -w net.ipv4.ip_forward=1

# 配置规则
iptables -t nat -N REDSOCKS
iptables -t nat -A REDSOCKS -p tcp -d 0.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -d 10.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -d 127.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -d 169.254.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -d 172.16.0.0/12 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -d 192.168.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -d 224.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -d 240.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345

iptables -t nat -A OUTPUT -p tcp -d 0.0.0.0/0 -j REDSOCKS

# 如果 ip -4 route 结果为空,则需要
# 添加虚拟网关
ip addr add 192.0.2.1/24 dev lo
ip route add default via 192.0.2.1 dev lo

curl -4 google.com试试,应该有结果了。
如果成功,将转发脚本加入开机启动。

顺便解决一下ping问题

由于ping是无法通过socks5代理的,可以用tcping作为替代。

wget -c https://github.com/cloverstd/tcping/releases/download/v0.1.1/tcping-linux-amd64-v0.1.1.tar.gz
tar -xf tcping-*.tar.gz && rm tcping-*.tar.gz
chmod +x tcping && mv tcping /usr/bin
echo "alias ping=tcping" >> ~/.bashrc

至此,tcping完全取代了ping

总结

本文提供了一种用redsocks搭配iptables,为纯IPv6服务器添加访问IPv4能力的方案。

好处是灵活、稳定,自有双栈服务器的话,也可以不依赖Cloudflare。

国内免费静态网页托管服务现状

之前,我在找一个国内可以稳定访问,托管静态页面的地方。记得十年前这种东西很多,如今居然很难找到。

一开始我用的是 华为云函数工作流,根据介绍,每个月前100万次调用是免费的。实际用了一下,才知道现在的云服务这么复杂。免费的只是函数调用次数,而公网流量、网关调用、CPU用时、存储,都要单独计费。

后来我了解了一下其他云服务,计费方案也是特别复杂,如果要走OSS方案,很多云起步都是1G,还必须先预付费100元。这对于我这种只托管一个HTML的用户来说是在大材小用。

我又寻找了一下类似Github Page的托管服务,发现国内基本也都关闭了,只剩下一个 开放原子基金会,要申请才能开通。

最终,还是在阿里找到了好东西,不过不是阿里云,而是 支付宝小程序-云开发。云开发下面有个免费配额,其中就有一项是免费静态托管。月配额:容量 155G,CDN流量1G。

续费最多可以续2个月,一个多月续一次就行了,没什么复杂的计费策略。
开通后自带一个测试用的网址,不嫌网址长的直接用就行了。

一些公共的前端资源

最近需要在国内建立一个纯静态的小网页,html只有10K,还有几个js和css。我不需要自定义域名,但要求微信能稳定访问。

国内没什么免费资源,我就从国外开始找,最终没找到特别好的,要么速度快但个别地区超时,要么不能绑定域名而且被微信拦截…… 我甚至试过把文件托管在有直链的网盘里(例如:城通、123pan,因为原本有会员),但速度或稳定性也不够好。

目前,我姑且在国内云上建立了个函数用来展示网页,又因为种种计费原因,我需要把js文件都托管到别处,于是便有了这篇文章。

公开的资源CDN

一些公共资源有很多文章盘点过了,稍微做个点评

微软Ajax CDN:部分地区不稳定
字节跳动:更新不够快,堪用
又拍云:几个热门库
360:首页不能访问,一些热门资源还能用
饿了么:反代UNPKG但不全
知乎:反代UNPKG但不全
WebCache:很多热门项目
渺软公益 CDN:支持所有回源,兜底

公共但小众的CDN

总的来说,公共库想要全,得像渺软公益CDN反代,而且没命中的要回源。

我收集了一些小众的:

红十字会:unpkg.crcf.cn
瑞幸咖啡:unpkg.luckincdn.com
航天金穗:unpkg.cdn.htjs.net
高灯科技:unpkg-com.goldentec.com
左柚耳机:jscdn.zooyo.club
晓雨科技:unpkg.rain-tech.net
……

还有更多小公司和个人搭建的,以上只是部分。

另类的CDN

反代主要是解决npm托管一些个人JS,公共JS要是能在国内就最好了。问题是,公开的CDN上不一定有想要的JS项目,稳定性也不一定好,所以想到个很神奇的办法——借用腾讯。

腾讯旗下项目众多,总会用到各式各样的JS,流量无限自带CDN。最重要的是域名统一,好找。例如用 Zoomeye 找一下clipboard.min.js,再点Body,就能从响应里看到JS的地址了。

有时会遇到同名不同项目的JS,比如 海贼王的JS三角洲行动的JS 就不是同一个,可能需要多试一试。

总结

关于HTML的托管暂时还没有很好的办法,尽管UNPKG支持显示HTML,但不支持带参数(给JS调用填充页面),虽然直接用云函数成本也很低,但以后文件多了就麻烦了,还是得找找替代方案。

【观察中】尝试解决服务器总是失联

最近几个月,小破VPS总是每隔几天就失联。一开始以为是磁盘满了,但是清理后还是经常失联。查看了日志,也没找到原因。

这是一台纯IPv6机器,使用p3terx的warp脚本获得IPv4支持,所以严重怀疑是warp掉线的问题。我设置了每隔半天重置一次,结果过几天还是失联。

最终,我在作者的日志中找到了说法:

表现为隔一段时间就断网,重启后恢复。常见于 Ubuntu + 双栈全局网络。
可能的原因:

- Ubuntu 系统不稳定
- 性能不足导致的崩溃

解决思路:重启!重装!重买!
解决方法:
- 更换为宇宙最稳定的服务器操作系统——Debian
- 购买更稳定好用的 VPS,能花钱解决的问题都不是问题。

好吧,其实就是作者也没找到原因。这个问题确实是突然某一天开始出现的,也许是和什么包有冲突?

总之,现在换了个脚本:

wget https://gitlab.com/fscarmen/warp/-/raw/main/menu.sh
bash menu.sh

试用了各种选项,经历了五花八门的error,现在开启了IPv4单栈…… 但我完全不记得是什么选项在生效,可能是MASQUE协议+socks什么什么的。

总之先观察看看会不会炸。

VSCode连接AiStudio飞桨平台

最近有人提到了百度飞桨的免费GPU算力,所以就看了下。
目前飞桨每天提供8算力点,可以用四个小时16G V100。

和Kaggle相比,两者免费总时长差不多,不过体验有些区别:

  • 飞桨默认16G V100 ,Kaggle默认16G T4双卡
  • 飞桨可选32G V100,时长相应也只有一半
  • 飞桨自带Code Server,可以和Jupyter一起用
  • 飞桨没有root权限,不能apt install
  • 飞桨有100G的空间,Kaggle只有20G
  • 飞桨的联网很成问题,要先搞定代理

以上除了硬件限制,其他都是可以绕过的。总体而言,由于绘图不能分卡加载的缘故,飞桨适合需要大显存的绘图场景,不过相应的每天只能用2小时。

开始正题,如何使用vscode远程连接?

最简单的答案:使用 handy-ssh 开启一个简单的ssh server,然后使用 netapp 进行穿透。结束。

接下来是一些细节,甚至创建虚拟的root环境,算是对colab、kaggle、huggingface space折腾成果的综合应用。

一些细节

持久化

首先是持久化,/home/aistudio/external-libraries 是永久保存的。任何环境配置都应该在这个目录下进行。
使用code server,新建终端,可以同时运行多个命令。

必要的代理

强烈建议先配一个梯子 + proxychains 强制代理。
尽管本文未用到proxychains,但还是建议配一个,这会减少很多麻烦(例如 直接从github拖东西,而不需要找镜像、手动上传,或是翻阅各个软件的代理配置)。

我的方案是 glider 连接 vless,二进制文件直接通过code server传上去即可。

# 在9050开启socks5和http代理,服务器必须是443端口的
./glider -listen :9050 -forward wss://HOST/PATH,vless://UUID@
# 自行编译proxychains,bin+.so+config
./proxychains4 -f config.conf YOUR_COMMAND
# 配置见/src/proxychains.conf,最后socks4改为socks5

建立ssh server

接着把 handy-ssh 传上去,开启一个22122端口的ssh server,用户名为aistudio,密码为root

./handy-sshd --user aistudio:root -p 22122

自建穿透服务

选择netapp穿透的原因是,飞桨对端口卡得恨死,而netapp的服务正好在443端口。由于注册netapp需要身份证,嫌弃的话也可以自己搭一个。

我用的是 wstunnel

# 服务端
./wstunnel server ws://127.0.0.1:PORT -r PASSWORD

我是用nginx将PORT反代,同时加上证书和域名,这样就得到了一个443端口的穿透专用服务。

./wstunnel client -R tcp://0.0.0.0:22122:localhost:22122 wss://HOST -P PASSWORD

在飞桨里连接服务器,这样就完成了ssh server的部署。

最后通过vscode连接到aistudio:root@HOST:22122。

不需要root环境的话到此为止。

ROOT和开发环境的持久化

使用miniconda将udocker部署到持久化目录,再通过udocker获得一个root权限的容器,以运行简单的apt install

安装miniconda

# 安装miniconda3并创建独立环境my_env
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
bash miniconda.sh
source /home/aistudio/miniconda3/bin/activate
conda create --name my_env
conda activate my_env
conda init --all

安装udocker

重新开启一个终端,使用which python确保使用刚安装的miniconda3,接着安装udocker。

# ~/.udocker是无法持久化的,所以创建一个软链接
ln -s ~/external-libraries/.udocker ~/.udocker
python -m pip install udocker

如果配置了代理,通过代理使用udocker install完成安装。没有代理的话,上传udocker-englib.tar.gz,然后通过 export UDOCKER_TARBALL=udocker-englib.tar.gz指定,实现脱机udocker install

配置udocker环境

如果是GPU环境,可以通过udocker setup --nvidia ubuntu将宿主GPU配置复制到容器内。之前在colab上绘图时试过可用,记得是不需要什么额外设置,飞桨没试。

# 选择focal版本(同宿主),假设配置了代理:
udocker pull --httpproxy=socks5h://127.0.0.1:9050 ubuntu:focal
udocker create --name=ubuntu ubuntu:focal
udocker run --entrypoint=sh ubuntu -c "echo root:root | chpasswd"
# 这步是安装scp,有error无视,也可以从宿主环境复制
udocker run --entrypoint=sh ubuntu -c "apt update"
udocker run --entrypoint=sh ubuntu -c "apt install openssh-client"

# 挂载目录并运行ssh server
udocker run -v /home/aistudio/miniconda3 -v /home/aistudio/external-libraries:/root -p 22122:2222 --entrypoint=sh ubuntu -c "~/handy-sshd --user root:root"

运行时,我将miniconda3直接挂载到容器内,这样容器就不用再安装一遍。同时,我将持久化目录直接当作容器的主目录,这样之前准备的handy-ssh、glider、wstunnel在容器内就可以直接用。

宿主机穿透后,vscode就可以通过ssh连接root:root@HOST:22122,访问udocker内的环境。

此时vscode无法自动找到python,需要在vscode的终端中ln -s /home/aistudio/miniconda3 ~/miniconda3,然后重启vscode,就可以自动发现解释器了。

要注意的是,不能使用 -v /home/aistudio/miniconda3:/root/miniconda3挂载,因为miniconda3在安装后的配置里写死了路径,导致容器内也只认/home/aistudio/miniconda3,这会导致vscode调用时出现混乱。

重启后的环境重建

重启后,非持久化的内容就丢失了,恢复环境需要这些步骤:

# 重新激活 miniconda
source /home/aistudio/miniconda3/bin/activate
conda activate my_env
conda init --all

# 创建软链接
ln -s ~/external-libraries/.udocker ~/.udocker

# 重新建立穿透
cd /home/aistudio/external-libraries
./wstunnel client -R tcp://0.0.0.0:22122:localhost:22122 wss://HOST -P PASSWORD
# 终端新建分屏,开启ssh server

# 无udocker宿主环境
/home/aistudio/external-libraries/handy-sshd --user aistudio:root

# 有udocker的虚拟ROOT环境:
udocker run -v /home/aistudio/miniconda3 -v /home/aistudio/external-libraries:/root -p 22122:2222 --entrypoint=sh ubuntu -c "~/handy-sshd --user root:root"

日常炸服磁盘清理备忘录

烂服务器经常炸,一般重启一下能好一段时间。最近炸服越来越频繁,查了下发现又是空间满了。升级是不可能的,为了防止以后再炸,留一份自用的备忘录。

清理日志缓存关sawp

# 清理日志并限制大小
journalctl --vacuum-size=20M
# 永久生效
# echo 'SystemMaxUse=20M' >> /etc/systemd/journald.conf
# systemctl restart systemd-journald

# 关闭 Swap
swapoff -a

# 清理包缓存
apt-get clean
pip cache purge
npm cache clean --force

# 查看当前目录下最大的10个文件夹
# du -Sh . | sort -rh | head -n10

宝塔面板设置

  • 调整宝塔监控保存天数
  • 清空已有的监控记录
  • 删除 mysql-test,将 binlib 全部 upx --lzma --best * 压缩。
  • 删除 nginx/src

顺便还有个warp配置

# 为纯 IPv6 服务器加上 IPv4
# github 不支持 IPv6,不得不上代理
wget https://cors.eu.org/https://github.com/P3TERX/warp.sh/raw/refs/heads/main/warp.sh
bash warp.sh 4
# 备用的公开代理前缀
# https://webproxy.stratosphericus.workers.dev/
# https://github.moeyy.xyz/
# crontab 设置开机启动
@reboot /bin/bash /root/warp.sh 4
# 有时会掉线 定期重连
0 5 * * 1 /bin/bash /root/warp.sh rwg

一些视频提取文稿的免费方案

最近有个需求,需要提取视频中的文字稿。试了几种方案,各有千秋,也各有各的问题。

字节语音识别

字节的 CapCut(剪映国际版字幕功能)、飞书(妙记功能),都有免费的语音识别,效果很一般。

在语速较快、普通话不标准的时候,会错得很离谱,对配音本身要求高。

不过,这个方案可以作为起手方案,因为速度快、又免费,试试也无妨,效果不行再尝试其他方案。

硬字幕提取

视频本身就有字幕,所以可以直接靠文字识别来提取,我用的是 video-subtitle-extractor

效果还可以,但是背景不能有其他文字。对框选区域也比较严格,框小了容易漏很多句子,框大了容易识别错乱,而且会慢很多。

识别后,将字幕去掉时间轴、修改因背景问题识别错误的部分,然后交给 AI 加上标点。

Whisper

OpenAI 的方案,实测比字节好很多,但是 官方 Demo 不带标点。理论上提供带标点的 init_prompt 可以解决,问题是 Demo 好像没法提供这个参数。

所以说,就变成了要么自己搭一个环境本地跑,要么把不带标点的文稿交给 AI 加标点。

自己搭的话,我测试了一个带标点的中文微调,Belle-whisper-large-v3-zh-punct,直接在 Colab 上提取。遇到的问题是数字都会变成中文,比如出现“iPhone十五”“二百五十六G”这样的情况。

我没找到特别好的解决办法,最终是把稿子丢给 Gemini Pro 改成合适的阿拉伯数字。

另外,我使用了两个 prompt。第一个让 AI 尝试修复原文可能的识别错误,第二个让 AI 对有疑问的句子不要改动。将两组输出交给 WinMerge 比对,可以快速找到识别不太对劲的地方(如果音频普通话不好的话,差别还是挺多的)。

总结

没什么特别好的方案,都有问题。