跳到主要内容

Whispercpp 安装与使用教程

· 阅读需 2 分钟
素明诚
Full stack development

环境准备​

Ubuntu 22.04 或其他 Linux 发行版,windows 上要配置的东西比较多,不推荐。

CUDA 支持的 Nvidia GPU (可选)

安装编译工具​

安装编译所需的工具

sudo apt install build-essential

下载与编译 Whisper.cpp​

使用 git 克隆 whisper.cpp 项目

git clone https://github.com/ggerganov/whisper.cpp.git
cd whisper.cpp

编译项目​

在项目根目录下运行 make 命令

make

如果您有 CUDA 环境,可以加速编译

make -j

编译后会出现 main 可执行文件

038653ba2e64f0a69d54057bc75f7ae3## 模型下载

进入 models 目录并下载所需的模型

cd models
./download-ggml-model.sh large-v3-turbo

3f5577ff4ad66f88caa0eeb37895468d## 音频文件处理

准备音频文件

因为 whisper.cpp 需要 .wav 格式,确保音频文件为 .wav 格式,可以使用 ffmpeg 进行转换,没有ffmpeg需要提前下载

apt install ffmpeg
ffmpeg -i /home/whisper.cpp/test_wma.wma -acodec pcm_s16le -ac 1 -ar 16000 /home/whisper.cpp/test_wav.wav

使用 Whisper 进行语音识别​

在项目根目录下运行 whisper 命令

./main -m ./models/ggml-large-v3-turbo.bin -f /home/whisper.cpp/test_wav.wav

实时语言转换​

./stream -m ./models/ggml-large-v3-turbo.bin -f your_audio_device

其他常见问题处理​

CUDA 编译问题

如果遇到 CUDA 相关的编译问题,确保安装了 nvidia-cuda-toolkit 和对应的驱动

sudo apt install nvidia-cuda-toolkit

ccache 提升编译速度

安装 ccache 来缓存编译结果

sudo apt install ccache

在 WSL (Windows Subsystem for Linux) 上实现音频输入和输出​

在 Windows 上下载并设置 PulseAudio​

下载 PulseAudio for Windows 并将其解压到您的系统上的某个位置,例如 C\PulseAudio。

编辑 C\PulseAudio\etc\pulse\default.pa 文件,确保添加以下行以启用网络音频支持

load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1

同时,您可能需要编辑 C\PulseAudio\etc\pulse\daemon.conf 文件,并设置

exit-idle-time = -1

运行 PulseAudio 服务

C\PulseAudio\bin\pulseaudio.exe

配置 WSL 以使用 PulseAudio​

在 WSL 中安装 PulseAudio 客户端工具(如果尚未安装)

sudo apt update
sudo apt install pulseaudio

配置 WSL 使用从 Windows 主机运行的 PulseAudio,编辑 ~/.bashrc 或相应的 shell 配置文件,并添加

export PULSE_SERVER=tcplocalhost

测试音频功能​

在 WSL 中,您现在应该能够通过 PulseAudio 来播放音频。例如,使用 aplay 或其他音频软件测试播放声音。

确保在配置过程中,Windows 防火墙允许 PulseAudio 和相关网络通信。这些步骤概述了在 WSL 中启用音频的基本方法,可以适用于大多数需要音频输入输出的场景

参考文档​

Windows 上安装 CMake

· 阅读需 3 分钟
素明诚
Full stack development

CMake 是一个构建系统生成器,它主要解决了跨平台编译和构建软件的复杂性问题,允许开发者使用单一的配置文件来管理和生成适用于多种编译环境的项目文件。

CMake 解决了什么问题​

想象下你是一个软件开发者,你的任务是开发可以在 Windows、Linux 和 macOS 上运行的应用程序。每个操作系统都有其特定的编译器和工具链,这意味着你可能需要为每个平台编写和维护不同的构建脚本或项目文件。

使用 CMake,你只需要编写一套 CMakeLists.txt 配置文件。CMake 可以根据这个配置文件生成适用于各个平台的构建文件。例如:

  1. 在 Windows 上,CMake 可以生成 Visual Studio 的解决方案文件。
  2. 在 Linux 上,CMake 可以生成 Makefiles,这些 Makefiles 又可以被 GNU Make 工具使用来编译程序。
  3. 在 macOS 上,CMake 同样可以生成 Makefiles 或者 Xcode 项目文件。

这样,你就不需要手动适配和管理每个平台的构建过程,大大简化了跨平台开发的复杂性。

安装 CMake​

下载 CMake​

安装 CMake​

运行下载的安装程序。

安装CMake步骤1

在安装过程中,选择"Add CMake to the system PATH for all users"或"Add CMake to the system PATH for the current user"选项,这样可以在命令行中直接调用 CMake。

安装CMake步骤2

验证 CMake 安装​

打开命令行工具(CMD 或 PowerShell):

cmake --version

验证CMake安装

使用 CMake 测试一个简单的项目​

创建一个简单的 C++项目​

  1. 创建一个新文件夹作为项目文件夹,例如CMakeTest
  2. 在该文件夹内创建一个名为CMakeLists.txt的文件,输入以下内容:
cmake_minimum_required(VERSION 3.10)
project(HelloCMake)
add_executable(hello hello.cpp)
  1. 在同一文件夹中创建一个hello.cpp的 C++源文件,输入以下简单代码:
#include <iostream>

int main() {
std::cout << "Hello, CMake!" << std::endl;
return 0;
}

生成和构建项目​

  1. 在命令行中,导航到你的CMakeTest目录
  2. 创建一个名为build的目录来存放构建输出:
mkdir build
cd build
  1. 运行 CMake 生成构建系统:
cmake ..
  1. 构建项目:
cmake --build .

运行生成的程序​

  1. 在build目录中,你会找到编译后的可执行文件(在 Windows 中是hello.exe)
  2. 运行它:
./hello

如果看到输出"Hello, CMake!",则表示 CMake 已正确安装并能够用于构建项目。

这些步骤将帮助你安装 CMake 并验证它是否能在你的系统上正常工作,同时也提供了一个简单的例子来展示如何使用 CMake 来构建 C++程序。如果遇到任何问题,你可以查看 CMake 的官方文档,其中包含了更多高级功能和详细指南。

Windows 安装 MinGW-W64

· 阅读需 1 分钟
素明诚
Full stack development

MinGW 离线安装​

  1. 进入官网https://www.mingw-w64.org/downloads/
  2. 浏览器搜索 SourceForge ,点击进入 https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/
  3. 搜索x86_64-win32-seh ,各位可以自行选择其他的版本。
  4. 下载解压,在系统环境变量配置

e3bb2d13d1f55e2df498094feb8e3f92## 验证是否成功

gcc -v

2f34d2f7cd00fdfd393d836a47702bb9## MinGW 在线安装

  1. 进入官网https://www.mingw-w64.org/downloads/
  2. 浏览器搜索 SourceForge ,点击进入 https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/
  3. 搜索MinGW-W64 Online Installer 找到并且下载在线安装版本
  4. 在线安装可能会有网络问题,推荐离线包,配置环境变量就可以用了

Conda 依赖管理和环境管理

· 阅读需 2 分钟
素明诚
Full stack development

使用 Conda 创建新的环境​

该命令将在 Conda 中创建一个名为 venv 的虚拟环境,并且这个环境将使用 Python 3.10.13 版本。-y 选项会让 Conda 自动确认并执行所有操作,避免手动交互。

conda create -n venv python=3.10.13 -y

指定的目录中创建虚拟环境​

conda create --prefix=/path/to/your/env python=3.10.15

激活目录环境​

conda activate /path/to/your/env

安装需要的依赖​

使用 conda 命令安装 FastAPI 和 Uvicorn,这里选择从conda-forge安装,这是一个社区维护的高质量包资源

conda install -c conda-forge fastapi uvicorn

如果你不使用conda-forge安装的话,默认是从由 Anaconda 维护的官方频道,它包含了大量常用的 Python 包和其他依赖项,conda-forge 频道更新更频繁,包含了更多最新的包版本和更广泛的包集合,特别是一些 defaults 频道中可能没有的包。

查看已经安装的包​

conda list

删除不再需要的包和缓存​

conda clean --all

删除指定的包​

conda remove fastapi uvicorn

操作环境​

进入环境​

conda activate venv

退出环境​

conda deactivate

查看虚拟环境​

conda env list

删除某个环境​

conda remove --name venv --all

导出导入环境​

导出环境​

conda env export > environment.yml 这个命令导出的是当前激活的环境

conda env export > environment.yml

从文件创建环境​

conda env create -f environment.yml

跨平台导出​

conda env export --from-history > environment.yml

导出 Linux 环境的包​

conda-lock lock -f environment-linux.yml -p linux-64 -k explicit --filename-template conda-linux-64.lock

创建 Linux 环境的包​

conda create --name myenv --file conda-linux-64.lock

Windows 环境下配置 Fultter 开发环境

· 阅读需 1 分钟
素明诚
Full stack development

必须安装的部分​

安装 Android Studio 或 Visual Studio Code​

这里我习惯 Android Studio ,下载安装 https://developer.android.com/studio?hl=zh-cn

Android Studio 没有汉化可以去下载 IDEA 对应的汉化包插件,装

安装 Flutter SDK​

参考:https://docs.flutter.dev/get-started/install/windows/mobile#install-the-flutter-sdk

安装 Visual Studio​

https://visualstudio.microsoft.com/zh-hans/downloads/

下载后,选择安装 C++ 桌面工具即可,大概 10GB 左右

环境变量配置​

用户变量​

PUB_HOSTED_URL=https://pub.flutter-io.cn

FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn

e0080eba06e3a2b644da59a04665b1aea529df15c7e845f4d40bc1ba0264ed5b### 系统变量

把 SDK 和 flutter\bin 添加到 Path

0762778870ef5a2a9cfaab0b6079594b### Git 配置代理

git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890

修改 kMaven​

const String kMaven = 'http://maven.aliyun.com/nexus/content/groups/public/';

8e54c4ed148220c07a3e44bc5970b06e

如果你的修改不生效,需要先删除 \flutter\bin 目录,再重新执行 flutter doctor

检查是否安装成功​

flutter doctor 检查是否都安装成功且配置成功了

配置成功​

021955f65a1ec672efb2513daa3052f4

Pandoc 开源的文档转换工具

· 阅读需 1 分钟
素明诚
Full stack development

Pandoc 是一个开源的文档转换工具,能够高效地将不同格式的文档进行转换。它支持多种输入和输出格式~

Pandoc 的功能​

Pandoc 能够处理以下格式

输入格式 Markdown、DOCX、HTML、LaTeX、RTF、ODT、XLSX(通过间接方式)、TXT 等。

输出格式 Markdown、DOCX、PDF、HTML、LaTeX、EPUB 等。

安装与使用​

安装​

在 Windows 上,可以从 https://pandoc.org/installing.html 下载并安装。对于 Linux 用户,可以通过包管理器安装。

转换示例​

DOCX 转 Markdown 使用以下命令将 DOCX 文件转换为 Markdown

pandoc input.docx -t markdown -o output.md

TXT 转 Markdown 将 TXT 文件转换为 Markdown 也很简单

pandoc input.txt -t markdown -o output.md

XLSX 转 Markdown 虽然 Pandoc 不直接支持 XLSX 格式转换,但可以先将 XLSX 转换为 CSV,然后使用 Pandoc

首先将 XLSX 文件另存为 CSV。

然后使用 Pandoc 进行转换

pandoc output.csv -t markdown -o output.md

Poetry 安装方式的几种方式

· 阅读需 2 分钟
素明诚
Full stack development

官方推荐的安装脚本(推荐哦~)​

# Linux/macOS
curl -sSL https://install.python-poetry.org | python3 -
​
# Windows PowerShell
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -

特点​

  • 安装最新版本
  • 用户级安装,不需要 sudo
  • 安装后需要添加到 PATH

安装后的配置,添加到 PATH

# Linux/macOS - 添加到 ~/.bashrc 或 ~/.zshrc
export PATH="/home/$USER/.local/bin:$PATH"
​
# Windows
# 系统设置 > 环境变量 中添加 %APPDATA%\Python\Scripts
​
定期更新 Poetry 本身`poetry self update`

通过 pip 安装​

pip install --user poetry

特点​

  • 简单直接
  • 可能不是最新版本
  • 安装在用户目录下

通过包管理器安装​

# Ubuntu/Debian
sudo apt install python3-poetry
​
# macOS
brew install poetry

特点​

  • 系统级安装
  • 版本可能较旧
  • 自动添加到 PATH

验证安装​

# 检查是否安装成功
poetry --version
​
# 检查配置
poetry config --list

基本使用命令​

# 初始化新项目
poetry new my-project
​
# 在现有项目中初始化
poetry init
​
# 安装依赖
poetry install
​
# 添加新依赖
poetry add package-name
​
# 移除依赖
poetry remove package-name
​
# 更新依赖
poetry update

环境管理​

# 创建虚拟环境
poetry env use python3.10
​
# 查看虚拟环境信息
poetry env info
​
# 列出所有虚拟环境
poetry env list

常用配置​

# 设置虚拟环境在项目目录下
poetry config virtualenvs.in-project true
​
# 显示详细输出
poetry config --list
​
# 更改镜像源
poetry config repositories.foo https://foo.bar/simple/

注意事项​

  • 建议使用官方安装脚本,保证获取最新特性
  • 安装后记得添加到 PATH
  • 如果使用 conda,确保在正确的 conda 环境中使用 poetry
  • pyproject.toml 是核心配置文件,要仔细维护

卸载 Poetry​

# 使用官方脚本卸载
curl -sSL https://install.python-poetry.org | python3 - --uninstall
​
# 或直接删除安装目录
rm -rf ~/.local/share/pypoetry
rm -rf ~/.poetry

切换清华源​

poetry config pypi-token.pypi https://pypi.tuna.tsinghua.edu.cn/simple/

增加 poetry 的超时时间,避免短时网络中断导致的传输错误。​

export PIP_DEFAULT_TIMEOUT=1000

sudo -s 如何不输入密码

· 阅读需 2 分钟
素明诚
Full stack development

在 Linux 系统中,sudo 命令用于以超级用户权限执行命令。使用 sudo -s 可以启动一个新的 shell,允许你在这个 shell 中执行命令,而不必每次都输入 sudo。

有时你会发现使用 sudo -s 时不需要输入密码,这通常是由以下几个原因造成的

用户权限配置​

sudo 的权限是由 /etc/sudoers 文件控制的。如果该文件中为某个用户或用户组配置了特定的规则,允许他们在执行 sudo 命令时不需要输入密码。例如:

username ALL=(ALL) NOPASSWD: ALL

这条规则意味着用户 username 可以在任何主机上以任何用户身份运行所有命令,而不需要输入密码。

会话有效期​

在第一次使用 sudo 时,如果输入了密码,该会话在默认情况下会保持有效(通常是 5-15 分钟),在此期间再次使用 sudo 时就不需要输入密码。使用 sudo -s 在这个时间范围内也不会要求输入密码。

特定命令的例外​

有时,系统管理员可能会配置某些特定命令允许不需要密码。例如,可能有规则允许在不要求密码的情况下使用某些管理工具。

sudo 版本和配置差异​

不同版本的 sudo 和系统的配置可能会有所不同,导致某些行为不一致。

如果你想检查具体的配置,可以使用 sudo -l 命令查看当前用户的 sudo 权限设置。

配置 sudo 不输密码​

编辑 sudoers 文件:使用命令 sudo visudo 来编辑 /etc/sudoers 文件。这样可以避免语法错误导致的问题。

添加配置行:在文件中添加如下行,替换 username 为你的用户名

username ALL=(ALL) NOPASSWD: ALL

这行的意思是用户 username 在所有主机上以任何用户身份执行所有命令时不需要输入密码。

保存更改:保存并退出编辑器。visudo 会自动检查语法并确保没有错误。

测试配置:打开一个新的终端,尝试运行 sudo 命令以确认不再要求输入密码。

Go语言实践开闭原则非侵入式设计与装饰器模式

· 阅读需 3 分钟
素明诚
Full stack development

1. 开闭原则(Open-Closed Principle, OCP)​

开闭原则的核心思想是软件实体(如类、模块、函数等)应该对扩展开放,对修改封闭。这意味着一个实体允许其行为被扩展,但是不应当修改其源代码。

Go 代码示例​

假设我们有一个日志系统,需要支持不同格式的日志输出(如 JSON、XML 等)。我们可以定义一个日志接口,然后为每种日志格式提供一个实现。这样,如果将来需要支持新的日志格式,我们只需添加新的实现,而不需修改现有代码。

package main
​
import (
"fmt"
"encoding/json"
"encoding/xml"
)
​
// Logger 是对日志操作的抽象
type Logger interface {
Log(message string) error
}
​
// JSONLogger 是输出JSON格式日志的实现
type JSONLogger struct{}
​
func (l *JSONLogger) Log(message string) error {
data, err := json.Marshal(struct{Message string}{Message: message})
if err != nil {
return err
}
fmt.Println(string(data))
return nil
}
​
// XMLLogger 是输出XML格式日志的实现
type XMLLogger struct{}
​
func (l *XMLLogger) Log(message string) error {
data, err := xml.Marshal(struct{Message string}{Message: message})
if err != nil {
return err
}
fmt.Println(string(data))
return nil
}
​
func main() {
var logger Logger
​
// 使用JSONLogger
logger = &JSONLogger{}
logger.Log("Hello JSON")
​
// 使用XMLLogger
logger = &XMLLogger{}
logger.Log("Hello XML")
}

2. 非侵入式设计​

非侵入式设计指的是在添加或修改功能时,尽量不修改现有的代码结构,而是通过扩展等方式来增强功能。这样可以最大限度地保持原有代码的稳定性和可用性。

在上述日志系统的例子中,我们通过实现Logger接口来添加新的日志格式,而不是修改Logger接口或其他已有实现。这种方式就是典型的非侵入式设计。

3. 装饰器模式​

装饰器模式是一种设计模式,允许向一个现有的对象添加新的功能,同时又不改变其结构。这是一种实现开闭原则的有效手段。

Go 代码示例​

如果我们想要为日志添加时间戳功能,可以创建一个装饰器来实现这一需求,而不是修改现有的日志实现。

import (
"time"
)
​
// TimestampLogger 是装饰器,为日志添加时间戳
type TimestampLogger struct {
Logger Logger
}
​
func (l *TimestampLogger) Log(message string) error {
timestampedMessage := fmt.Sprintf("%s: %s", time.Now().Format(time.RFC3339), message)
return l.Logger.Log(timestampedMessage)
}
​
func main() {
var logger Logger
​
// 使用带时间戳的JSONLogger
logger = &TimestampLogger{Logger: &JSONLogger{}}
logger.Log("Decorated JSON")
}

Python 的包如何导入导出和管理

· 阅读需 2 分钟
素明诚
Full stack development

Python 包的导入​

Python 的“包”可以理解为一个包含模块的文件夹,用于组织和重用代码。要在你的代码中使用现有的包或模块,需要使用 import 语句。

导入整个模块​

import math  # 导入标准库中的 math 模块
print(math.sqrt(16)) # 使用模块中的函数

导入模块中的特定函数或类​

from math import sqrt  # 仅导入 sqrt 函数
print(sqrt(16))

为模块或函数起别名​

import numpy as np  # 为模块起别名
from math import sqrt as square_root # 为函数起别名

导入自定义模块​

假设你有一个 my_module.py 文件,其中包含一些函数

# my_module.py
def greet(name):
return f"Hello, {name}!"

在同一目录下的其他脚本中,可以这样导入

import my_module
print(my_module.greet("Alice"))

Python 包的导出(创建和发布)​

创建自己的模块和包​

模块:一个包含 Python 代码的 .py 文件。

包:一个包含 __init__.py 文件的文件夹,里面可以有多个模块。

创建一个包结构​

my_package/
__init__.py
module1.py
module2.py

在 module1.py 中​

def func1():
print("Function 1")

在 module2.py 中​

def func2():
print("Function 2")

在 __init__.py 中,可以指定要导出的模块或函数

from .module1 import func1
from .module2 import func2

这样,其他人就可以导入你的包,相当于提前把包汇总到了__init__.py 中

from my_package import func1, func2
func1()
func2()

包的管理​

使用 pip 管理包​

pip 是 Python 的包管理器,用于安装、升级和卸载包。

安装包

pip install package_name

升级包

pip install --upgrade package_name

卸载包

pip uninstall package_name

虚拟环境​

使用虚拟环境可以为不同的项目隔离包的依赖,避免冲突。

创建虚拟环境

python -m venv env_name

激活虚拟环境

在 Windows

env_name\Scripts\activate

在 macOS/Linux

source env_name/bin/activate

在虚拟环境中安装包

激活环境后,使用 pip install 安装的包只会影响当前环境。

退出虚拟环境

deactivate

依赖管理​

生成 requirements.txt 文件

pip freeze > requirements.txt

根据 requirements.txt 安装依赖

pip install -r requirements.txt

如果有任何疑问,欢迎提出