此项目是基于huggingface网站上zomehwh所提供的vits项目vits-uma-genshin-honkai,二次开发而来。基于zomehwh的要求,请勿将模型用于任何商业项目,否则后果自负。
此项目可以完成新闻资讯的抓取,管理和音频转换,目前集成了虎嗅首页和观察者网国际新闻两个资讯来源,支持本地txt文件转换,提供了横向扩展资讯来源的插件模块,如果有扩展资讯来源的需求,可以根据二开文档,设计自己的抓取插件。文章数据采用json和txt文件存储,在启动项目之前,请先前往vits-uma-genshin-honkai项目的model目录下,下载config.json和G_953000.pth文件,放入本项目的model(如果没有,就创建一个)目录下。
上个月,我偶然发现了vits-umagenshin-honkai这个项目,发现它对游戏角色的音色模仿比较出色,尤其是在没有情绪起伏的朗读状态下,接近原角色的朗读效果,于是我就萌生了利用vits的AI模型为自己朗读资讯的想法。
经过大半个月的体验,我得出一个结论:只要能够获取优质的中文文本资料,那么坐在办公室里,就可以听遍天下奇闻轶事!
与基于视觉信号进行的文字阅读相比,音频有如下优势:
- 低精力消耗
- 不会阻塞当前行为
低精力消耗:我不清楚别人阅读文本的流程是怎样的,但是我是按照查看文章-提取文字-心里默念-分析想象这种顺序进行文本阅读的,而音频可以帮助我直接跳过前三个步骤,直接进行分析与想象,这使我可以听完数篇文章之后,也不会疲劳。当然,如果需要深入分析,还是需要回去结合文章进行精读的,但是只是了解资讯,音频就足以应付大部分情况了。
不会阻塞当前行为:当进行文字阅读时,我无法进行其他行为,但是听取音频时不会,这意味着,除了睡觉以外的绝大部分时间,都可以利用音频来获取资讯,这极大的扩展了获取信息的时间。
想象一下如下场景:
- 每天上下班的时候看近期的新闻事件
- 发现了一篇好文章,看了一遍觉得还理解的不充分
- 有些有用,但是自己不一定看得进去的文章或是书籍,比如《毛选》、《置身事内》
- 其他高耗时,但低精力消耗的场景,比如要做几个小时的火车,可能会看资讯或小说打发时间
这些场景下都可以将文本转换为音频,给自己提供一种更加轻松的资讯获取方式或是娱乐方式
vits支持CPU推理和GPU推理,默认采用CPU,如果有高性能的GPU,推荐使用GPU推理,可将config.yaml中device_type的值,由cpu改为cuda。
设备 | 1042个字符转换时间-未开启齿音弱化(秒) |
---|---|
i9-13900HX | 68 |
RTX 4080 Laptop | 5 |
需要安装git、python、ffmepg,如果需要使用GPU推理,还需要配置机器学习环境,安装CUDA和PyTorch,需要注意python和CUDA以及PyTorch的版本之间的对应关系。其他的话,还有不少依赖库,但是忘了是哪些,根据运行时的错误提示安装吧。
由于时间有限,没有设计演讲人的界面配置功能,如果有调整演讲人朗读属性的需求,可以在vits这个tab下,尝试需要的朗读参数,点击submit后,会将设置属性打印到窗口中,将这些属性保存到./config/voice.json文件中,就可以调整演讲人的朗读属性了。
因为此前对于python这门语言的了解,仅限于一些最基础的语法,所以在开发图形界面、设计插件系统、添加资讯内容管理方面遇到了不少需要进行技术可行性验证的问题,在这些问题上,ChatGPT给我提供了巨大的帮助,以前可能会在某个技术的实现方式上,由于没有找对相关文档,导致数个小时都没有进展的情况,大幅减少了,从而可以让我将主要的精力集中在产品功能的业务逻辑的实现上。
当然,目前对于ChatGPT的探索依然十分初级,如何让ChatGPT能够像同事一样更加深入的融合到,产品功能的业务逻辑的开发过程中来,还需要研究。
以下是ChatGPT帮助我解决的问题:
- 找到gradio中,更新控件状态的方法
- 设计一套极简的插件系统,作为参考
- 实现将vits源码中,转换数据绕过浏览器,直接保存为wav音频的方法
- 设计一个基础的json文件管理工具
- 设计一个基础的yaml文件管理工具
- 实现快速比较两个python对象的属性是否完全一致的方法
- 实现日期变量的格式转换与比较
- 如何更好的实现python对象的属性的默认值设置
- 如何根据字符串变量动态获取python对象的属性与函数
- 如何将wav音频转换为mp3
- 如何合并音频
- 如何消除音频中的齿音
- java中,常用功能在python中的对应方法
- 如何匹配文本中的所有英文单词
- 解决python中的模块引用问题
为了使这个程序具备更好的扩展性,我设计了三类插件:文章抓取插件(articleFetch)、音频转换前,文章内容处理插件(dealWithBeforeConvertAudio)、转换后,音频处理插件(dealWithAfterConvertAudio)。我在项目plugin_demo目录下,提供了三类插件的demo,如有需要可以将它们复制到extensions目录下,重启项目,可以查看插件使用效果。
注意:在开发爬虫时需要遵守网站的 Robots 协议以及相关规定和道德标准,合理控制爬取频率,避免对网站造成负面影响。
设计此插件的目的是,可以通过添加插件的方式,扩展更多的资讯来源
接口函数 | 函数说明 | 输入参数 | 示例 | 返回参数 | 示例 |
---|---|---|---|---|---|
description | 提供插件的说明 | 无 | 无 | 字符串 | "获取XXX的资讯" |
open_param | 是否启用自定义参数 | 无 | 无 | bool值 | False |
plugin_param_list | 自定义参数列表 | 无 | 无 | PluginParam数组,见PluginParam说明 | [] |
fetch_article_list | 抓取文章id列表 | 无 | 无 | 包含文章id的数组 | [{"id": 11}] |
fetch_article | 抓取文章内容 | article_id article article_list param_values |
11 {"id": 11} [{"id": 11}] [{"key":"test","value":11}] |
一个包含文章属性的字典 | { 'article_id': 11, 'title': title, 'author': '未知', 'publish_date': '2023年05月02日, 'content': '内容', 'link': ‘’, 'extra': ''} |
设计此插件的目的是,由于本项目只支持中文朗读(实际上也支持日语,但我没处理),所以对于英文单词需要一些特殊处理,这种处理方式不唯一,所以以插件形式开放
接口函数 | 函数说明 | 输入参数 | 示例 | 返回参数 | 示例 |
---|---|---|---|---|---|
description | 提供插件的说明 | 无 | 无 | 字符串 | "使用对照表替换英文" |
open_param | 是否启用自定义参数 | 无 | 无 | bool值 | False |
plugin_param_list | 自定义参数列表 | 无 | 无 | PluginParam数组,见PluginParam说明 | [] |
deal_with_article_content | 处理文章内容 | content Article_1 param_values |
'文章内容' Article_1对象 [{"key":"test","value":11}] |
字符串 | '处理后的内容' |
设计此插件的目的是,提供音频转换完成之后,可以进行其他处理,比如将转换的音频合并成一个
接口函数 | 函数说明 | 输入参数 | 示例 | 返回参数 | 示例 |
---|---|---|---|---|---|
description | 提供插件的说明 | 无 | 无 | 字符串 | "合并音频" |
open_param | 是否启用自定义参数 | 无 | 无 | bool值 | False |
plugin_param_list | 自定义参数列表 | 无 | 无 | PluginParam数组,见PluginParam说明 | [] |
deal_with_audio | 处理音频 | wav_path_list ArticleVoice_list param_values default_output_path default_audio_format |
['E:\1.wav'] ArticleVoice数组 [{"key":"test","value":11}] 'E:\output' 'mp3' |
无 | 无 |
设计自定义参数的目的,是为了让插件的设计具备更多的灵活性,目前支持两类自定义参数:数字输入(Number)和下拉选择(Dropdown)
参数名称 | 参数说明 | 参数示例 |
---|---|---|
param_type | 参数类型,固定Number | Number |
param_key | 参数key | test_param_1 |
label | 参数说明 | 这是测试参数数字1 |
value | 默认数值 | 101 |
参数名称 | 参数说明 | 参数示例 |
---|---|---|
param_type | 参数类型,固定Dropdown | Dropdown |
param_key | 参数key | test_param_2 |
label | 参数说明 | 这是测试参数下拉2 |
default_value | 默认选中 | 哈哈 |
multiselect | 是否复选 | True |
choices | 可选项 | ['呵呵', '哈哈', '花花'] |