作者: AI最严厉的父亲

  • 声音魔法:VITS音频转换框架揭秘

    在一个安静的夜晚,我坐在电脑前,思考着如何将我的声音转化成我的最爱的音乐人的声音。这似乎是一个不可能的任务,但却充满了神秘感。突然,我发现了一个名为Retrieval-based-Voice-Conversion-WebUI的项目,它基于VITS(Voice Inference from Text and Speech)框架,提供了一个轻松易用的声音转换工具。于是,我踏上了声音魔法之旅,今天我将与大家分享这一奇妙的经历。

    声音转换的魅力

    在开始揭秘Retrieval-based-Voice-Conversion-WebUI之前,让我们先来聊聊声音转换的魅力。声音是一种神奇的媒介,可以传达情感、表达个性,甚至改变现实。你是否曾经梦想过能够像你喜爱的歌手一样唱歌?或者是在特定场合中,用某位名人的声音发表演讲?声音转换技术为这些梦想提供了可能性。

    但是,要将声音从一种变成另一种,这绝非易事。声音转换涉及复杂的信号处理、深度学习模型和大量的数据。幸运的是,现在有了一些强大的工具和框架,它们使声音转换变得更加容易和有趣。

    Retrieva-based-Voice-Conversion-WebUI简介

    Retrieval-based-Voice-Conversion-WebUI是一个基于VITS框架的声音转换工具,它可以将一种声音转换为另一种声音,同时保留语音的自然感觉。这个项目的目标是让声音转换变得容易,并且可以在普通电脑上进行,无需高端硬件。

    以下是这个项目的一些关键特点:

    • 通过使用top1检索将源特征替换为训练集特征,减少音调泄漏。
    • 即使在相对较差的显卡上,也可以进行轻松快速的训练。
    • 即使使用少量数据进行训练,也可以获得相对好的结果(建议使用不少于10分钟的低噪音语音)。
    • 支持模型融合以改变音色。
    • 提供易于使用的WebUI界面。
    • 使用UVR5模型快速分离声音和乐器。
    • 使用最强大的高音提取算法InterSpeech2023-RMVPE来防止消音问题,提供了显著更好的结果,速度更快,资源消耗更低。

    现在,让我们一起来探索如何使用Retrieval-based-Voice-Conversion-WebUI进行声音转换。

    准备环境

    首先,确保你的Python版本是3.8或更高。然后,执行以下命令以安装主要依赖项:

    # 安装PyTorch相关核心依赖项,如果已安装,请跳过
    pip install torch torchvision torchaudio

    接下来,可以使用Poetry来安装其他依赖项:

    # 安装Poetry依赖管理工具,如果已安装,请跳过
    curl -sSL https://install.python-poetry.org | python3 -
    
    # 安装项目依赖项
    poetry install

    或者,你也可以使用pip来安装它们:

    # 对于Nvidia显卡
    pip install -r requirements.txt
    
    # 对于Windows上的AMD/Intel显卡(DirectML):
    pip install -r requirements-dml.txt
    
    # 对于Linux / WSL上的Intel ARC显卡,使用Python 3.10:
    pip install -r requirements-ipex.txt
    
    # 对于Linux上的AMD显卡(ROCm):
    pip install -r requirements-amd.txt

    接下来,你需要下载其他预模型文件,可以在项目的Huggingface空间中找到它们。这些文件包括了用于推断和训练的预模型文件。确保将它们放在正确的目录下。

    开始声音转换

    一旦你的环境准备好了,你可以使用以下命令启动WebUI:

    python infer-web.py

    如果你使用的是Windows或macOS,你可以直接下载并解压RVC-beta.7z文件,然后使用go-web.bat(Windows)或sh ./run.sh(macOS)来启动WebUI。

    结束语

    声音转换是一门神奇的艺术,它使我们能够在声音的世界中自由穿越。Retrieval-based-Voice-Conversion-WebUI为我们提供了一个便捷的工具,让我们能够将声音转换成我们想要的样子。无论是在娱乐还是工作中,这个项目都有着巨大的潜力。探索声音的可能性,释放声音的魔法吧!

  • 升级到Stable Diffusion 1.6版本:AI创作者的最佳选择

    很多人说,计算机编程是一门孤独的艺术,就像是一位吉他手在弹奏一曲美妙的音乐,我也深有体会。每当我坐在电脑前,编写代码的时候,就仿佛是在演奏一场独奏音乐会。而这场音乐会的背后,有一个不为人知的“指挥家”——Stable Diffusion(稳定扩散),一个强大的AI模型。今天,我将向大家介绍Stable Diffusion 1.6版本的升级内容,为你呈现一场前所未有的“音乐盛宴”。

    为什么要升级到Stable Diffusion 1.6版本?

    在编程的世界里,每个版本的升级都意味着更多的功能和更好的性能。而Stable Diffusion 1.6版本,可以说是一次革命性的升级。不仅仅是因为它的强大,更因为它的简便和高效。

    新功能一览

    1. 增加了refiner(图像细节提升)

    在以往的版本中,我们使用refiner插件来提升图像的细节,但现在,这个功能已经成为系统的一部分。你只需在文生成图或图生成图时启用,选择第二个模型,程序将在基于主模型生成图之后,基于第二个模型进一步提升图像细节。这意味着更高效的图像处理,无需切换模型,大大提高了工作效率。

    2. 增加了Style editor对话框(风格编辑更便捷)

    以前,我们需要手动输入一堆预设词来定义图像风格,而现在,Stable Diffusion 1.6版本带来了全新的风格编辑器。你可以预先定义正向词和反向词,并为其取个合适的名称,保存之后备用。这样,你只需选择预设词,它们将自动融入图像生成过程中的正向和反向提示词中。这个改动使得编辑风格更加便捷,让你专注于表达你想要的内容。

    3. 模型选项卡嵌入式tab(更好的分类管理)

    模型选项卡现在已经变成了嵌入式tab,不再需要在巨长页面中上下翻动。如果你喜欢分类管理模型,只需勾选右边的“show dirs”,你的分类将重新出现,等待你回来。这一改变让模型管理更加清晰和高效。

    4. LoRA管理功能升级(更方便的触发词和权重设置)

    LoRA(语言风格模型)的管理变得更加直观和便捷。你可以轻松设置触发词和最佳权重,甚至可以看到LoRA的属性一览,包括底模、分辨率、训练时间等。这个功能为多样的语言风格模型提供了更多的自定义和控制。

    5. Mac用户的福音(GPU生成与CPU相同的图片)

    对于Mac用户来说,Stable Diffusion 1.6版本也带来了好消息。现在,你可以选择使用CPU在不同的视频卡供应商之间生成与NVidia视频卡相同的图片。虽然在生成速度上可能有所差距,但这一功能让Mac用户也能享受GPU级别的图像生成体验。

    6. 其他更新的内容

    此外,Stable Diffusion 1.6版本还新增了几个新的采样器,包括Restart、DPM++ 2M SDE Exponential、DPM++ 2M SDE Heun等,以及UI更新,使界面更加美观。同时,图生成图对内存和显存的占用也更小,为你的电脑提供更好的性能体验。还有,多人使用时的排队进度展示,让团队协作更加顺畅。

    如何升级到Stable Diffusion 1.6版本?

    如果你还没有尝试过Stable Diffusion 1.6版本,我强烈建议你赶紧跟上进度。如果你使用整合包,可以直接在版本管理中进行更新。如果是自己安装的版本,可以通过启动器脚本中的git pull命令进行更新,或者访问GitHub下载最新版。

    结语

    Stable Diffusion 1.6版本的升级带来了许多令人激动的功能和改进,让AI创作者们的工作更加高效和便捷。如果你想提升你的创作体验,不妨升级到这个版本,体验一场前所未有的“音乐盛宴”。

  • 如何高效记笔记听播客?最佳解决方案揭秘

    播客已经成为了人们获取信息和娱乐的重要途径之一。然而,有时候我们可能想要更深入地理解和记忆播客内容,而不仅仅是听个乐子。那么问题来了,如果想要记笔记,有没有比较好的解决方案呢?本文将揭示一些高效记笔记听播客的最佳解决方案,满足你的需求。

    开篇故事:听播客成为一种趋势

    在信息时代,播客已经成为了人们获取知识、了解新闻和娱乐的一种主要方式。无论是在通勤途中、健身房里,还是在家中放松时,播客都伴随着我们。然而,有时候仅仅听一遍可能不足以深刻理解和记住播客中的重要内容,特别是当我们希望提取出有用的信息时。

    这就引出了一个重要问题:如何高效记笔记听播客?有没有一种解决方案可以满足我们的需求?接下来,我们将探讨一些可能的方法。

    解锁高效记笔记听播客的最佳解决方案

    解决方案一:本地存储音频和纯文本笔记

    首先,你可能想要将播客音频本地存储,以便随时回顾。同时,你可以创建纯文本笔记,比如Markdown(md)格式,以记录播客的重要内容。这样,你可以方便地在音频和笔记之间进行跳转,确保你不会错过关键信息。

    解决方案二:提取Show Notes和Transcriptions

    一些播客提供了Show Notes,即播客内容的摘要和重要信息列表。你可以利用这些Show Notes来帮助你更好地记笔记。此外,如果播客有提供文本的Transcriptions,那就更好了。你可以将Transcriptions用于文本笔记的基础,以确保你没有遗漏任何内容。

    解决方案三:AI总结Transcriptions

    如果播客提供了Transcriptions,你可以考虑使用人工智能工具来总结这些文本。一些AI工具可以帮助你快速提取关键信息,从而更轻松地创建有用的笔记。这对于那些时间有限的人来说特别有帮助。

    解决方案四:信息文件互联

    为了更好地管理你的笔记、Transcriptions、音频文件以及其他信息,你可以使用工具来建立链接和互联。这意味着你可以轻松地在这些文件之间跳转,找到你需要的信息,提高效率。

    专家意见:如何更好地记笔记听播客

    在探讨了一些解决方案后,我们来听听专家的意见。一位专家建议,对于一些值得深入品味的音视频节目,我们应该认真对待,做好读者的工作,这也是对创作者以及创作内容的一种尊重。这意味着在记笔记的过程中,我们应该花更多的时间和精力来理解和思考内容,而不仅仅是机械地记录。

    推荐工具:满足你需求的记笔记听播客工具

    既然我们知道了记笔记听播客的重要性,也了解了一些解决方案,那么是否有一些具体的工具可以帮助我们实现这些目标呢?以下是一些推荐的工具:

    1. Podwise:这是一个广告过的工具,可以满足大部分需求,包括本地存储音频、提取Show Notes和Transcriptions,以及自定义裁剪音频。

    2. Snipd:Snipd几乎完美适合你的需求,可以自定义裁剪音频,做笔记,还可以联动Obsidian、Notion等笔记软件。最近还加入了AI功能,但需要付费使用。

    3. 字幕工具:如果你想要更详细的Transcriptions,你可以使用字幕工具来自动生成字幕,然后将其用于笔记。

    总结

    播客是一个丰富的信息源,但要想深入理解和记住其中的内容,我们需要一些高效的记笔记方法。本文介绍了一些解决方案,包括本地存储音频、提取Show Notes和Transcriptions、AI总结、信息文件互联等。同时,我们也听取了专家的意见,强调了对播客内容的深入思考。最后,我们推荐了一些工具,帮助你更好地记笔记听播客,满足你的需求。

  • Claude Pro解析:值得一试吗?

    不久前,ChatGPT一直是免费使用的,但现在,一股变革之风正在吹拂着这个平台。Claude Pro,这个名字也许已经引起了你的注意,它标志着ChatGPT进入了付费时代的大门。然而,Claude Pro值得投资吗?在这个变革的过程中,我们将揭示其中的曲折和未来走向。

    开篇故事:ChatGPT与老王的缘分

    2023年的一个寒冷冬日,山东的老王坐在窗边,窗外银装素裹。老王一直以来都是ChatGPT的忠实用户,无论是编程、写作还是聊天,ChatGPT都是他的得力助手。

    然而,这一天,老王打开ChatGPT应用却发现不一样的景象。一个名叫Claude Pro的新计划悄然登场,月费高达140美元。老王愣住了,他开始思考这个新的付费版本是否值得一试。

    混沌初开:Claude Pro的面世

    不久前,ChatGPT一直是纯粹的免费服务,但现在,一场变革正席卷而来。Claude Pro,这个名字已经家喻户晓,它标志着ChatGPT迈入了付费时代。

    Claude Pro登场,以每月20美元的价格引发广泛关注。但Claude Pro和免费版相比,究竟有何不同?是否值得一探究竟?

    解锁优势:Claude Pro的三大特色

    在Claude Pro的旗帜下,我们将揭示三个独特之处,或许这将改变你的看法。

    优势一:对话量的激增

    曾经频频碰壁的对话限制,现在被Claude Pro打破。每八小时可发100条消息,相比之前的限制,这是一次翻倍的增长。

    但请注意,Claude Pro并非放肆之地,当剩余额度低于10条时,你将会受到提醒。

    优势二:2021年9月以后的信息

    时间穿越的能力是Claude Pro的独特之处。它的训练数据延伸至2022年12月,甚至更新到了今年年初。这意味着,你可以更轻松地获取最新的信息,这对于许多领域的专业人士来说是一项重大福音。

    优势三:流量高峰期和新功能的先行体验权

    Claude Pro不仅提供了更多的对话数量,还赋予用户在流量高峰期和新功能上的优先体验权。

    这意味着你可以更顺畅地使用Claude Pro,并且率先体验到最新的功能。这对于那些希望始终保持在前沿的用户来说,无疑是一种福利。

    限制与窍门:Claude Pro的使用技巧

    然而,即使Claude Pro带来了诸多好处,也有一些限制需要考虑。Claude Pro相比ChatGPT Plus在对话数量上有了明显的提升,但它并不是无限的。以下是一些使用技巧,帮助你更有效地利用Claude Pro。

    限制一:短对话的优势

    如果你的对话相对较短,那么Claude Pro的优势将更为显著。根据官方数据,超过2/3的对话在每次200句英文、每句约15-20个单词的长度之内。因此,善于合理安排对话内容,可以让你充分利用Claude Pro的潜力。

    限制二:附件和长对话的挑战

    然而,如果你的对话涉及较多的附件或非常长的内容,Claude Pro的限制就会显现出来。每次发消息,Claude Pro都会重新阅读整个对话,包括附件,这将导致额度迅速消耗。

    为了规避这一限制,建议在开启新对话时上传文件,并避免重复上传文件。

    限制三:智能的开启新对话

    养成每次讨论新话题时开启新对话的习惯。这可以减少Claude Pro重新阅读整个对话的工作量,提高响应速度,同时确保你的额度得以最大程度的保留。

    限制四:一次性提出多个问题

    尤其在询问长文档时,尽量一次性提出多个问题。这有助于避免Claude Pro反复读取对话,从而节省额度。

    限制五:注意地域限制

    需要注意的是,Claude Pro目前仅在美国和英国地区提供,因此对于其他地区的用户来说,定价和可用性可能会受到限制。

    光明前景:用户反应与未来展望

    一周前,Reddit上的用户就Claude Pro的付费计划展开了激烈讨论。大多数人对50美元一个月的价格表示反感,但随着官方的付费计划公布,情况发生了变化。有人

    表示高兴,认为Claude Pro的额外权益值得称赞,而有人认为价格对于娱乐而非工作的用户来说可能太高。

    然而,Claude Pro并非唯一的选择。一款名为Poe的AI产品也备受关注,它提供了类似的功能,并且在某些方面更为吸引人。

    这使得Claude Pro在竞争激烈的市场中需要付出更多的努力来吸引用户。

    总结

    Claude Pro的到来标志着ChatGPT的演进和改变,尽管它带来了许多优势,但也伴随着一些限制。用户需要根据自己的需求和预算权衡是否值得投资。Claude Pro的对话量增加、时间跨度和优先体验权等特色可能吸引了一部分用户,特别是那些需要大量对话和最新信息的专业人士。

    然而,Claude Pro也面临一些竞争和挑战,包括竞品Poe的崛起和价格上的不确定性。

    用户需要仔细考虑自己的使用情境,以及是否愿意为这些额外的特色付费。

    最后,值得一提的是Claude Pro的背后是Anthropic公司,他们在AI领域有着雄心勃勃的计划,但这也需要大量的资金支持。Anthropic已经筹集了数亿美元,但他们还需要更多的投资来继续发展他们的AI产品。用户的支持将直接影响到Claude Pro未来的发展和改进。

    所以,回到最初的问题:你会购买Claude Pro吗?

  • 掌握网站维护的必备技能:网页检测与优化

    曾经有一位名叫小明的朋友,他是一家小公司的网站管理员。他的公司拥有一个精美的网站,但一天,他突然发现访问量急剧下降,生意也跟着受到了影响。他陷入了焦虑中,不知道如何找出问题所在。于是,我决定帮助他,教他一些网页检测与优化的必备技能,让他的网站重新焕发生机。

    查看网页源代码

    首先,我们学习了如何查看网页的源代码。这是网页检测的第一步,因为源代码中包含了网页的结构和内容信息。我们打开了网页,右键点击页面上的任意位置,选择“查看页面源代码”选项。在弹出的窗口中,我们看到了网页的HTML代码。这让我们能够深入了解网页的结构,查找问题并进行优化。

    网站安全检测

    小明的网站遭受了一些安全威胁,因此我们学习了如何进行网站安全检测。我们使用了一些在线工具,如网站漏洞扫描器和安全性检测工具,来查找潜在的安全风险。通过定期进行安全检测,小明可以保护网站和用户的数据安全。

    死链检测

    死链是指指向无效网页的链接,它们会损害用户体验并降低搜索引擎排名。我们使用了死链检测工具,帮助小明找出网站中的死链并进行修复。这有助于确保网站的链接始终可用,提高用户满意度。

    网站GZIP压缩

    为了提高网站的加载速度,我们介绍了GZIP压缩技术。通过启用GZIP压缩,可以减小网页文件的大小,加快网页的加载速度。这对于提高用户体验和SEO排名都非常重要。

    网页状态检测

    我们还学习了如何进行网页状态检测。这包括检查网页的响应代码(如404错误)、加载速度和可用性。通过监测网页状态,小明可以及时发现并解决问题,确保网站的稳定性和可访问性。

    关键词密度分析

    为了提高网站在搜索引擎中的排名,我们介绍了关键词密度分析。这是一项重要的SEO技术,通过分析网页上关键词的出现频率,可以确定哪些关键词在网页中的重要性。我们使用了关键词密度工具,帮助小明优化网站内容,提高关键词的密度,从而在搜索结果中获得更高的排名。

    META信息查询

    最后,我们学习了如何查询网页的META信息。META信息包括标题、描述和关键词等元数据,它们对于搜索引擎排名和用户体验都非常重要。我们使用了META信息查询工具,帮助小明检查和优化他网站的META标签,以吸引更多的用户和提高排名。

    机器人模拟抓取

    除了上述技能,我们还介绍了机器人模拟抓取的概念。这是搜索引擎爬虫模拟访问网页的过程,了解如何优化网站以适应搜索引擎爬虫可以帮助小明的网站更好地被索引。

    结语

    通过学习这些网页检测与优化的必备技能,小明终于找到了网站问题的根源,并采取了相应的措施。他的网站重新获得了稳定的访问量,生意也逐渐回暖。这个故事告诉我们,掌握网站维护的技能对于网站的成功至关重要。如果您也是网站管理员或拥有自己的网站,不妨学习这些技能,让您的网站在竞争激烈的互联网世界中脱颖而出。

  • 挖掘关键词:提升网站排名的绝招

    在今天的数字时代,网站的排名对于吸引更多的流量和用户至关重要。无论您是个人博客的所有者,还是一家企业的营销团队成员,都希望看到自己的网站在搜索引擎中获得更高的排名。这不仅可以增加品牌曝光,还可以提高业务的可见性。在这篇文章中,我将分享一些提升网站排名的绝招,同时介绍一些关键词优化的技巧,帮助您的网站在搜索结果中脱颖而出。

    开篇故事

    让我先分享一个故事,或许您会对此有所共鸣。曾经有一位朋友拥有一家小型电子设备修理店,他经营了多年,但一直未能在网络上获得足够的曝光。有一天,他来找我,抱怨生意不好做,因为几乎没有人能找到他的店铺。我建议他尝试提升网站排名,于是我们开始了一项关键词挖掘的工作。

    关键词挖掘

    1. 跌出关键词

    首先,我们查看了他的网站上之前使用的关键词。有一些关键词曾经帮助他在搜索结果中获得高排名,但最近却跌出了前几页。这些关键词是他需要重新关注和优化的关键。

    2. 涨入关键词

    接下来,我们查找了一些潜在的“涨入关键词”。这些关键词是与他的业务相关,但他以前没有使用过的。我们认为,通过优化网站内容以包含这些新关键词,他有机会提高排名并吸引新的访问者。

    3. 被竞价关键词

    我们还研究了竞争对手在竞价广告中使用的关键词。尽管这不是免费的排名提升方法,但了解竞争对手的策略可以帮助他更好地规划自己的关键词战略。

    4. 百度指数

    为了更好地了解关键词的受欢迎程度,我们使用了百度指数工具。这个工具可以显示每个关键词的搜索量趋势,帮助我们确定哪些关键词具有更大的潜力。

    优化网站内容

    有了这些关键词的信息,我们开始优化他的网站内容。我们遵循了以下步骤:

    1. 更新旧排名关键词

    我们首先更新了网站上已有的关键词。通过在文章中添加这些关键词的新内容,并确保它们自然融入文章中,我们帮助网站重新获得了这些关键词的排名。

    2. 添加新关键词

    然后,我们添加了新的关键词。这需要一些创造力,以确保关键词不仅出现在文章中,还与内容相关。我们编写了新的文章和页面,以满足潜在用户的需求,并同时包含了新的关键词。

    3. 优化页面元数据

    不要忘记优化每个页面的元数据,包括标题和描述。这些元素也对搜索排名产生影响。

    监控排名

    为了追踪我们的进展,我们开始监控网站的排名。我们每周都查看百度搜索结果,记录每个关键词的排名变化。这有助于我们了解哪些策略有效,哪些需要进一步优化。

    结语

    提升网站排名需要时间和努力,但它可以为您的业务带来巨大的回报。通过关键词挖掘、网站内容优化和排名监控,您可以逐步提高您的网站在搜索引擎中的可见性,吸引更多的流量和用户。

    如果您也希望改善您的网站排名,请不要犹豫,开始行动吧!最终,您将看到更多的人访问您的网站,您的业务也将蓬勃发展。

  • 编程的奇妙之旅:Python多线程爬虫下载PDF教材

    有一天,当我坐在电脑前,思考着编程的奇妙之处时,一种冒险的感觉涌上心头。我想,为什么不用编程来探索互联网的深处,下载一些有趣的教材呢?于是,我开始了这次奇妙的编程之旅,带着好奇心和激情,我将向你展示如何使用Python编写一个多线程爬虫,用于下载各种教材的PDF文件。

    准备工作

    在我们踏上这次冒险之前,我们需要做一些准备工作。

    初始化日志

    首先,我们需要设置日志记录,以便随时跟踪我们的编程冒险。

    import logging
    
    def init_logging():
        logging_format = '%(asctime)s\t[%(levelname)s]\t[%(name)s]\t[%(threadName)s]\t%(message)s'
        logging.basicConfig(format=logging_format, level=logging.INFO)

    导入必要的库

    为了让我们的编程冒险变得更加容易,我们需要使用requests库来进行网络请求和数据下载。如果你还没有安装这个库,请使用以下命令来安装它:

    pip install requests

    设置下载目录和线程数量

    这两个变量将在后面的代码中使用,你可以根据需要进行调整。

    download_base_dir = 'd:/book3'  # 设置下载文件保存的文件夹
    thread_count = 8  # 设置线程数量

    开始编写爬虫

    请求数据版本

    首先,我们需要获取教材数据的版本信息,这将有助于我们确定要下载的文件。

    def request_data_version() -> [str]:
        # 目标URL
        data_url = "https://s-file-1.ykt.cbern.com.cn/zxx/ndrs/resources/tch_material/version/data_version.json"
        try:
            logging.info("开始请求URL: %s", data_url)
            response = requests.get(data_url)
            logging.info("状态码 %s, 响应内容: %s", response.status_code, response.text)
            if response.status_code == 200:
                data = response.json()
                return data["urls"].split(",")
            else:
                logging.warning("无法获得正确的响应,程序退出 -1。")
                sys.exit(-1)
        except requests.exceptions.RequestException as e:
            logging.exception("请求数据版本失败", e)

    请求单个数据URL

    接下来,我们将请求每个教材的数据URL,并解析教材信息。

    def request_single_data_url(data_url: str) -> [dict]:
        try:
            logging.info("开始请求URL: %s", data_url)
            response = requests.get(data_url)
            logging.info("状态码 %s", response.status_code)
            if response.status_code == 200:
                data = response.json()
                books = []
                for d in data:
                    book_data = parse_book_data(d)
                    if len(book_data) != 0:
                        books.append(book_data)
                    else:
                        logging.warning("跳过此教材: %s", d['title'])
                return books
        except requests.exceptions.RequestException as e:
            logging.exception("请求单个数据URL失败", e)

    解析教材数据

    我们将解析每本教材的数据,包括教材名称和标签。

    def parse_book_data(data: dict) -> dict:
        book_id = data['id']
        book_name = data['title']
        book_tags = data['tag_list']
        book_tags = sorted(book_tags, key=custom_sort_tag_list, reverse=True)
        if '版' not in (book_tags[0]['tag_name']):
            return {}
        return {"id": book_id, "name": book_name, "dirs": get_dirs_from_tags(book_tags)}

    获取目录信息

    我们将从标签中提取目录信息,以便稍后创建文件夹。

    def get_dirs_from_tags(book_tags) -> str:
        return f"{book_tags[0]['tag_name']}/{book_tags[1]['tag_name']}/{book_tags[2]['tag_name']}"

    自定义标签排序

    为了确保我们获取的是正确的教材版本,我们需要自定义排序标签。

    def custom_sort_tag_list(tag):
        tag_name = tag['tag_name']
        school_level, edition, grade, semester, course_name = '', '', '', '', ''
        if "版" in tag_name:
            edition = tag_name
        elif "年级" in tag_name:
            grade = tag_name
        elif "册" in tag_name:
            semester = tag_name
        elif '小学' in tag_name or '初中' in tag_name or '高中' in tag_name:
            school_level = tag_name
        elif '教材' not in tag_name:
            course_name = tag_name
    
        return edition, school_level, grade, course_name, semester

    下载教材

    最后,我们将下载每本教材的PDF文件。

    def download_book(book):
        file_dir = f"{download_base_dir}/{book['dirs']}"
        file_name = f"{book['name']}.pdf"
        file_full_path = os.path.join(file_dir, file_name)
        logging.info("开始下载教材: %s/%s", file_dir, file_name)
        try:
            if not os.path.exists(file_dir):
                os.makedirs(file_dir)
        except FileExistsError:
            logging.warning("文件夹 %s 已经存在", file_dir)
    
        download_url = f"https://r1-ndr.ykt.cbern.com.cn/edu_product/esp/assets_document/{book['id']}.pkg/pdf.pdf"
        response = requests.get(download_url)
        if response.status_code == 200:
            with open(os.path.join(file_dir, file_name), "wb") as file:
                file.write(response.content)
                logging.info("教材下载成功: %s", file_full_path)
        else:
            logging.warning("教材下载失败,状态码: %s", response.status_code)

    多线程下载

    我们将使用多线程来提高下载速度。

    def multi_thread_download
    
    _books(shared_queue: queue.Queue):
        try:
            while True:
                item = shared_queue.get_nowait()
                download_book(item)
                shared_queue.task_done()
        except queue.Empty:
            logging.warning("队列为空")

    请求所有教材

    最后,我们将请求所有教材的信息并将其添加到共享队列中。

    def request_all_books_to_shared_queue():
        shared_queue = queue.Queue(maxsize=3000)
        urls = request_data_version()
        for url in urls:
            books = request_single_data_url(url)
            for book in books:
                shared_queue.put(book)
        return shared_queue

    执行下载

    现在,我们已准备好执行下载任务。

    if __name__ == '__main__':
        init_logging()
    
        # 下载文件保存的文件夹
        download_base_dir = 'd:/book3'
        # 线程数量
        thread_count = 8
    
        all_books_queue = request_all_books_to_shared_queue()
        with concurrent.futures.ThreadPoolExecutor(max_workers=thread_count) as executor:
            futures = [executor.submit(multi_thread_download_books, all_books_queue) for i in range(thread_count)]
            concurrent.futures.wait(futures)
    
        logging.info("完成下载!!!")

    结束语

    通过这个教程,你已经学会了如何使用Python编写一个多线程爬虫,用于下载各种教材的PDF文件。这个项目不仅展示了编程的实际应用,还提供了深入探索网络资源的机会。希望你能充分利用这些技能,探索更多有趣的项目和挑战!

  • 如何在VLC播放器中解决无法访问Win10电脑的SMB共享问题

    你坐在舒适的沙发上,准备观看你最喜欢的电影,但是却面临一个麻烦的问题:你的VLC播放器无法访问Win10电脑上的SMB共享文件夹。你已经按照教程设置了SMB共享,但似乎一切都不起作用。这个问题令人头痛,但别担心,本教程将为你提供解决方案,让你重新享受流畅的媒体播放体验。

    解决VLC播放器无法访问Win10电脑SMB共享的问题

    在解决这个问题之前,我们需要了解一些基本的背景信息。Win10电脑上的SMB共享文件夹是一个便捷的方式,可以让你在本地网络中共享文件和媒体内容。而VLC播放器是一个流行的多媒体播放器,广泛用于播放各种媒体文件。然而,有时候它们之间的兼容性问题可能会导致无法访问共享文件夹的情况。

    接下来,让我们一起探讨如何解决这个问题。

    步骤一:检查Win10电脑上的SMB设置

    首先,我们需要确保Win10电脑上的SMB设置是正确的。根据你提供的信息,你已经按照SMZDM上的帖子进行了设置,但仍然遇到了问题。这里有一些步骤可以帮助你检查和调整SMB设置:

    1. 开启匿名访问:根据论坛上的建议,尝试开启匿名访问。在一些情况下,关闭匿名访问可能会导致访问问题。

    2. 关闭SMB1:你提到了之前为了让小米电视能够访问,开启了SMB1。尝试关闭SMB1,因为SMB1存在一些安全漏洞,而VLC可能不支持它。

    3. 来宾访问和共享设置:确保在文件夹的属性中,来宾访问已经开启,并且文件夹正确共享。

    4. 检查共享文件夹:确保你在共享文件夹列表中看到的是正确的文件夹,而不是以"$"结尾的默认共享文件夹。

    步骤二:检查VLC播放器设置

    如果你确认Win10电脑上的SMB设置没有问题,接下来我们需要检查VLC播放器的设置。以下是一些可能有用的调整:

    1. 更新VLC播放器:确保你使用的是最新版本的VLC播放器,因为旧版本可能存在兼容性问题。你可以前往VLC官方网站下载最新版本。

    2. 检查SMB URL:在VLC中输入SMB共享的URL时,确保格式正确。它应该类似于smb://your_win10_computer/share_folder。确保没有拼写错误。

    3. 输入用户名和密码:有时VLC可能需要用户名和密码才能访问SMB共享。在输入URL时,尝试在URL中包括用户名和密码,例如smb://username:password@your_win10_computer/share_folder

    步骤三:检查局域网和防火墙设置

    还有一些其他因素可能会影响VLC访问SMB共享。确保你的设备连接到了正确的局域网,并且没有网络问题。此外,检查防火墙设置,确保它们不会阻止VLC与Win10电脑进行通信。

    结语

    无法访问Win10电脑上的SMB共享文件夹可能会令人沮丧,但通过检查和调整SMB设置以及VLC播放器设置,你有望解决这个问题。如果问题仍然存在,可以尝试搜索相关的技术支持论坛或联系VLC播放器的官方支持团队以获取进一步的帮助。

    希望本教程对解决VLC播放器无法访问Win10电脑的SMB共享问题有所帮助。愿你能够重新享受顺畅的媒体播放体验!

  • 探索SmartKnob:开源虚拟刻度旋钮的未来

    想象一下,你坐在办公桌前,试图调整电脑屏幕的亮度。你手中握着一个旋钮,不同寻常的是,它不只是冷冰冰的金属,而是有着柔软质感的材料。当你旋转它时,感觉到一种微妙的阻力,仿佛是在探索一个真实的世界。屏幕的亮度随着旋钮的转动而逐渐改变,仿佛与你亲手操作有关。这不再是普通的旋钮,这是SmartKnob,数字时代的旋钮。

    SmartKnob是什么?

    SmartKnob是一款开源的输入设备,它与众不同之处在于,它具备软件可配置的终点和虚拟刻度。SmartKnob采用了磁性编码器和无刷云台电机,实现了闭环扭矩反馈控制。这意味着用户可以感受到真实的点击和弹性,使得调整变得更加精确和令人愉悦。

    这个项目的灵感源自Jesse Schoch的视频"haptic textures and virtual detents",以及在SimpleFOC社区中的相关讨论。SmartKnob的目标是将这种虚拟刻度的触感带入我们的数字生活中,使用户能够更加自由和精确地进行各种调整。

    项目背后的创作者

    这个激动人心的项目的创造者是Scott Bezek,他是一位热衷于开源硬件和软件的电子爱好者。他将自己的技术和创意投入到SmartKnob中,旨在为用户提供一种全新的、令人愉悦的控制体验。

    SmartKnob的特点

    SmartKnob拥有一系列引人注目的特点,使其成为一个备受期待的项目。

    闭环扭矩反馈

    SmartKnob采用磁性编码器和无刷云台电机,实现了闭环扭矩反馈控制。这一技术使用户可以感受到真实的点击和弹性,使调整更加精确和令人愉悦。无论你是在调整音响音量还是控制车辆的空调温度,SmartKnob都能提供与实体旋钮一样的触感。

    软件可配置

    SmartKnob的终点和虚拟刻度是软件可配置的。这意味着用户可以根据自己的需求动态地调整旋钮的触感,使其适应不同的应用场景。无论是需要快速调整还是进行精确的微调,SmartKnob都能满足你的需求。这种灵活性是传统旋钮无法比拟的。

    开源项目

    SmartKnob是一个开源项目,这意味着任何人都可以查看和修改其设计和代码。这鼓励了创新和社区参与,使项目不断发展和改进。如果你有自己的创意或改进建议,你可以积极参与到SmartKnob的发展中,为用户提供更好的体验。

    SmartKnob View

    SmartKnob View:更直观的控制体验

    SmartKnob项目中的一个令人兴奋的亮点是SmartKnob View,它提供了一种高级的SmartKnob体验。该版本具有一个集成的显示屏,使用户能够更直观地控制各种参数。它正在积极开发中,为用户提供了更多功能和便利性。

    令人振奋的特性

    SmartKnob View具有一系列令人振奋的特性,包括:

    • 240×240圆形LCD,由39.5mm的表玻璃保护。
    • 带有中空轴的BLDC云台电机,用于机械和电气连接LCD。
    • 由ESP32-PICO-V3-02(Lilygo TMicro32 Plus模块)供电。
    • PCB弯曲和SMD电阻用作压力检测的应变计(通过电机提供刚性和动态的角度变化)。

    SmartKnob View的目标是为用户提供更直观的控制体验,让他们能够更轻松地进行各种调整和设置。无论是在音乐制作中需要精确的音量控制,还是在设计工

    程中需要精确的参数调整,SmartKnob View都能胜任。

    结语

    SmartKnob是一个令人兴奋的开源项目,它将虚拟刻度的触感引入了数字世界,为用户提供了更加自由和精确的控制体验。创作者Scott Bezek的激情和创意使这个项目成为可能,而SmartKnob View的推出将进一步提升用户的体验。

    如果你对SmartKnob项目感兴趣,可以在GitHub上查看其代码库。这个项目还在不断发展,你可以通过参与社区来贡献你的想法和技能。

    未来,我们可以期待更多类似的创新项目,将物理世界的触感带入数字领域,为用户提供更出色的交互体验。SmartKnob只是众多可能性中的一个,它为我们打开了一扇通向未来的大门。

  • 如何使用tiktoken计算文本中的标记数

    你是否曾经想知道一个文本字符串包含多少个标记?标记在GPT模型中是很重要的,因为它们决定了文本的长度和模型处理的成本。本教程将向你介绍如何使用OpenAI的开源工具tiktoken来轻松计算文本中的标记数。

    引子

    在开始之前,让我们来谈谈为什么需要计算标记数。标记是文本的最小单位,可以是一个字符,也可以是一个单词。GPT模型处理文本时以标记为基本单位,因此知道一个文本字符串包含多少标记对于以下两个方面非常重要:

    1. 文本长度限制:有时,你可能需要将文本输入到一个模型中,但模型对文本长度有限制。如果你的文本超过了模型的最大标记数限制,你需要截断或缩短它,以确保模型可以正确处理。

    2. 计算成本:使用OpenAI的API调用GPT模型是需要付费的,而费用是按照标记数计算的。因此,了解文本中有多少标记可以帮助你估算API调用的成本。

    使用不同的编码

    在使用tiktoken之前,你需要了解文本是如何被转换成标记的。不同的模型使用不同的编码方式。tiktoken支持三种OpenAI模型使用的编码:

    • cl100k_base:用于gpt-4、gpt-3.5-turbo、text-embedding-ada-002等模型。
    • p50k_base:用于Codex模型、text-davinci-002、text-davinci-003等模型。
    • r50k_base(或称为gpt2):用于GPT-3模型,如davinci。

    你可以使用以下方式获取特定模型的编码:

    import tiktoken
    
    # 获取gpt-3.5-turbo模型的编码
    encoding = tiktoken.encoding_for_model('gpt-3.5-turbo')

    请注意,p50k_baser50k_base在非代码应用中有很大的重叠,在这种情况下,它们通常会产生相同的标记。

    使用tiktoken计算标记数

    现在,让我们看看如何使用tiktoken计算文本中的标记数。首先,你需要安装tiktoken库:

    pip install --upgrade tiktoken

    安装完成后,你可以按照以下方式计算标记数:

    import tiktoken
    
    def num_tokens_from_string(string: str, encoding_name: str) -> int:
        """返回文本字符串中的标记数。"""
        encoding = tiktoken.get_encoding(encoding_name)
        num_tokens = len(encoding.encode(string))
        return num_tokens
    
    # 示例:计算标记数
    text = "tiktoken is great!"
    encoding_name = "cl100k_base"
    num_tokens = num_tokens_from_string(text, encoding_name)
    print(f"文本中的标记数:{num_tokens}")

    上述代码将输出文本中的标记数。在这个示例中,文本 "tiktoken is great!" 有6个标记。

    将标记转换为文本

    如果你想将标记转换回文本,你可以使用以下方法:

    import tiktoken
    
    def tokens_to_text(tokens, encoding_name: str) -> str:
        """将标记列表转换为文本字符串。"""
        encoding = tiktoken.get_encoding(encoding_name)
        text = encoding.decode(tokens)
        return text
    
    # 示例:将标记转换为文本
    tokens = [83, 1609, 5963, 374, 2294, 0]
    encoding_name = "cl100k_base"
    text = tokens_to_text(tokens, encoding_name)
    print(f"标记转换为文本:{text}")

    在上面的示例中,标记列表 [83, 1609, 5963, 374, 2294, 0] 被转换回了文本 "tiktoken is great!"。

    比较不同的编码

    不同的编码方式可能在如何分割单词、处理空格以及处理非英文字符方面有所不同。使用上述方法,我们可以比较不同编码在几个示例文本上的表现:

    import tiktoken
    
    def compare_encodings(example_string: str) -> None:
        """比较三种字符串编码的表现。"""
        # 打印示例字符串
        print(f'\n示例字符串: "{example_string}"')
        # 对于每种编码,打印标记数、标记整数和标记字节
        for encoding_name in ["r50k_base", "p50k_base", "cl100k_base"]:
            encoding = tiktoken.get_encoding(encoding_name)
            token_integers = encoding.encode(example_string)
            num_tokens = len(token_integers)
            token_bytes = [encoding.decode_single_token_bytes(token) for token in token_integers]
            print()
            print(f"{encoding_name}: {num_tokens} 个标记")
            print(f"标记整数: {token_integers}")
            print(f"标记字节: {token_bytes}")
    
    # 示例:比较编码
    compare_encodings("antidisestablishmentarianism")
    compare_encodings("2 + 2 = 4")
    compare_encodings("お誕生日おめでとう")

    通过上述代码,你可以比较不同编码在示例文本上的表现。这将有助于你选择最适合你的应用程序的编码方式。

    在聊天完成API调用中计算标记数

    对于ChatGPT模型,如gpt-3.5-turbo和gpt-4,它们使用的标记方式与旧的完成模型相同,但由于它们的消息格式,更难计算会话中将使用多少标记。

    以下是一个用于计算传递给gpt-3.5-turbo或gpt-

    4的消息中标记数的示例Python代码:

    import tiktoken
    
    def num_tokens_in_chat(messages: list, encoding_name: str) -> int:
        """计算聊天消息中的标记数。"""
        encoding = tiktoken.get_encoding(encoding_name)
        total_tokens = 0
        for message in messages:
            role = message["role"]
            content = message["content"]
            if role == "system":
                # 系统消息不包含标记
                continue
            elif role == "user" or role == "assistant":
                # 用户和助手消息包含标记
                tokens = encoding.encode(content)
                total_tokens += len(tokens)
        return total_tokens
    
    # 示例:计算聊天消息中的标记数
    chat_messages = [
        {"role": "user", "content": "tell me a joke"},
        {"role": "assistant", "content": "why did the chicken cross the road"},
        {"role": "user", "content": "I don't know, why did the chicken cross the road"},
    ]
    encoding_name = "cl100k_base"
    num_tokens = num_tokens_in_chat(chat_messages, encoding_name)
    print(f"聊天消息中的标记数:{num_tokens}")

    在上面的示例中,我们计算了一个包含用户和助手消息的聊天中的标记数。你可以根据自己的聊天数据和所选的编码来计算标记数。

    这就是如何使用tiktoken计算文本中的标记数,无论是用于一般文本处理还是用于聊天API调用,这个工具都可以帮助你更好地管理标记。希望这个教程对你有所帮助!如果你有任何问题或需要进一步的协助,请随时提问。