Skip to content

Commit 8b52915

Browse files
author
Amigor
committed
docs: 补充 pipe 管道模式文档
1 parent cc56c0f commit 8b52915

2 files changed

Lines changed: 93 additions & 13 deletions

File tree

README.md

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ eval "$(./ov-cli venv)"
3939

4040
# 8. MCP 协议
4141
./ov-cli mcp --model ./Qwen3/2B-ov
42+
43+
# 9. 管道模式(批量/外部调用)
44+
printf '你好\n再见' | ./ov-cli chat --model ./model-ov --mode pipe
4245
```
4346

4447
## 如何升级
@@ -151,6 +154,9 @@ eval "$(./ov-cli venv --venv ./my-venv)"
151154
./ov-cli chat --model ./model-ov --mode once --prompt "Hello"
152155
./ov-cli chat --model ./model-ov --mode once --file ./doc.pdf --prompt "总结" --output ./outputs/
153156
./ov-cli chat --model ./model-ov --mode once --prompt "Hello" --json # JSON 格式输出
157+
158+
# 管道模式(模型常驻,批量处理)
159+
printf '问题1\n问题2\n' | ./ov-cli chat --model ./model-ov --mode pipe
154160
```
155161

156162
**终端内命令**(仅 chat 模式):
@@ -299,6 +305,9 @@ EOF
299305
./ov-cli tts --model ./0.6B-CV-ov --prompt "你好" --speaker Vivian --instruct "温柔地" -o voice.wav
300306
```
301307

308+
# 管道模式(模型常驻,批量合成)
309+
printf '你好\n再见\n' | ./ov-cli tts --model ./0.6B-CV-ov --mode pipe --speaker Vivian
310+
302311
**Base(声音克隆)**(需参考音频):
303312

304313
```bash
@@ -319,6 +328,9 @@ EOF
319328
# 单次(输出完自动退出)
320329
./ov-cli asr --model ./Qwen3-ASR-0.6B-ov --mode once --file speech.mp3
321330
./ov-cli asr --model ./Qwen3-ASR-0.6B-ov --mode once --file speech.mp3 --json
331+
332+
# 管道模式(模型常驻,批量转录)
333+
printf '/path/to/a.wav\n/path/to/b.wav\n' | ./ov-cli asr --model ./Qwen3-ASR-0.6B-ov --mode pipe
322334
```
323335

324336
**Whisper**
@@ -342,6 +354,9 @@ TTS(文字转语音)生成的音频语速均匀、缺少自然停顿,转
342354
# 单次(输出完自动退出)
343355
./ov-cli image --model ./FLUX/ov-int4 --mode once --prompt "cat" -o cat.png
344356
./ov-cli image --model ./FLUX/ov-int4 --mode once --prompt "cat" --json # JSON 格式输出
357+
358+
# 管道模式(模型常驻,批量生图)
359+
printf 'a cat\na dog\n' | ./ov-cli image --model ./FLUX/ov-int4 --mode pipe
345360
```
346361

347362
**终端内命令**(仅文生图交互模式):
@@ -359,9 +374,11 @@ TTS(文字转语音)生成的音频语速均匀、缺少自然停顿,转
359374

360375
## 外部集成
361376

362-
ov-cli 支持通过 `--mode once``--json` 被其他项目调用,日志走 stderr,stdout 只输出纯净结果。
377+
ov-cli 支持两种外部调用方式:`--mode once`(单次)和 `--mode pipe`(管道)。
378+
379+
### 方式一:`--mode once` — 单次推理
363380

364-
### 支持外部调用的命令
381+
每次调用独立加载模型,适合低频使用。日志走 stderr,stdout 只输出纯净结果。
365382

366383
| 命令 | once 模式 | `--json` | stdout 输出 |
367384
|:----|:---------:|:--------:|:------------|
@@ -370,7 +387,30 @@ ov-cli 支持通过 `--mode once` 和 `--json` 被其他项目调用,日志走
370387
| `image` | `--mode once --prompt "cat" [-o output.png]` || 图片路径 / `{"path":"...","time":n}` |
371388
| `tts` | `--prompt TEXT` || 音频路径 / `{"path":"...","time":n,"duration":n}` |
372389

373-
### 推荐方式
390+
### 方式二:`--mode pipe` — 管道模式(推荐)
391+
392+
模型常驻内存,stdin 输入、stdout 输出 JSON,适合高频批量调用。
393+
394+
```bash
395+
# ASR 批量转录
396+
printf '/path/to/a.wav\n/path/to/b.wav\n' | ov-cli asr --model ./model --mode pipe
397+
# → {"text":"...","time":0.5}
398+
# → {"text":"...","time":0.4}
399+
400+
# TTS 批量合成
401+
printf '你好\n再见\n' | ov-cli tts --model ./model --mode pipe --speaker Vivian
402+
# → {"path":"outputs/pipe_1.wav","text":"你好","time":2.1}
403+
404+
# Chat 批量问答
405+
printf '1+1=?\n什么是Python?\n' | ov-cli chat --model ./model --mode pipe
406+
# → {"text":"1+1=2","time":3.2}
407+
408+
# Image 批量生图
409+
printf 'a cat\na dog\n' | ov-cli image --model ./FLUX-ov --mode pipe
410+
# → {"path":"outputs/pipe_cat.png","time":10.2}
411+
```
412+
413+
### Python 调用示例
374414

375415
```bash
376416
# Shell 脚本:捕获纯文本结果
@@ -381,7 +421,7 @@ json=$(/path/to/ov-cli asr -m ./model --mode once -f speech.mp3 --json 2>/dev/nu
381421
```
382422

383423
```python
384-
# Python 子进程调用
424+
# Python 子进程调用(--mode once 单次)
385425
import subprocess, json
386426

387427
result = subprocess.run([
@@ -395,6 +435,18 @@ result = subprocess.run([
395435
if result.returncode == 0:
396436
data = json.loads(result.stdout)
397437
print(data["text"]) # 转录结果
438+
439+
# Python 子进程调用(--mode pipe 常驻)
440+
proc = subprocess.Popen(
441+
["/path/to/ov-cli", "asr", "--model", "./model", "--mode", "pipe"],
442+
stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True
443+
)
444+
for audio in ["a.wav", "b.wav"]:
445+
proc.stdin.write(audio + "\n")
446+
proc.stdin.flush()
447+
data = json.loads(proc.stdout.readline())
448+
print(data["text"]) # 每次 ~0.5s
449+
proc.stdin.close()
398450
```
399451

400452
> 💡 `2>/dev/null` 可省略日志,只保留 stdout 的结果。不加则终端同时显示日志和结果。

README_EN.md

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -355,9 +355,11 @@ TTS-generated audio has even pacing without natural pauses, so transcriptions ma
355355

356356
## External Integration
357357

358-
ov-cli can be called from other projects via `--mode once` and `--json`. Logs go to stderr, stdout contains only the clean result.
358+
ov-cli supports two external calling modes: `--mode once` (single-shot) and `--mode pipe` (pipeline).
359359

360-
### Commands Supporting External Calls
360+
### Way 1: `--mode once` — Single-shot
361+
362+
Each call loads the model independently. Logs go to stderr, stdout contains only the clean result.
361363

362364
| Command | once mode | `--json` | stdout output |
363365
|:--------|:---------:|:--------:|:--------------|
@@ -366,18 +368,32 @@ ov-cli can be called from other projects via `--mode once` and `--json`. Logs go
366368
| `image` | `--mode once --prompt "cat" [-o output.png]` || image path / `{"path":"...","time":n}` |
367369
| `tts` | `--prompt TEXT` || audio path / `{"path":"...","time":n,"duration":n}` |
368370

369-
### Recommended Usage
371+
### Way 2: `--mode pipe` — Pipeline (recommended)
372+
373+
Model stays in memory. Read input from stdin, write JSON to stdout. Ideal for high-frequency batch calls.
370374

371375
```bash
372-
# Shell: capture plain text
373-
text=$(/path/to/ov-cli asr -m ./model --mode once -f speech.mp3 2>/dev/null)
376+
# ASR batch transcription
377+
printf '/path/to/a.wav\n/path/to/b.wav\n' | ov-cli asr --model ./model --mode pipe
378+
# → {"text":"...","time":0.5}
379+
380+
# TTS batch synthesis
381+
printf 'Hello\nHi\n' | ov-cli tts --model ./model --mode pipe --speaker Vivian
382+
# → {"path":"outputs/pipe_1.wav","text":"Hello","time":2.1}
374383

375-
# Shell: capture JSON
376-
json=$(/path/to/ov-cli asr -m ./model --mode once -f speech.mp3 --json 2>/dev/null)
384+
# Chat batch Q&A
385+
printf 'What is AI?\nTell me a joke\n' | ov-cli chat --model ./model --mode pipe
386+
# → {"text":"AI stands for...","time":3.2}
387+
388+
# Image batch generation
389+
printf 'a cat\na dog\n' | ov-cli image --model ./FLUX-ov --mode pipe
390+
# → {"path":"outputs/pipe_cat.png","time":10.2}
377391
```
378392

393+
### Python Examples
394+
379395
```python
380-
# Python subprocess
396+
# Subprocess: --mode once (single call)
381397
import subprocess, json
382398

383399
result = subprocess.run([
@@ -390,7 +406,19 @@ result = subprocess.run([
390406

391407
if result.returncode == 0:
392408
data = json.loads(result.stdout)
393-
print(data["text"]) # transcription result
409+
print(data["text"]) # transcription
410+
411+
# Subprocess: --mode pipe (persistent)
412+
proc = subprocess.Popen(
413+
["/path/to/ov-cli", "asr", "--model", "./model", "--mode", "pipe"],
414+
stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True
415+
)
416+
for audio in ["a.wav", "b.wav"]:
417+
proc.stdin.write(audio + "\n")
418+
proc.stdin.flush()
419+
data = json.loads(proc.stdout.readline())
420+
print(data["text"]) # ~0.5s each
421+
proc.stdin.close()
394422
```
395423

396424
> 💡 Use `2>/dev/null` to suppress logs and keep only stdout. Without it, both logs and results show in terminal.

0 commit comments

Comments
 (0)