Skip to content

Commit 0145eeb

Browse files
refactor: generate→image, whisper→asr, add tts command; feat: Qwen3-ASR convert+infer
- rename: generate.py→image.py, whisper.py→asr.py - new: tts.py (independent TTS command) - asr: auto-detect Whisper/Qwen3-ASR, auto-switch transformers version - convert: add Qwen3-ASR conversion support - README: restructured ASR section with Qwen3-ASR recommendation
1 parent 98bd508 commit 0145eeb

8 files changed

Lines changed: 745 additions & 435 deletions

File tree

README.md

Lines changed: 67 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,13 @@ eval "$(./ov-cli venv)"
2929
# 3. 聊天终端
3030
./ov-cli chat --model ./Qwen3/2B-ov
3131

32-
# 4. 文生图 / TTS
33-
./ov-cli generate --model ./FLUX/ov-int4
34-
./ov-cli generate --model ./0.6B-CV-ov --prompt 你好 --speaker Vivian
32+
# 4. 文生图
33+
./ov-cli image --model ./FLUX/ov-int4
34+
35+
# 5. TTS 语音合成
36+
./ov-cli tts --model ./0.6B-CV-ov --prompt 你好 --speaker Vivian
37+
38+
# 6. API 服务
3539

3640
# 5. API 服务
3741
./ov-cli server --model ./Qwen3/2B-ov
@@ -227,52 +231,61 @@ EOF
227231
./ov-cli benchmark --model ./Qwen3.6/35B-A3B-ov --reasoning off
228232
```
229233

230-
### `whisper`语音转文字
234+
### `tts`语音合成
231235

232-
使用 OpenVINO GenAI WhisperPipeline 转录音频,支持交互式和单次模式
236+
使用 OpenVINO Qwen3-TTS 生成语音,仅支持单次
233237

234-
```bash
235-
# 交互式
236-
./ov-cli whisper --model ./whisper/ov-large
238+
**CustomVoice**(预设声音):
237239

238-
# 单次(输出完自动退出)
239-
./ov-cli whisper --model ./whisper/ov-large --mode once --file speech.mp3 -o output.txt
240-
./ov-cli whisper --model ./whisper/ov-large --mode once --file speech.mp3 --json # JSON 格式输出
240+
```bash
241+
./ov-cli tts --model ./0.6B-CV-ov --prompt "今天天气真好" --speaker Vivian
242+
./ov-cli tts --model ./0.6B-CV-ov --prompt "Hello" --speaker vivian --lang english
243+
./ov-cli tts --model ./0.6B-CV-ov --prompt "你好" --speaker Vivian --instruct "温柔地" -o voice.wav
241244
```
242245

243-
**注意:** Whisper 根据音频中的停顿和语调添加标点符号。
244-
TTS(文字转语音)生成的音频语速均匀、缺少自然停顿,转录结果可能不含句号逗号等标点,属正常现象。
246+
**Base(声音克隆)**(需参考音频):
247+
248+
```bash
249+
./ov-cli tts --model ./0.6B-ov --prompt "你好" --ref-audio ref.mp3 -o voice.wav
250+
./ov-cli tts --model ./0.6B-ov --prompt "Hello" --ref-audio ref.mp3 --lang english
251+
```
245252

246-
### `generate`文生图 / TTS 语音合成
253+
### `asr`语音转文字
247254

248-
自动识别模型类型(文生图 / TTS CustomVoice / TTS Base),无需手动指定。
249-
TTS 仅支持单次模式(once),文生图支持交互式和单次。
255+
自动识别 Whisper / Qwen3-ASR。**推荐 Qwen3-ASR**(自动加标点、语种识别、支持 52 种语言和方言)。
250256

251-
**文生图**使用 OpenVINO GenAI Text2ImagePipeline,支持交互式/单次):
257+
**Qwen3-ASR**推荐):
252258

253259
```bash
254-
# 交互式(多轮生图)
255-
./ov-cli generate --model ./FLUX/ov-int4
260+
# 交互式
261+
./ov-cli asr --model ./Qwen3-ASR-0.6B-ov
256262

257263
# 单次(输出完自动退出)
258-
./ov-cli generate --model ./FLUX/ov-int4 --mode once --prompt "cat" -o cat.png
259-
./ov-cli generate --model ./FLUX/ov-int4 --mode once --prompt "cat" --json # JSON 格式输出
264+
./ov-cli asr --model ./Qwen3-ASR-0.6B-ov --mode once --file speech.mp3
265+
./ov-cli asr --model ./Qwen3-ASR-0.6B-ov --mode once --file speech.mp3 --json
260266
```
261267

262-
**TTS CustomVoice**(预设声音,无需参考音频,仅支持单次)
268+
**Whisper**
263269

264270
```bash
265-
# 列出可用声音 → 用 --speaker 指定
266-
./ov-cli generate --model ./0.6B-CV-ov --prompt "今天天气真好" --speaker Vivian
267-
./ov-cli generate --model ./0.6B-CV-ov --prompt "Hello" --speaker vivian --lang english
268-
./ov-cli generate --model ./0.6B-CV-ov --prompt "你好" --speaker Vivian --instruct "温柔地" -o voice.wav
271+
./ov-cli asr --model ./whisper/ov-large
272+
./ov-cli asr --model ./whisper/ov-large --mode once --file speech.mp3
269273
```
270274

271-
**TTS Base(声音克隆)**(需要参考音频,仅支持单次):
275+
> Qwen3-ASR 基于语义理解自动添加标点,Whisper 依赖音频停顿加标点。TTS 生成的匀速音频在 Whisper 下可能缺少标点。
276+
TTS(文字转语音)生成的音频语速均匀、缺少自然停顿,转录结果可能不含句号逗号等标点,属正常现象。
277+
278+
### `image` — 文生图
279+
280+
使用 OpenVINO GenAI Text2ImagePipeline 生成图片,支持交互式和单次。
272281

273282
```bash
274-
./ov-cli generate --model ./0.6B-ov --prompt "你好" --ref-audio ref.mp3 -o voice.wav
275-
./ov-cli generate --model ./0.6B-ov --prompt "Hello" --ref-audio ref.mp3 --lang english
283+
# 交互式(多轮生图)
284+
./ov-cli image --model ./FLUX/ov-int4
285+
286+
# 单次(输出完自动退出)
287+
./ov-cli image --model ./FLUX/ov-int4 --mode once --prompt "cat" -o cat.png
288+
./ov-cli image --model ./FLUX/ov-int4 --mode once --prompt "cat" --json # JSON 格式输出
276289
```
277290

278291
**终端内命令**(仅文生图交互模式):
@@ -297,26 +310,26 @@ ov-cli 支持通过 `--mode once` 和 `--json` 被其他项目调用,日志走
297310
| 命令 | once 模式 | `--json` | stdout 输出 |
298311
|:----|:---------:|:--------:|:------------|
299312
| `chat` | `--mode once --prompt TEXT [--file ...]` || 回复文本 / `{"text":"...","time":n}` |
300-
| `whisper` | `--mode once --file audio.mp3` || 转录文本 / `{"text":"...","time":n,"duration":n}` |
301-
| `generate (img)` | `--mode once --prompt "cat" [-o output.png]` || 图片路径 / `{"path":"...","time":n}` |
302-
| `generate (tts)` | `--prompt TEXT (--mode once 可省略)` || 音频路径 / `{"path":"...","time":n,"duration":n}` |
313+
| `asr` | `--mode once --file audio.mp3` || 转录文本 / `{"text":"...","time":n,"duration":n}` |
314+
| `image` | `--mode once --prompt "cat" [-o output.png]` || 图片路径 / `{"path":"...","time":n}` |
315+
| `tts` | `--prompt TEXT` || 音频路径 / `{"path":"...","time":n,"duration":n}` |
303316

304317
### 推荐方式
305318

306319
```bash
307320
# Shell 脚本:捕获纯文本结果
308-
text=$(/path/to/ov-cli whisper -m ./model --mode once -f speech.mp3 2>/dev/null)
321+
text=$(/path/to/ov-cli asr -m ./model --mode once -f speech.mp3 2>/dev/null)
309322

310323
# Shell 脚本:捕获 JSON
311-
json=$(/path/to/ov-cli whisper -m ./model --mode once -f speech.mp3 --json 2>/dev/null)
324+
json=$(/path/to/ov-cli asr -m ./model --mode once -f speech.mp3 --json 2>/dev/null)
312325
```
313326

314327
```python
315328
# Python 子进程调用
316329
import subprocess, json
317330

318331
result = subprocess.run([
319-
"/path/to/ov-cli", "whisper",
332+
"/path/to/ov-cli", "asr",
320333
"--model", "./model",
321334
"--mode", "once",
322335
"--file", "speech.mp3",
@@ -388,15 +401,27 @@ if result.returncode == 0:
388401

389402
```bash
390403
# CustomVoice — 预设声音
391-
ov-cli generate --model ./0.6B-CV-ov --prompt "你好" --speaker Vivian
404+
ov-cli tts --model ./0.6B-CV-ov --prompt "你好" --speaker Vivian
392405

393406
# Base — 声音克隆(需参考音频)
394-
ov-cli generate --model ./0.6B-ov --prompt "你好" --ref-audio ref.mp3
407+
ov-cli tts --model ./0.6B-ov --prompt "你好" --ref-audio ref.mp3
395408
```
396409

397-
#### ASR — Whisper(语音转文字)
410+
#### ASR(语音转文字)
411+
412+
支持两种方案,**推荐 Qwen3-ASR**(自动加标点、语种识别)。
413+
414+
| 方案 | 类型 | 特点 |
415+
|:----|:----|:-----|
416+
| **Qwen3-ASR**| 自定义 OV | 语义加标点 / 52 种语言方言 / 语种识别 |
417+
| **Whisper** | GenAI Pipeline | 轻量,交互式流畅 |
418+
419+
**Qwen3-ASR** 转换:
420+
```bash
421+
ov-cli convert --model ./Qwen3-ASR-0.6B --output ./Qwen3-ASR-0.6B-ov
422+
```
398423

399-
Whisper 请下载官方预转换模型:
424+
**Whisper** 请下载官方预转换模型:
400425
- [HuggingFace Speech-to-Text 合集](https://huggingface.co/collections/OpenVINO/speech-to-text)
401426
- [ModelScope Speech-to-Text 合集](https://www.modelscope.cn/collections/Speech-to-Text-b9ab5c24c32649)
402427

@@ -455,7 +480,9 @@ ov-cli/
455480
│ ├── cli.py # CLI 参数解析 + 命令分发 + setup
456481
│ ├── chat.py # 聊天/翻译终端(GenAI + Optimum)
457482
│ ├── convert.py # 模型转换(7 种量化)
458-
│ ├── generate.py # 文生图 / TTS 语音合成终端
483+
│ ├── image.py # 文生图终端
484+
│ ├── tts.py # TTS 语音合成终端
485+
│ ├── asr.py # 语音转文字终端
459486
│ ├── server.py # FastAPI OpenAI 兼容服务
460487
│ └── benchmark.py # 性能测试
461488

README_EN.md

Lines changed: 47 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,13 @@ eval "$(./ov-cli venv)"
2929
# 3. Chat terminal
3030
./ov-cli chat --model ./Qwen3/2B-ov
3131

32-
# 4. Generate (Image / TTS)
33-
./ov-cli generate --model ./FLUX/ov-int4
34-
./ov-cli generate --model ./0.6B-CV-ov --prompt Hello --speaker vivian
32+
# 4. Image Generation
33+
./ov-cli image --model ./FLUX/ov-int4
3534

36-
# 5. API server
35+
# 5. TTS
36+
./ov-cli tts --model ./0.6B-CV-ov --prompt Hello --speaker vivian
37+
38+
# 6. API server
3739
./ov-cli server --model ./Qwen3/2B-ov
3840
```
3941

@@ -225,32 +227,17 @@ EOF
225227
./ov-cli benchmark --model ./Qwen3.6/35B-A3B-ov --reasoning off
226228
```
227229

228-
### `generate` — Text-to-Image / TTS
229-
230-
Auto-detects model type (Text2Image / TTS CustomVoice / TTS Base).
230+
### `image` — Text-to-Image
231231

232-
**Text-to-Image** (via OpenVINO GenAI Text2ImagePipeline, supports interactive/single):
232+
Text-to-image via OpenVINO GenAI Text2ImagePipeline. Supports interactive and single modes.
233233

234234
```bash
235235
# Interactive (multi-turn)
236-
./ov-cli generate --model ./FLUX/ov-int4
236+
./ov-cli image --model ./FLUX/ov-int4
237237

238238
# Single mode (auto-exit)
239-
./ov-cli generate --model ./FLUX/ov-int4 --mode once --prompt "cat" -o cat.png
240-
./ov-cli generate --model ./FLUX/ov-int4 --mode once --prompt "cat" --json
241-
```
242-
243-
**TTS CustomVoice** (preset speakers, no reference audio needed, once mode only):
244-
245-
```bash
246-
./ov-cli generate --model ./0.6B-CV-ov --prompt "Hello" --speaker vivian
247-
./ov-cli generate --model ./0.6B-CV-ov --prompt "你好" --speaker Vivian --instruct "gently" -o voice.wav
248-
```
249-
250-
**TTS Base (Voice Clone)** (requires reference audio, once mode only):
251-
252-
```bash
253-
./ov-cli generate --model ./0.6B-ov --prompt "Hello" --ref-audio ref.mp3
239+
./ov-cli image --model ./FLUX/ov-int4 --mode once --prompt "cat" -o cat.png
240+
./ov-cli image --model ./FLUX/ov-int4 --mode once --prompt "cat" --json
254241
```
255242

256243
**In-chat commands** (interactive mode only, Text2Image):
@@ -266,20 +253,29 @@ Auto-detects model type (Text2Image / TTS CustomVoice / TTS Base).
266253
| `/help` | Help |
267254
| `/exit` | Exit |
268255

269-
### `whisper` — Speech-to-Text
256+
### `asr` — Speech-to-Text
270257

271-
Transcribe audio via OpenVINO GenAI WhisperPipeline. Supports interactive and single modes.
258+
Auto-detects Whisper / Qwen3-ASR. **Qwen3-ASR recommended** (automatic punctuation, language identification, 52 languages/dialects).
259+
260+
**Qwen3-ASR** (recommended):
272261

273262
```bash
274263
# Interactive
275-
./ov-cli whisper --model ./whisper/ov-large
264+
./ov-cli asr --model ./Qwen3-ASR-0.6B-ov
265+
266+
# Single mode
267+
./ov-cli asr --model ./Qwen3-ASR-0.6B-ov --mode once --file speech.mp3
268+
./ov-cli asr --model ./Qwen3-ASR-0.6B-ov --mode once --file speech.mp3 --json
269+
```
276270

277-
# Single mode (auto-exit after output)
278-
./ov-cli whisper --model ./whisper/ov-large --mode once --file speech.mp3 -o output.txt
279-
./ov-cli whisper --model ./whisper/ov-large --mode once --file speech.mp3 --json # JSON output
271+
**Whisper**:
272+
273+
```bash
274+
./ov-cli asr --model ./whisper/ov-large
275+
./ov-cli asr --model ./whisper/ov-large --mode once --file speech.mp3
280276
```
281277

282-
**Note:** Whisper adds punctuation based on audio pauses and intonation.
278+
> Qwen3-ASR adds punctuation based on semantic understanding. Whisper relies on audio pauses. TTS-generated audio may lack punctuation with Whisper.
283279
TTS-generated audio has even pacing without natural pauses, so transcriptions may lack punctuation — this is expected behavior.
284280

285281
## External Integration
@@ -291,26 +287,26 @@ ov-cli can be called from other projects via `--mode once` and `--json`. Logs go
291287
| Command | once mode | `--json` | stdout output |
292288
|:--------|:---------:|:--------:|:--------------|
293289
| `chat` | `--mode once --prompt TEXT [--file ...]` || reply text / `{"text":"...","time":n}` |
294-
| `whisper` | `--mode once --file audio.mp3` || transcription / `{"text":"...","time":n,"duration":n}` |
295-
| `generate (img)` | `--mode once --prompt "cat" [-o output.png]` || image path / `{"path":"...","time":n}` |
296-
| `generate (tts)` | `--prompt TEXT (--mode once optional)` || audio path / `{"path":"...","time":n,"duration":n}` |
290+
| `asr` | `--mode once --file audio.mp3` || transcription / `{"text":"...","time":n,"duration":n}` |
291+
| `image` | `--mode once --prompt "cat" [-o output.png]` || image path / `{"path":"...","time":n}` |
292+
| `tts` | `--prompt TEXT` || audio path / `{"path":"...","time":n,"duration":n}` |
297293

298294
### Recommended Usage
299295

300296
```bash
301297
# Shell: capture plain text
302-
text=$(/path/to/ov-cli whisper -m ./model --mode once -f speech.mp3 2>/dev/null)
298+
text=$(/path/to/ov-cli asr -m ./model --mode once -f speech.mp3 2>/dev/null)
303299

304300
# Shell: capture JSON
305-
json=$(/path/to/ov-cli whisper -m ./model --mode once -f speech.mp3 --json 2>/dev/null)
301+
json=$(/path/to/ov-cli asr -m ./model --mode once -f speech.mp3 --json 2>/dev/null)
306302
```
307303

308304
```python
309305
# Python subprocess
310306
import subprocess, json
311307

312308
result = subprocess.run([
313-
"/path/to/ov-cli", "whisper",
309+
"/path/to/ov-cli", "asr",
314310
"--model", "./model",
315311
"--mode", "once",
316312
"--file", "speech.mp3",
@@ -386,9 +382,21 @@ ov-cli generate --model ./0.6B-CV-ov --prompt "Hello" --speaker vivian
386382
ov-cli generate --model ./0.6B-ov --prompt "Hello" --ref-audio ref.mp3
387383
```
388384

389-
#### ASR — Whisper (Speech-to-Text)
385+
#### ASR (Speech-to-Text)
386+
387+
Two options. **Qwen3-ASR recommended** (automatic punctuation, language identification).
388+
389+
| Option | Type | Features |
390+
|:------|:----|:---------|
391+
| **Qwen3-ASR**| Custom OV | Semantic punctuation / 52 languages / LID |
392+
| **Whisper** | GenAI Pipeline | Lightweight, smooth interactive |
393+
394+
**Qwen3-ASR** conversion:
395+
```bash
396+
ov-cli convert --model ./Qwen3-ASR-0.6B --output ./Qwen3-ASR-0.6B-ov
397+
```
390398

391-
Download official pre-converted models:
399+
**Whisper**: Download official pre-converted models:
392400
- [HuggingFace Speech-to-Text Collection](https://huggingface.co/collections/OpenVINO/speech-to-text)
393401
- [ModelScope Speech-to-Text Collection](https://www.modelscope.cn/collections/Speech-to-Text-b9ab5c24c32649)
394402

0 commit comments

Comments
 (0)