使用新版本的 jekyll,加快编译速度

我的 blog 一直使用 jekyll 3.8.6 来 build blog,这么多年下来攒了上千篇文章,编译速度一直令人发指,最近更是达到了惊人的 2000s。

最近在网上闲逛了 jekyll 编译速度的这个问题,似乎已经解决了,使用了最新的版本编译,速度缩短到了 20s,令我震惊。

image-20230620午後10458304

docker-compose.yml 注意修改的内容为 command 的内容即可:

bundle exec jekyll serve

image-20230620午後10803051


虚拟机 Parallels 安装备忘

本篇文章里我先卸载了老版本 Parallels,再安装特定版本 Parallels。参考 alsyundawy/Parallels

  1. 卸载老版本。

    删除 app 应用后,删除相关配置文件:

    rm -rf ~/Library/Parallels
    rm -rf /Library/Preferences/Parallels
    

    Screenshot 2

    Screenshot

  2. 下载

    https://download.parallels.com/desktop/v18/18.1.1-53328/ParallelsDesktop-18.1.1-53328.dmg
    

    我做了一个备份,不过 1M 小水管的速度会很慢。

  3. 安装

    要求升级,直接关闭窗口即可,会询问是否直接安装

    Screenshot 3

    直接关闭 x,然后选择使用当前版本安装。

    Screenshot 1

  4. 一些其他配置

    退出账号并关闭 Parallels Desktop。参考文末的参考资料下载。我也做了个备份

    pkill -9 prl_disp_service
    
    sudo cp -f prl_disp_service "/Applications/Parallels Desktop.app/Contents/MacOS/Parallels Service.app/Contents/MacOS/prl_disp_service"
    sudo chown root:wheel "/Applications/Parallels Desktop.app/Contents/MacOS/Parallels Service.app/Contents/MacOS/prl_disp_service"
    sudo chmod 755 "/Applications/Parallels Desktop.app/Contents/MacOS/Parallels Service.app/Contents/MacOS/prl_disp_service"
    
    sudo cp -f licenses.json "/Library/Preferences/Parallels/licenses.json"
    sudo chown root:wheel "/Library/Preferences/Parallels/licenses.json"
    sudo chmod 444 "/Library/Preferences/Parallels/licenses.json"
    sudo chflags uchg "/Library/Preferences/Parallels/licenses.json"
    sudo chflags schg "/Library/Preferences/Parallels/licenses.json"
    
    sudo codesign -f -s - --timestamp=none --all-architectures --entitlements ParallelsService.entitlements "/Applications/Parallels Desktop.app/Contents/MacOS/Parallels Service.app/Contents/MacOS/prl_disp_service"
    
  5. 修改host

  6. 问题:

    1. 无法联网

      重新安装 Parallels Tools。

      image-20230616午後35749215

      Screenshot 6

      重启系统,就好了。

    2. 修改系统 host 的命令备忘。

      # 加锁
      sudo chflags schg /etc/hosts
      sudo chflags uchg /etc/hosts
             
      # 解锁
      sudo chflags nouchg /etc/hosts
      sudo chflags noschg /etc/hosts
      

参考资料


ipad 下的终端工具 iSH

iOS 上我一直在用 prompt 作为 ssh 登录的工具。但直到我最近使用 Neovim 时候,才意识到它的问题——页面会定时的出现一个 q 字符。非常影响使用体验。

上网搜索了一番,发现了这个不错的命令行工具:https://github.com/ish-app/ish 官网:https://ish.app

根据官方的介绍,iSH是一个x86模拟器,在iOS设备上本地运行Linux shell环境。

image-20230614午後43018693

这篇文章简单记录它安装 ssh 工具的经过,作为一个终端,竟然没有自带 ssh 工具,这是我始料未及的。

  1. 下载。

    https://apps.apple.com/us/app/ish-shell/id1436902243

  2. 先查一下操作系统信息:

    cat /etc/issue
    cat /etc/os-release
    

    IMG_5D6D89A97ABC-1

    可以看到运行的是 alpine 系统,alpine 是一个非常精简的 linux 系统。

  3. 在 alpine 上安装 openssh

    alpine 的源管理工具是 apk,可以使用 apk 进行软件安装:

    apk update
    apk search openssh
    apk add openssh
    

    IMG_2B0E88FFB193-1

  4. 完成。

    非常完美。

    IMG_6534

  5. 字体安装

    可以参考这篇文章操作:neovim 安装使用备忘


neovim 安装使用备忘

记录配置 neovim 的过程。我已经是 vim 老鸟了,所以 vim 的相关内容就略去了。

零、neovim 介绍

Neovim 是 Vim 的一个分支,它的目标是改进 Vim 的代码库,使得 API 更容易实现,并改善用户体验和插件实现。Neovim 与 Vim 的主要区别有以下几点:

  • Neovim 支持使用 Lua 语言进行扩展和配置,这使得 Neovim 的性能更高,配置更简洁,插件更丰富。
  • Neovim 支持内置终端,可以在编辑器中运行 shell 命令或其他程序,而不需要切换到外部终端。
  • Neovim 支持异步任务,可以在后台执行一些耗时的操作,比如代码检查、格式化、补全等,而不会阻塞编辑器的响应。
  • Neovim 支持多进程架构,可以与其他程序进行通信和协作,比如使用 LSP(语言服务器协议)和 DAP(调试适配协议)来增强编程功能。
  • Neovim 支持新的用户界面协议,可以让第三方开发者创建不同风格的 GUI(图形用户界面)或 TUI(终端用户界面)。

一般来说,Neovim 的配置文件是保存在 ~/.config/nvim/init.vim 或者 ~/.config/nvim/init.lua 中。

一、安装 neovim

apt install neovim

查看版本

nvim --version

image-20230608午前92200356

版本太老了,卸载掉。

sudo apt remove neovim
sudo apt remove neovim-runtime

更新为最新版本。 目前最新版本是0.9。下载安装包

wget https://github.com/neovim/neovim/releases/download/stable/nvim-linux64.tar.gz
tar zxvf nvim-linux64.tar.gz
./nvim-linux64/bin/nvim

image-20230608午前95003642

以下是默认配置。

image-20230608午前95041438

我把安装位置调整一下,再做个软链到系统路径:

mv nvim-linux64 /var/local
ln -s /var/local/nvim-linux64/bin/nvim /usr/local/bin/nvim

image-20230608午前95838484

二、安装 NvChad

NvChad screenshot

NvChad 是一个基于 Neovim 的配置,它使用lua语言编写,旨在提供一个具有非常漂亮的UI和极快的启动时间(大约0.02秒~0.07秒)的基础配置。如官网的上图所示。

我们可以根据自己的喜好修改默认的设置,也可以删除一些自己不喜欢的配置,可以在自定义配置(lua/custom目录)中调整整个默认配置,并且这个目录是 git 忽略的,所以我们可以保持与NvChad最新的配置(main分支)同步。

2.1 Nerd Font 字体(可先跳过)

注:这一部分可以先跳过,待后续完全安装好了再处理

安装好之后如果没装字体,都会有一个疑问,为什么文件名的前面都有一个“?方框”?就是没装字体啦。

Nerd Font 字体:https://github.com/ryanoasis/nerd-fonts/releases/latest

Nerd Fonts 是一个针对开发人员的字体修补项目,其中包含高数量的字形。该项目补丁包括 Hack、Source Code Pro 等 50 多种修补字体,以及包括 Fira Code、JetBrains Mono 和 Meslo 等三种 Nerd Fonts 的 Termius 自定义字体。

字体安装只与你本地设备有关,我们是在哪个平台的设备展示内容(使用终端),就在那个平台下安装字体。

2.1.1 linux下
wget https://github.com/ryanoasis/nerd-fonts/releases/download/v3.0.2/SourceCodePro.zip
unzip SourceCodePro.zip -d /usr/share/fonts/SourceCodePro

确认字体放好了:

image-20230608午前111528812

2.1.2 Mac 下

搜索”font“:

image-20230608午後51537344

把下好的字体文件拖进去:

image-20230608午後51506925

再在 item2 里配置使用这个字体:

image-20230608午後51630594

就大功告成了:

image-20230608午後52024117

image-20230608午後52050234

2.1.3 iOS 下

参考了 reddit 的这个回答:https://www.reddit.com/r/ish/comments/nuzvir/how_to_install_nerd_fonts/

  1. 下载 Fontcase

    IMG_6539

  2. 下载字体

    https://github.com/ryanoasis/nerd-fonts/releases/download/v3.0.2/SourceCodePro.zip
    

    扔到一个路径下。

  3. Fonts import & install

    IMG_6528

  4. install 后下载字体

    IMG_6529

  5. 需要在系统里安装,在路径 General > VPN & Device Management 里安装:

    IMG_6530

  6. 在具体的 app 里就可以使用导入的字体了。例如我在 iSH 里可以设置这个字体了:

    IMG_6531

2.2 ripgrep

ripgrep 是一个基于行的搜索工具,它可以递归地在当前目录中搜索与正则表达式模式匹配的内容。后续使用 telescope 插件时需要它。

默认情况下,ripgrep会尊重 gitignore 规则并自动跳过隐藏文件/目录和二进制文件。它支持Windows、macOS和Linux,并提供二进制下载。该工具类似于其他流行的搜索工具,例如 The Silver Searcher、ack 和 grep。它可以替代许多其他搜索工具,因为它包含了它们的大部分功能并且通常更快。

它的使用方法可以参考 https://github.com/BurntSushi/ripgrep/blob/master/GUIDE.md#basics

我在 Debian 下下载deb 包安装:

curl -LO https://github.com/BurntSushi/ripgrep/releases/download/13.0.0/ripgrep_13.0.0_amd64.deb
sudo dpkg -i ripgrep_13.0.0_amd64.deb

2.3 sharkdp/fd

fd是一个用于在文件系统中查找条目的程序,是find的一个简单,快速和用户友好的替代品。使用 telescope 需要它。

我在 Debian 下下载deb 包安装:

curl -LO https://github.com/sharkdp/fd/releases/download/v8.7.0/fd_8.7.0_amd64.deb
sudo dpkg -i fd_8.7.0_amd64.deb

2.4 安装NvChad

我不想用默认的neovim配置,直接把配置文件做个备份,安装 NvChad

cd ~/.config
mv nvim nvim_bak
git clone https://github.com/NvChad/NvChad ~/.config/nvim --depth 1 && nvim

2.5 检查插件依赖

在终端输入 nvim 打开 neovim 。直接键盘输入 :checkhealth ,然后按下回车执行来检查依赖是否齐全:

image-20230608午前101933265

Ps: 这个自动提示真的太好用辣

image-20230608午前102024652

发现问题还是挺多的。

image-20230608午前102422773

按照提示修复相关的问题。

三、Neovim 目录结构

image-20230608午前114025825

四、NvChad 快捷键/键盘映射

https://nvchad.com/docs/config/mappings

  • 默认映射在core.mappings中定义。

    vi /root/.config/nvim/lua/core/mappings.lua
    
  • 在 nvim 中可以使用NvCheatsheetTelescope keymaps来列出所有映射。

image-20230609午後41810233

不知道是什么原因,无论我怎么修改,快捷键就是没办法生效。

我查看了 tmux.conf vimrc bashrc zshrc 等相关的文件,目前还没法解决。

只能使用 Neovim 默认的组合快捷键 Ctrl+w 了,再加上其他按键。先这么用着虽然不太方便,以后再研究:

  • +hijk 就是左上下右的窗口激活
  • +w 返回上个窗口
  • +n/s 就是桌面横向分割
  • +v 就是桌面纵向分割
  • +o 就是关闭所有其他窗口
  • +r 左右窗口调换

image-20230609午後71841205

除此之外,还有(我不确定这些是谁的快捷键,但是在 neovim 中可以使用)

  • Ctrl+O/T,在当前窗口向后开在 buff 里的历史文件。
  • Ctrl+I,在当前窗口向前在 buff 里的历史文件。
  • Shift+”,

五、常用 command 命令

在 command 模式下的命令

  • help 帮助
  • NvimTreeToggle,打开/关闭文件树
  • checkHealth
  • Lazy 查看 Lazy 管理的插件和插件加载情况
  • Telescope find_files 查询文件名 Telescope live_grep 查询内容
  • nvdash Neovim 的首页,可以进行更换主题,打开文件等操作

六、管理插件

lazy 插件管理

NvChad 使用 lazy.nvim 进行插件管理. 当一个插件被加载的时候, 它所依赖的插件也会自动加载。

在 nvim 界面内的 command 模式下输入 Lazy 即可进入管理界面,展示插件的加载状态, 安装和更新插件, 分析插件加载耗时等.

image-20230608午後10658703

Telescope 模糊搜索

telescope.nvim 由 Lua 实现, 支持扩展, 功能十分强大. 它几乎支持一切可以列在列表中的东西, 例如:

  • 文件内容模糊搜索
  • Tag 符号搜索
  • LSP 定义/引用搜索
  • 诊断信息预览
  • Treesitter 符号搜索
  • Git 提交记录搜索
  • Git 文件变动预览

可以检查是否安装好:

image-20230609午後61319808

后来我补完了 fd 的安装。

另外由于我的快捷键实在没调试成功,暂时先用命令进入:

:Telescope find_files

界面如下,搜索的速度跟飞一样

根据官方 github ,一共有几个命令:

" Find files using Telescope command-line sugar.
nnoremap <leader>ff <cmd>Telescope find_files<cr>
nnoremap <leader>fg <cmd>Telescope live_grep<cr>
nnoremap <leader>fb <cmd>Telescope buffers<cr>
nnoremap <leader>fh <cmd>Telescope help_tags<cr>

同时 Telescope 还管理了其他几个插件 :

  • plenary.nvim:
    • plenary.nvim 是一个通用的 Neovim Lua 工具库,提供了一系列功能和实用函数,帮助简化插件的开发过程。
    • 它包含了许多常用的功能,如异步任务管理、时间处理、表格操作、文件系统操作等。插件开发者可以使用这些功能来构建更高级和复杂的插件。
    • plenary.nvim 是许多 Neovim 插件的依赖库,包括 telescope.nvim。
  • extensions:
    • extensions 是 telescope.nvim 的插件扩展机制,用于为 telescope.nvim 添加额外的功能和集成。
    • extensions 可以为 telescope.nvim 提供与其他插件和工具的集成,扩展其搜索范围和功能。例如,有一些专门的 extensions 用于与 Git、LSP、文件预览等集成。
    • extensions 使用 plenary.nvim 提供的工具和功能,以实现与 telescope.nvim 的无缝集成。

NvimTreeToggle 文件树

用于在 Neovim 中切换显示和隐藏文件浏览器(File Explorer)窗口。与另外两个插件一起配合完成工作。

  1. nvim-tree.lua:
    • nvim-tree.lua 是一个用 Lua 语言编写的文件浏览器插件,它能够在 Neovim 中显示和管理文件和目录结构。
    • 该插件提供了丰富的功能,如文件和目录的打开、创建、删除、复制、重命名等操作,同时支持图标化的文件显示。
  2. nvim-web-devicons:
    • nvim-web-devicons 是一个 Neovim 插件和工具库,用于为文件和目录添加图标显示。
    • 该工具库提供了一系列图标,用于根据文件类型、扩展名等信息在文件浏览器中显示相应的图标。

nvim-treesitter 语法高亮、代码导航

nvim-treesitter 提供强大的语法解析和代码分析功能,使你能够更高效地编写和理解代码。它使用 Tree-sitter 引擎,这是一种高效且可扩展的语法解析器,能够对各种编程语言进行快速而准确的语法分析。

nvim-treesitter 的功能包括:

  1. 语法高亮:通过基于语法树的准确分析,提供更准确和更丰富的语法高亮显示。
  2. 自动缩进:根据语法树的结构,自动调整代码的缩进,使代码更加清晰和可读。
  3. 智能缩写:根据语法树的理解,智能地扩展和补全代码的缩写。
  4. 智能选择和操作:根据语法树的知识,提供更智能的选择和操作功能,如选择函数、类、条件语句等。
  5. 代码导航:根据语法树的结构,提供跳转到定义、查找引用、代码浏览等功能,以方便代码导航和理解。
  6. 代码重构:基于语法树的信息,提供代码重构功能,如重命名变量、提取函数等。
  7. 错误和警告提示:根据语法树的分析,提供更准确的错误和警告提示,帮助你发现和修复代码中的问题。

我在 check的时候报了两个warning:

image-20230608午後30757726

nvim-cmp 框架

nvim-cmp 是一个用于 Neovim 的代码补全框架,旨在提供灵活、高度可配置和可扩展的代码补全功能。它的设计理念是为了满足不同用户的需求,并与其他插件和补全源进行集成。

下面是 nvim-cmp 框架的一些关键特点和功能:

  1. 多源支持:nvim-cmp 支持多种不同的补全源(completion source),如缓冲区补全、LSP 补全、路径补全等。这些源可以根据用户的配置和需求进行选择和定制。
  2. 强大的配置选项:nvim-cmp 提供了丰富的配置选项,可以通过 Lua 代码进行定制。用户可以根据自己的偏好和需求来配置补全的行为、外观和交互方式,从而实现个性化的补全体验。
  3. 异步处理:nvim-cmp 使用异步处理的方式来提高补全的响应速度和效率。它可以在后台进行补全源的数据获取和处理,避免阻塞用户的编辑操作。
  4. 插件集成:nvim-cmp 可以与其他插件进行集成,如语法检查插件、代码片段插件等。这使得补全可以更好地与其他功能和工具结合使用,提供更全面和强大的开发环境。
  5. 基于事件的触发器:nvim-cmp 提供了灵活的触发器机制,可以根据用户定义的规则和条件来触发补全功能。这使得补全可以在用户希望的时候自动触发,提供更无缝的开发体验。
  6. 智能排序和过滤:nvim-cmp 提供了智能的排序和过滤机制,可以根据上下文和用户输入来对补全候选项进行排序和过滤,确保最相关和最有用的选项优先显示。

在 NvChad 中它集成了下面这些插件:

  1. luaSnip:

    • 插件功能:luaSnip 是一个用于 Neovim 的代码片段插件,它允许你定义和使用代码片段,提高代码编写的效率。此外,使用luaSnip还可以帮助避免手写代码时出错的可能性。

    friendly-snippets:

    • 插件功能:friendly-snippets 是一个包含了大量常见编程语言的友好代码片段集合。它与 luaSnip 插件兼容,可以作为 luaSnip 的片段库使用,提供丰富的代码片段供选择。
  2. cmp-buffer:

    • 插件功能:cmp-buffer 是 nvim-cmp 的一个源插件,用于提供缓冲区(buffer)的补全候选项。它可以在当前打开的缓冲区中进行补全,提供相应的候选项供选择。
  3. cmp-nvim-lsp:

    • 插件功能:cmp-nvim-lsp 是 nvim-cmp 的一个源插件,用于与 Neovim 的内置 LSP 客户端进行集成。它可以获取 LSP 提供的补全信息,包括函数、变量、类型等,提供相关的补全候选项。
  4. cmp-nvim-lua:

    • 插件功能:cmp-nvim-lua 是 nvim-cmp 的一个源插件,用于提供 Lua 语言的补全支持。它可以识别 Lua 代码中的函数、变量等信息,并提供相关的补全选项。
  5. cmp-path:

    • 插件功能:cmp-path 是 nvim-cmp 的一个源插件,用于提供文件路径的补全功能。它可以根据当前路径自动补全文件和文件夹的路径,方便快速访问文件系统中的内容。
  6. cmp_luasnip:

    • 插件功能:cmp_luasnip 是 nvim-cmp 的一个插件,用于与 luaSnip 插件进行集成。它可以将 luaSnip 的代码片段作为补全选项,与其他补全源一起提供补全功能。
  7. nvim-autopairs:

    • 插件功能:nvim-autopairs 是一个自动补全括号、引号等字符的插件,它可以根据光标位置自动插入和匹配这些字符,提高编写代码的效率。它与 nvim-cmp 配合使用,可以在补全时自动处理括号的闭合。

其他插件

  1. gitsigns.nvim:
    • gitsigns.nvim 是一个 Git 状态提示插件,用于在 Neovim 中显示 Git 仓库中修改的部分,并提供相关的操作和功能,如跳转到修改的位置、提交代码等。
  2. indent-blankline.nvim:
    • indent-blankline.nvim 是一个缩进线插件,用于在 Neovim 中显示缩进的可视化效果,帮助用户更清晰地看到代码的缩进层级。
  3. nvim-colorizer.lua:
    • nvim-colorizer.lua 是一个颜色预览插件,它可以在 Neovim 中将代码中的颜色值以真实的颜色显示,帮助用户更直观地理解和调整颜色。
  4. nvim-lspconfig:
    • nvim-lspconfig 是一个用于配置 Neovim 内置 LSP 客户端的插件。它提供了一系列预定义的配置选项,使得用户可以轻松地配置和启用不同的语言服务器。
  5. ui:
    • ui 涉及到 Neovim 的用户界面美化和定制化。这可能包括颜色方案、状态栏、标签栏等方面的插件和配置,用于改善用户界面的外观和体验。
  6. which-key.nvim:
    • which-key.nvim 是一个按键提示和快捷键帮助插件,用于在 Neovim 中显示当前按键的操作提示,帮助用户更好地了解和使用快捷键。
  7. Comment.nvim:
    • Comment.nvim 是一个注释插件,它提供了快速注释和取消注释的功能,简化了对代码进行注释的操作。
  8. mason.nvim:
    • mason.nvim 是一个 HTML 和 CSS 的快速插入插件,它可以帮助用户更快速和方便地插入常用的 HTML 和 CSS 代码片段。
  9. nvterm:
    • nvterm 是一个 Neovim 的终端仿真器,它将终端功能嵌入到 Neovim 中,使得用户可以在 Neovim 中直接执行命令和操作终端。

lsp

这部分内容以后再完善。

暂时不用的插件

以后可能也会用,先放在这了。

启动页: alpha-nvim.

重命名: renamer.nvim.

Terminal: toggleterm.nvim.

提供格式化、诊断: null-ls.nvim.

管理 tabs、buffers: bufferline.nvim.

七、报错解决

  1. 遇到一个报错 Error executing vim.schedule lua callback: /root/.config/nvim/lua/core/utils.lua:80: attempt to index a nil value

    image-20230608午後05828970

    和 gpt 进行了探讨,

    image-20230608午後44051179

    改了源码 vi .config/nvim/lua/core/utils.lu 第 80 行,插入了这句:

    mappings[section] = mappings[section] or {}
    

    最终如下:

    image-20230608午後10143234

    就好了。

    自动补全

    image-20230608午後41100143

参考资料


mac 下怎么批量去掉文本文件中的每行^M

我从 Mac 对比从 windows 同事发来的代码, git diff 显示很多文件都有改动,每一行都被显示为修改过,严重影响了diff 功能。

最初,我们尝试使用 sed 的命令来去除每行末尾的”^M”字符,但是没有达到预期效果:

find . -type f -name "*.txt" -exec sed -i '' $'s/\r$//' {} \;
find . -type f -name "*.txt" -exec dos2unix {} +

转向 Perl 解决这个问题:

find . -type f -name "*.txt" -exec perl -pi -e 's/\r$//' {} \;

解释:

  • 使用 find 命令在当前目录及其子目录中递归搜索文本文件。
  • -type f 选项确保只匹配常规文件。
  • -name "*.txt" 选项筛选具有 “.txt” 扩展名的文件。
  • -exec 选项用于在每个匹配的文件上执行 Perl 命令。
  • perl -pi -e 是在文件上执行原地编辑的 Perl 命令。
  • 正则表达式 's/\r$//' 匹配每行末尾的 “^M” 字符(\r),并将其替换为空字符串。

注意:

  • 在对文件进行任何修改之前,建议先备份文件,以防止意外数据丢失。
  • 记得根据具体要求和文件位置调整命令和选项。

Mac M1 使用 whisper 和 ffmpeg 将视频转换为文字

工作生活中我们总会遇到要求看某某视频写心得之类的这种要求。

目前我经常看 b 站,b 站已经有相关的插件可以给你总结视频内容了。比如我前几天在《ChatGPT 的一些资料总结》记录的这个插件Glarity Summary,可以利用 ChatGPT为谷歌搜索、YouTube视频、以及各种网页内容生成摘要。

毕竟涉及到工作和生活,有一些视频我们没有办法上传到 SNS 上生成摘要,所以只好在本地生成了。我目前的办法是将视频转换成音频,再转换成文字。通过特定的 prompt ,脱敏后交给 gpt 帮我生成我想要的数据。虽然不是很完美的方案,暂时能解决问题就好。这篇文章简要记录下过程。

本方案还有诸多需要优化的地方,比如 whisper 使用的是 cpu 的方案。 GPU 运行的报错我一直没办法解决。待有空了再研究。

我估计可能是我 Python 版本的问题,我在《 Mac M1 运行 conda 和 jupyter notebook 备忘》使用的 Python 版本是 3.8,有可能不行。

1. ffmpeg

安装 ffmpeg

brew install ffmpeg

将视频转换为音频:

ffmpeg -i "input.mp4" -vn -acodec libmp3lame output.mp3
ffmpeg -i "input.mov" -vn -acodec libmp3lame output.mp3
  • -i input.mov 指定输入文件路径和文件名。
  • -vn 告诉 FFmpeg 不包含视频流,只处理音频流。
  • -acodec libmp3lame 指定音频编解码器为 libmp3lame,用于将音频流编码为 MP3 格式。
  • output.mp3 指定输出的 MP3 文件路径和文件名。

image-20230530午後85304231

将音频截取为 30s 一份的音频。

ffmpeg -i output.mp3 -f segment -segment_time 30 -c copy output_%03d.mp3

image-20230530午前91813357

这里多写一些关于 ffmpeg 的命令,将 mp3转为 ogg格式:

ffmpeg -i zzzpv.mp3 -c:a libvorbis -q:a 10 -map_metadata 0 -id3v2_version 3 -write_id3v1 1 zzzpv.ogg

2. whisper

https://github.com/openai/whisper

whisper是一款多任务语音识别模型,可进行多语言语音识别、语音翻译和语言识别。它使用Transformer序列到序列模型训练在一个大量的多样化音频数据集上,并兼容Python 3.8-3.11和最新的PyTorch版本。它提供了五种不同的模型大小,其中包括仅支持英语的版本,其性能取决于语言。它可以通过命令行或Python使用,其代码和模型权重在MIT许可证下发布。

whisper 有几种模型,我在 mac m1 下(CPU 模式)使用 small 的模型很快,medium 的很慢。

激活虚拟环境,安装 whisper:

conda activate ~/Workspace/pytorch-test/env
pip install --upgrade git+https://github.com/openai/whisper.git

编写hello world,试试效果:

import whisper
# model = whisper.load_model("small")
model = whisper.load_model("medium")
audio = whisper.load_audio("/Users/kelu/Desktop/output_000.mp3")
audio = whisper.pad_or_trim(audio)

# make log-Mel spectrogram and move to the same device as the model
mel = whisper.log_mel_spectrogram(audio).to("cpu")

# detect the spoken language
_, probs = model.detect_language(mel)
print(f"Detected language: {max(probs, key=probs.get)}")

# decode the audio
# options = whisper.DecodingOptions(fp16 = False, prompt="以下是普通话的句子")  # 简体中文增加 prompt
options = whisper.DecodingOptions(fp16 = False)
result = whisper.decode(model, mel, options)

# print the recognized text
print(result.text)

下载模型需要一些时间:

image-20230530午後01835016

我的两个音频文件也放来做个备份:output_1.mp3, output_2.mp3,

image-20230530午後91228422

写一个循环的逻辑:

import whisper

options = whisper.DecodingOptions(fp16 = False, prompt="以下是普通话的句子")
model = whisper.load_model("medium")

for i in range(361):
    file_name = f"output_{i:03d}.mp3"
    audio = whisper.load_audio("/Users/kelu/Desktop/"+file_name)
    audio = whisper.pad_or_trim(audio)
    mel = whisper.log_mel_spectrogram(audio).to("cpu")
    result = whisper.decode(model, mel, options)
    print(result.text)

3. 未解决问题

我尝试像参考资料 1 里的文章使用 mps 运行 whisper,但没有成功。网上也看到了很多讨论。待有精力再跟进了。

参考资料