平时使用 OpenWebUI 的时候遇到的一个核心的问题就是: OpenWebUI 默认搭载的 Speech to Text 引擎,它的识别率是不行的。 而且应该是只支持英文。它的识别率又差,然后又不支持中英文和英文的混合输入,这使用中就造成了非常多的不便。 然后我就去找了一下如何在OpenWebUI上让这个中英文输入,可以达到,或者接近,我在手机上用微信输入法的这个程度。 然后目前来讲那就是 Whisper 或者就是这个 Faster Whisper。 然后是使用中发现一个很蛋疼的地方就是 Faster Whisper 它用的这套 API,还有 Whisper.cpp 给的那套 API,都是都不是 OpenAI 的那个API规范。 导致我没有办法在这个 OpenWebUI 上面直接配置使用。
NOTE
Whisper.cpp 似乎在更改 binary 名称的同时,直接舍弃了 OpenAI API server 的功能。原先是要用
main server命令 (注意原本就不是单纯的server)。 但是改完了之后,main变成了whisper-cli,然后似乎就没有serversubcommand 了。 More about rename: https://github.com/ggml-org/whisper.cpp/blob/master/examples/deprecation-warning/README.md
直到我后来找到了这个项目:https://github.com/speaches-ai/speaches/tree/master 这个项目它实际上后端也是用的 Faster Whisper。但是它把 API 搞成 OpenAI 的格式。这样我就可以直接在 OpenWebUI 上调用这个Faster Whisper,实现快速优质的 STT。 也是找了一晚上才找到这么一个就是开箱即用的一个产品。所以在这里记录一下它的使用和部署的流程。
Docker Compose
services:
speaches:
image: ghcr.io/speaches-ai/speaches:latest-cuda-12.6.3
restart: unless-stopped
ports:
- 18000:8000
volumes:
- /mnt/data/speaches/hf-hub-cache:/home/ubuntu/.cache/huggingface/hub
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities:
- gpu有一点没想到的是,/mnt/data/speaches/hf-hub-cache 需要明确把 owner 改成 1000:1000 的用户和组,
否则后面下载模型的时候,会有 permission 的错误(curl 上是返回 server internal error)。估计 image
里面用的不是root用户(毕竟能看出来 base 大概率是 Ubuntu)。
存一下 URL,之后用着方便。
export SPEACHES_BASE_URL=http://192.168.1.1:18000Download Model
Use this command to list all the models supported to download for automatic-speech-recognition.
curl "$SPEACHES_BASE_URL/v1/registry?task=automatic-speech-recognition" | jqNOTE
注意不是所有的模型都是 STT 的,只有 task=automatic-speach-recognition 的才是。 如果不指定 task,那 TTS 的也会返回。
Download a specific one (one with large-v3 and support multiple languages)
curl "$SPEACHES_BASE_URL/v1/models/Zoont/faster-whisper-large-v3-turbo-int8-ct2" -X POSTConfig OpenWebUI
Using the UI
- Go to the Admin Settings page
- Click on the “Audio” tab
- Update settings
- Speech-to-Text Engine: OpenAI
- API Base URL: http://speaches:8000/v1
- API Key: does-not-matter-what-you-put-but-should-not-be-empty
- Model: Zoont/faster-whisper-large-v3-turbo-int8-ct2
- Click “Save”
Using environment variables (Docker Compose)
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
...
environment:
...
# Environment variables are documented here https://docs.openwebui.com/getting-started/env-configuration#speech-to-text
AUDIO_STT_ENGINE: "openai"
AUDIO_STT_OPENAI_API_BASE_URL: "http://<your-speeches-ip>:18000/v1"
AUDIO_STT_OPENAI_API_KEY: "does-not-matter-what-you-put-but-should-not-be-empty"
AUDIO_STT_MODEL: "Zoont/faster-whisper-large-v3-turbo-int8-ct2"
...WARNING
但是如果之前在 OpenWebUI 里面但凡调整过 STT,那这个 Env variable 的方法似乎就不管用了。
使用
OpenWebUI 目前还只是直接进行录音,然后将整个录音发给 Speeches,然后 faster-whisper 再识别。 而不是 streaming 的形式,一段段的识别。这个导致在使用的时候,实际上是看不到识别的进度的。
好在 large-v3 的识别率确实非常惊人。实测中文英文混杂完全没有什么问题。所以识别率高,就算没有 streaming,也算是没有太大的问题。
还有一个问题就是 Whisper large v3 也还是依旧不会添加标点符号。虽然实际上有带有标点符号的模型(比如:https://huggingface.co/BELLE-2/Belle-whisper-large-v3-zh-punct) 但是似乎就没有多语言支持了。有点可惜。
- Changed the model to ‘deepdml/faster-whisper-large-v3-turbo-ct2’. It works better, now it can recognize Chinese + English + Punctuations.