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,但没有成功。网上也看到了很多讨论。待有精力再跟进了。

参考资料


使用 git archive 导出最近一次提交的 Git 变更文件

git archive -o "$(basename "$(pwd)").zip" HEAD $(git diff --name-only HEAD^ HEAD)

含义如下:

  • git archive:用于创建一个 Git 存档文件。

  • -o "$(basename "$(pwd)").zip":指定输出文件的名称。在这里,我们使用 basename "$(pwd)" 来获取当前目录的目录名。

  • HEAD:表示我们要导出的提交的引用

    HEAD 是指向当前所在分支的指针,它指向最新的提交。

    HEAD^ 则表示当前提交的父提交,即倒数第二个提交。

  • $(git diff --name-only HEAD^ HEAD):用于获取最近一次提交与上一次提交之间的变更文件列表。git diff --name-only HEAD^ HEAD 命令返回这些文件的相对路径。


npm ERR integrity checksum failed when using sha wanted xxxx but got yyyy

一个很久没有动过的前端流水线,发现怎么都编不过。在我本地也编不过。问了厂商,厂商也一筹莫展,没给什么好的建议:

npm ERR! Verification failed while extracting @babel/types@7.12.5.

image-20230525午後81829074

为此,我甚至还专门装了和厂商相同的 node 和 npm 的版本,依旧不行,恼人。

本着遇事不决先问 gpt 的精神,问了它,他给的办法都没啥用。

image-20230525午後81657915

都试着运行了一下,作为半桶水的前端,实在是头大,也并没有什么卵用。看来还是得靠Google 自个儿慢慢看了。

我比较懂得 php 相关的项目,composer 也是使用 lock 文件作为版本管理的一个快照切片一样的东西。

事实上,删掉 lock 文件再 install 是个好办法,肯定可以成功的。成功后我对比了 lock 文件,和先前的有诸多变动。作为新人我实在没有勇气将这个前端文件的 lock 文件删掉重新 install,生怕出现其他错误更难查找问题。

于是用了保守的办法,直接改了 lock 文件里的内容,先搜索第一个 sha1 的值,然后替换成了第二个 sha1 的值:

image-20230525午後82942262

终于能编过了~~

参考资料


chrome 允许跨域

在开发环境 chrome 最容易遇到这种问题:blocked by CORS policy

image-20230525午後80457113

最简单的办法是,改用 Firefox。

如果一定要用 Chrome ,可以用一下几个办法关闭 CORS 检测:

Windows

复制一个 chrome 浏览器的快捷方式,在属性中找到打开路径,在 …chrome.exe 后面加上

--args --disable-web-security --user-data-dir="C:/ChromeDevSession"

Mac

在终端中执行命令

open -a 'Google Chrome' --args --disable-web-security --user-data-dir=/tmp/chrome_dev_test

扩展程序的方式

cros-anywhere


Mac homebrew 备忘

这一篇会保持更新吧。因为不是一次性的工具。遇到 homebrew 问题以后就往这里记录了。

homebrew

Homebrew 是 macOS 上的一个开源的软件包管理器,它简化了在终端中安装、卸载和更新各种软件和工具的过程。以下是 Homebrew 的一些关键特点和用法:

  1. 简便安装: Homebrew 提供了一个简单的命令行接口,使用户能够轻松安装软件包。例如,要安装 Git,只需运行 brew install git 即可。
  2. 自动化: Homebrew 会自动处理软件包之间的依赖关系,确保所需的库和工具也被正确安装。
  3. 更新和升级: 使用 brew update 命令可以更新 Homebrew 本身,而 brew upgrade 命令则可以升级已安装的软件包到最新版本。
  4. 搜索功能: 通过 brew search 命令,用户可以搜索并查看可用的软件包列表。例如,brew search python 将显示与 Python 相关的软件包。
  5. 版本管理: Homebrew 允许用户安装特定版本的软件包,以便与特定项目或依赖关系兼容。通过 brew switch 命令可以切换不同版本。
  6. 可扩展性: Homebrew 支持自定义和扩展,用户可以贡献新的软件包、公式和 Casks(用于管理 macOS 应用程序的扩展)。

homebrew cask

Homebrew 和 Homebrew Cask 是两个不同的工具,但它们都用于在 macOS 上安装软件。

  1. Homebrew: Homebrew 是一个包管理器,用于在 macOS 上安装命令行工具和库。通过 Homebrew,您可以轻松安装、卸载和管理软件包。例如,要安装 Node.js,您可以运行 brew install node
  2. Homebrew Cask: Homebrew Cask 是 Homebrew 的一个扩展,专门用于管理 macOS 图形界面应用程序(GUI应用)。相对于纯命令行工具,图形应用程序通常有一个用户界面,而 Homebrew Cask 使得通过命令行方式管理这些应用程序更加方便。通过 Homebrew Cask,您可以安装 macOS 应用程序,例如 brew install --cask nodebox

因此,如果只涉及命令行工具或库,使用 brew install 就足够。如果涉及到 macOS 图形应用程序,可能需要使用 brew install --cask

在某些情况下,Homebrew Cask 中的应用程序可能会在 Homebrew 中的软件仓库中没有,因此需要使用 --cask 参数来表示这是一个 Cask 安装。

安装

[homebrew][homebrew]。包管理器。没有网络问题的话参考官方文档安装即可。

这里多说两个场景:

  1. 国内场景,用中科大的源好一些:

    /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
    
  2. arm 架构 和 x86架构:

    如果是m架构的,默认的是 arm 的。有时候我们还需要x86的东西,就要单独装x86的homebrew:

    image-20230628午後80202960

    image-20230628午後82459573

    x86的:

     arch -x86_64 /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.sh)"
    

    和普通命令的区别是开头加了arch -x86_64,用来标记通过兼容模式运行安装脚本。这样安装之后的才是x86版本。

    .zshrc 或者 .bashrc 里添加:

     alias abrew='eval $(/opt/homebrew/bin/brew shellenv) && arch -arm64 /opt/homebrew/bin/brew'
     alias ibrew=' eval $(/usr/local/Homebrew/bin/brew shellenv) && arch -x86_64 /usr/local/bin/brew'
    

常用命令

brew install 软件名
brew search 软件名
brew uninstall 软件名
brew update
brew upgrade 软件名
brew list
brew info/home 软件名 
brew reps
brew services list
brew services start/stop/restart serverName
  1. 查看配置

    brew config
    

    image-20230522午前114815453

  2. 更新 brew 信息

    brew update
    

    image-20230522午後00757587

    遇到了报错: ` fetching failed`。。。

    原因是我电脑上跑的 clash 的混合端口,git 配置为 sock5 端口代理有问题。要改成用 http 代理端口

    git config --global http.https://github.com.proxy 'http://127.0.0.1:7890'
    
  3. 切换不同架构的 brew

    .zshrc 或者 .bashrc 里添加:

    alias abrew='eval $(/opt/homebrew/bin/brew shellenv) && arch -arm64 /opt/homebrew/bin/brew'
    alias ibrew='source /Users/kelu/.zprofile && arch -x86_64 /usr/local/bin/brew'
    

    另外 /Users/kelu/.zprofile 的内容为:

      export HOMEBREW_PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
      export HOMEBREW_API_DOMAIN=https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api  
      export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/ 
      eval $(/usr/local/Homebrew/bin/brew shellenv)
    

天翼云增加子账号并给子账号设置权限

不得不说天翼云的智障帮助机器人,以送佛送一半的心态,把我带进了坑里。这里简单提一下我怎么找到给天翼云开子账号和配权限的过程。

1. 帮助中心

image-20230518午後83916689

点击右下角,问问智能客服:

image-20230518午後84027903

image-20230518午後84108792

2. 工单

image-20230518午後84309283

3. 开通子账号

image-20230518午後84409901

一直到这里都还行。

image-20230518午前94217478

image-20230518午前94247042

image-20230518午前94341253

4. 配置权限

智障的自动帮助就再也没办法帮助了。后来问了客服经理,应该在 所有服务->统一身份认证服务 里进行配置:

image-20230518午前94002616

image-20230518午前94021502

image-20230518午前94510101

image-20230518午前94611598

image-20230518午前94917287

我选择了这一项。

image-20230518午前100530121

完成。