File size: 3,897 Bytes
a37072b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# ZipVoice C++ Resident Server

ZipVoice distill TTS 的 C++ 常驻服务及 C API 动态库实现。

本目录包含从 ZipVoice.AXERA 命令行版本提取的推理核心源码,
用于编译常驻 daemon(`zipvoice_axera_server`)和 C API 动态库
(`libzipvoice_axera.so`),供 Python 通过 ctypes 单层常驻调用。

## 文件说明

| 文件 | 说明 |
|------|------|
| `main.cpp` | daemon 入口,stdin/stdout JSON 协议(调试用) |
| `zipvoice_resident_server.hpp/cpp` | 常驻服务核心实现 |
| `zipvoice_c_api.h/cpp` | C API 接口,供 Python ctypes 调用 |
| `CMakeLists.txt` | CMake 构建配置 |

## 依赖

### 1. AX650 BSP SDK

```bash
git clone https://github.com/AXERA-TECH/ax650n_bsp_sdk.git
```

克隆后 `msp/out/` 包含所需的头文件和库文件:

- `libax_sys.so`
- `libax_engine.so`
- `libax_interpreter.so`

### 2. ARM 交叉编译工具链

下载地址:

```text
https://developer.arm.com/-/media/Files/downloads/gnu-a/9.2-2019.12/binrel/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz
```

```bash
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/9.2-2019.12/binrel/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz
tar xf gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz
```

### 3. ZipVoice 推理核心源码

CMakeLists.txt 中引用的 `src/``third_party/``utils/` 等源文件位于:

```text
<项目根>/models/zipvoice/cpp/
├── src/tokenizer.cpp / .hpp
├── src/fbank.cpp / .hpp
├── src/zipvoice_engine.cpp / .hpp
├── src/vocoder.cpp / .hpp
├── src/EngineWrapper.cpp / .hpp
├── src/cmdline.hpp
├── third_party/kissfft/kiss_fft.c / .h
├── utils/checker.h / io.hpp / logger.h
└── toolchains/aarch64-none-linux-gnu.toolchain.cmake
```

这些文件随 ZipVoice.AXERA 模型包一起发布,下载模型后自动位于:

```text
models/zipvoice/
├── zipvoice_distill_ax650/   (模型文件)
├── cpp/                      (推理核心源码,即上述目录)
├── resources/
├── assets/
└── scripts/
```

无需单独下载或从其他工程复制。

### 4. onnxruntime (aarch64)

交叉编译时需要 aarch64 版本的 `libonnxruntime.so`,可从以下位置获取:
- sherpa-onnx 预编译包(如 MeloTTS 或 Kokoro 的 `build/lib/` 目录)
- 或从 [onnxruntime releases](https://github.com/microsoft/onnxruntime/releases) 下载

编译时 CMakeLists.txt 已配置从 `<项目根>/models/melotts_sherpa/build/lib/` 查找。

### 5. ZipVoice AX650 distill 模型文件

从 HuggingFace 下载 ZipVoice.AXERA 到 `models/zipvoice/````text
https://huggingface.co/AXERA-TECH/ZipVoice.AXERA
```

模型目录结构:

```text
models/zipvoice/zipvoice_distill_ax650/
├── encoder.axmodel
├── decoder_part0.axmodel
├── decoder_part1.axmodel
├── decoder_part2.axmodel
├── decoder_part3.axmodel
├── decoder4_split_manifest.json
└── runtime_config.json
```

## 编译


```bash
BSP_MSP_DIR=/path/to/ax650n_bsp_sdk/msp/out \
TOOLCHAIN_DIR=/path/to/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu \
bash build_ax650.sh
```

编译产物:

- `build/libzipvoice_axera.so` — C API 动态库(供 `zipvoice_tts_ctypes.py` 调用)
- `build/zipvoice_axera_server` — 常驻 daemon(调试用)

## 与 Python 服务的关系

生产环境使用 `zipvoice_tts_ctypes.py`(Python 单层常驻 HTTP 服务),
通过 ctypes 直接加载 `libzipvoice_axera.so`,模型常驻在当前进程内:

```text
zipvoice_tts_ctypes.py
  → ctypes.CDLL("libzipvoice_axera.so")
  → zipvoice_create(...)        # 初始化模型
  → zipvoice_cache_prompt(...)  # 加载自定义 prompt
  → zipvoice_infer(...)         # 推理
  → zipvoice_destroy(...)       # 销毁
```

不再经过 daemon stdin/stdout 文本协议,响应不会错位。