本项目所用到的硬件:
- jetson orin NX 16G
项目需求
做一个语音转文字的小项目练手:上传一段 mp3 格式的音频,转成文字。
项目路线
- 使用 whisper.cpp 进行转录。由 C++ 实现,适合 jetson 这种 ARM 设备。
- 使用 Docker 来做,不污染本机环境。
- 使用 Flask 做接口。
whisper.cpp
这是 OpenAI 的 Whisper 自动语音识别模型的 C/C++ 移植版本。
特点是纯 C/C++ 实现,无外部依赖项。
Docker
jetson 内置了 Docker 24.0.5,是一个开源平台,它通过容器化技术,将应用程序及其所有依赖项打包到一个轻量级、可移植的容器中。
需要先创建一个 image(镜像),在这个镜像上创建一个 container(容器)。
Flask 是一个轻量级的 Python Web 框架。用来做一个网页上传 mp3 的服务。
容器里负责三件事:编译 whisper.cpp,提供一个 Web 接口,调用 ffmpeg 把音频转成 16k 单声道 wav,再调用 whisper.cpp 的 main 做转写(踩坑一:main 已经被弃用了,改成了 whisper-cli)。模型文件建议用宿主机目录挂载进容器,避免每次重建镜像都重新下载。
第一步
在 jetson 上建一个目录:~/stt-whisper-docker,里面放三个文件:Dockerfile、app.py、requirements.txt。
每个文件如下所示:
requirements.txt
1 | flask==3.0.0 |
app.py
1 | import os |
Dockerfile
1 | FROM arm64v8/ubuntu:20.04 |
第二步
在宿主机上创建一个 models 文件夹 stt-models,并下载模型,这里就先用 base 模型。在终端里一次输入下面的命令。
1 | mkdir -p ~/stt-models |
第三步
在项目文件夹中构建镜像
1 | cd ~/stt-whisper-docker |
这个会运行较长一段时间,取决于计算机性能。运行成功后,可以查看镜像,命令如下:
1 | sudo docker images |
如果要删除镜像,就可以按名字或这文件的哈希值删除
1 | sudo docker rmi jetson-stt:whispercpp |
第四步
运行 Docker,运行的同时把模型目录(即 stt-models )挂载进去。
1 | docker run -d --name stt \ |
第五步
浏览器打开 http://127.0.0.1:8000/ 看服务是否正常。如果能打开说明是正常的。
第六步
准备好的 mp3 文件上传。使用 curl 即可。
1 | curl -F "file=@/path/to/test.mp3" http://127.0.0.1:8000/transcribe |
等待返回 JSON,里面的 txt 字段就是转录的文字。
总结
看着挺简单,实际上花了一下午的时间。
第一坑:Dockerfile 中的依赖不全,这个查找到错误,然后改掉挺快的。
第二坑:main 文件不可用。找到要用 whisper-cli 用了非常久的时间。
第三坑:Docker 的各种命令
1 | # 查看容器 |
第四坑: 理清楚 image(镜像)和 container(容器)之间的关系。
展望
app.py 返回的中文是一对 Unicode 编码,并非是汉字,需要解码。其实可以直接在 app.py 后面加上解码的功能。