diff --git a/.gitattributes b/.gitattributes
index a6344aac8c09253b3b630fb776ae94478aa0275b..2005612af1303d479a1b2973b7de95543f5e4dc7 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -33,3 +33,57 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text
*tfevents* filter=lfs diff=lfs merge=lfs -text
+models/bigvgan.axmodel filter=lfs diff=lfs merge=lfs -text
+models/flowhigh.axmodel filter=lfs diff=lfs merge=lfs -text
+samples/listen/16k/speech_2_input_16k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/16k/speech_3_input_16k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/48k_from16k/speech_2_output_48k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/48k_from16k/speech_3_output_48k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/48k_from8k/OSR_cn_000_0072_output_48k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/48k_from8k/OSR_cn_000_0073_output_48k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/48k_from8k/OSR_cn_000_0074_output_48k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/48k_from8k/OSR_cn_000_0075_output_48k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/48k_from8k/OSR_us_000_0010_output_48k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/48k_from8k/OSR_us_000_0013_output_48k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/48k_from8k/OSR_us_000_0057_output_48k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/48k_from8k/OSR_us_000_0059_output_48k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/48k_from8k/samplelib_speech_1m_output_48k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/48k_from8k/speech_2_output_48k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/48k_from8k/speech_3_output_48k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/8k/OSR_cn_000_0072_input_8k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/8k/OSR_cn_000_0073_input_8k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/8k/OSR_cn_000_0074_input_8k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/8k/OSR_cn_000_0075_input_8k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/8k/OSR_us_000_0010_input_8k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/8k/OSR_us_000_0013_input_8k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/8k/OSR_us_000_0057_input_8k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/8k/OSR_us_000_0059_input_8k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/8k/samplelib_speech_1m_input_8k.wav filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/OSR_cn_000_0072_input_8k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/OSR_cn_000_0072_output_48k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/OSR_cn_000_0073_input_8k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/OSR_cn_000_0073_output_48k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/OSR_cn_000_0074_input_8k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/OSR_cn_000_0074_output_48k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/OSR_cn_000_0075_input_8k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/OSR_cn_000_0075_output_48k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/OSR_us_000_0010_input_8k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/OSR_us_000_0010_output_48k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/OSR_us_000_0013_input_8k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/OSR_us_000_0013_output_48k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/OSR_us_000_0057_input_8k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/OSR_us_000_0057_output_48k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/OSR_us_000_0059_input_8k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/OSR_us_000_0059_output_48k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/samplelib_speech_1m_input_8k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/samplelib_speech_1m_output_48k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/speech_2_input_16k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/speech_2_input_8k.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/speech_2_input_8k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/speech_2_output_16k_48k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/speech_2_output_8k_48k.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/speech_2_output_8k_48k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/speech_3_input_16k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/speech_3_input_8k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/speech_3_output_16k_48k_spec.png filter=lfs diff=lfs merge=lfs -text
+samples/listen/spectrograms/speech_3_output_8k_48k_spec.png filter=lfs diff=lfs merge=lfs -text
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..e81421007a6cdb03189d775ab1d2af7830a3c35b
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Jun-Hak Yun
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..0e1112b399e8c415f931d1767d046368c867f812
--- /dev/null
+++ b/README.md
@@ -0,0 +1,145 @@
+---
+library_name: axera
+pipeline_tag: audio-to-audio
+base_model: kiriyamaX/FLowHigh_indep_adaptive_400k
+language:
+- en
+- zh
+tags:
+- axera
+- ax650
+- npu3
+- flowhigh
+- speech-super-resolution
+- audio-super-resolution
+- bandwidth-extension
+- real-time
+- python
+---
+
+# FlowHigh.AXERA
+
+**8/16 kHz 语音 → 48 kHz 超分 · AX650 NPU3 · Python RTF 0.24(20–60 s 音频)· 2 个 axmodel 共 58 MB · 不做降噪**
+
+  [](https://github.com/ZY-2012/FlowHigh.AXERA)
+
+- GitHub: https://github.com/ZY-2012/FlowHigh.AXERA
+- 上游: https://github.com/jjunak-yun/FLowHigh_code
+
+## 目录
+
+- 快速开始
+- 结果
+- 推理速度
+- 数据来源
+- License
+
+## 快速开始(AX650 板端)
+
+从 HuggingFace 下载 `models/`、`assets/`、`python/`、`samples/`,在包根目录运行:
+
+```bash
+bash run_ax650.sh samples/listen/8k/OSR_us_000_0010_input_8k.wav output.wav
+```
+
+输入支持 8 kHz / 16 kHz,输出固定 48 kHz。默认 1-step flow、`std=1e-4`;不做降噪。
+
+## 结果
+
+### 8 kHz 输入(Open Speech / Samplelib)
+
+#### English
+
+**OSR_us_000_0010**
+
+| 版本 | 输入 | FlowHigh 输出 |
+|---|---|---|
+| 8k |
|
|
+
+**OSR_us_000_0013**
+
+| 版本 | 输入 | FlowHigh 输出 |
+|---|---|---|
+| 8k |
|
|
+
+**OSR_us_000_0057**
+
+| 版本 | 输入 | FlowHigh 输出 |
+|---|---|---|
+| 8k |
|
|
+
+**OSR_us_000_0059**
+
+| 版本 | 输入 | FlowHigh 输出 |
+|---|---|---|
+| 8k |
|
|
+
+#### Chinese
+
+**OSR_cn_000_0072**
+
+| 版本 | 输入 | FlowHigh 输出 |
+|---|---|---|
+| 8k |
|
|
+
+**OSR_cn_000_0073**
+
+| 版本 | 输入 | FlowHigh 输出 |
+|---|---|---|
+| 8k |
|
|
+
+**OSR_cn_000_0074**
+
+| 版本 | 输入 | FlowHigh 输出 |
+|---|---|---|
+| 8k |
|
|
+
+**OSR_cn_000_0075**
+
+| 版本 | 输入 | FlowHigh 输出 |
+|---|---|---|
+| 8k |
|
|
+
+#### Samplelib(1 分钟,频谱图为前 10 s)
+
+**samplelib_speech_1m**
+
+| 版本 | 输入 | FlowHigh 输出 |
+|---|---|---|
+| 8k |
|
|
+
+### 16 kHz 参照(人声)
+
+同一批人声降采样到 16 kHz 后输入;8k 行为 8 kHz 输入,16k 行为 16 kHz 输入。
+
+**speech_2**
+
+| 版本 | 输入 | FlowHigh 输出 |
+|---|---|---|
+| 8k |
|
|
+| 16k |
|
|
+
+**speech_3**
+
+| 版本 | 输入 | FlowHigh 输出 |
+|---|---|---|
+| 8k |
|
|
+| 16k |
|
|
+
+## 推理速度:RTF
+
+| 链路 | Python RTF |
+|---|---:|
+| 8/16 kHz → 48 kHz | **0.24** |
+
+20–60 s 音频,1-step flow,BigVGAN 1 s 分块、0.2 s overlap。5 s 短音频因分块/启动开销会略高;C++ 运行时尚未提供。
+
+## 数据来源
+
+- Open Speech Repository(English / Chinese 8k):http://voiptroubleshooter.com/open_speech/index.html
+- Samplelib speech 1m:https://samplelib.com/mp3/sample-speech-1m.mp3
+- 16 kHz 参照:公开人声样例经 48k->16k 降采样。
+
+## License
+
+MIT;FLowHigh 与 BigVGAN 均为 MIT。模型 checkpoint 来自上游/公开镜像,仓库不重复分发训练权重。
diff --git a/assets/time_emb_4.npy b/assets/time_emb_4.npy
new file mode 100644
index 0000000000000000000000000000000000000000..089e4af5aa80f5f5af2cfd926c3662bc4655e33d
--- /dev/null
+++ b/assets/time_emb_4.npy
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:06284a683d5610206adac80e4764a61f1d77d8cd4d172376513ad5c83d965f0f
+size 16512
diff --git a/config.json b/config.json
new file mode 100644
index 0000000000000000000000000000000000000000..9e26dfeeb6e641a33dae4961196235bdb965b21b
--- /dev/null
+++ b/config.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/models/bigvgan.axmodel b/models/bigvgan.axmodel
new file mode 100644
index 0000000000000000000000000000000000000000..8ed9462cb345a01175081e2b645e66b0ea033358
--- /dev/null
+++ b/models/bigvgan.axmodel
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4fb5f3a130ef732eea8ef9ac9f365e7bab95d34d176f5926f4a3d21db33306b5
+size 20734384
diff --git a/models/flowhigh.axmodel b/models/flowhigh.axmodel
new file mode 100644
index 0000000000000000000000000000000000000000..164a0e377a9520aa571318189422936ce307e27e
--- /dev/null
+++ b/models/flowhigh.axmodel
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5ed959fdc9632a961204eb3ea8872395102505db96d42730a8c0e1fb6189bd12
+size 38297185
diff --git a/python/demo_board.py b/python/demo_board.py
new file mode 100644
index 0000000000000000000000000000000000000000..855216f4a1e4411666aba3a7d4b2b6d33c388837
--- /dev/null
+++ b/python/demo_board.py
@@ -0,0 +1,107 @@
+import argparse
+import time
+from pathlib import Path
+
+import numpy as np
+import soundfile as sf
+
+from flowhigh_sdk import audio
+
+
+def decode_mel(voc, mel, chunk, overlap):
+ hop = chunk - overlap
+ wav = None
+ for s in range(0, mel.shape[-1], hop):
+ m = mel[..., s:s + chunk]
+ if m.shape[-1] < chunk:
+ m = np.pad(m, ((0, 0), (0, 0), (0, chunk - m.shape[-1])), mode="edge")
+ c = voc.run(None, {"mel": np.ascontiguousarray(m)})[0][0, 0]
+ if wav is None:
+ wav = c
+ else:
+ n = min(overlap * 480, len(wav), len(c))
+ if n > 0:
+ fade = np.linspace(0.0, 1.0, n, dtype=np.float32)
+ wav[-n:] = wav[-n:] * (1.0 - fade) + c[:n] * fade
+ wav = np.concatenate([wav, c[n:]])
+ return wav.astype(np.float32)
+
+
+def main():
+ p = argparse.ArgumentParser()
+ p.add_argument("--input", required=True)
+ p.add_argument("--output", required=True)
+ p.add_argument("--models", default="models")
+ p.add_argument("--steps", type=int, default=1)
+ p.add_argument("--std", type=float, default=1e-4)
+ p.add_argument("--seed", type=int, default=0)
+ p.add_argument("--chunk", type=int, default=100)
+ p.add_argument("--overlap", type=int, default=20)
+ p.add_argument("--flow-overlap", type=int, default=50)
+ p.add_argument("--time-emb", default="assets/time_emb_4.npy")
+ args = p.parse_args()
+
+ x, sr = sf.read(args.input, always_2d=False)
+ if x.ndim > 1:
+ x = x.mean(axis=1)
+ x = np.asarray(x, dtype=np.float32)
+ target = int(round(audio.SR / sr * x.size))
+ x = audio.resample(x, sr)
+ peak = float(np.max(np.abs(x)))
+ if peak > 0:
+ x = x / peak
+ cond_wave = x.astype(np.float32)
+ mel = audio.log_mel(cond_wave)[0].T[None]
+ frames = 500
+ if mel.shape[-1] < frames:
+ mel = np.pad(mel, ((0, 0), (0, 0), (0, frames - mel.shape[-1])), mode="edge")
+ total = mel.shape[-1]
+ if total > frames:
+ n_chunks = (total - frames + (frames - args.flow_overlap) - 1) // (frames - args.flow_overlap) + 1
+ padded = frames + (n_chunks - 1) * (frames - args.flow_overlap)
+ if padded > total:
+ mel = np.pad(mel, ((0, 0), (0, 0), (0, padded - total)), mode="edge")
+ padded_total = mel.shape[-1]
+
+ import axengine
+
+ flow = axengine.InferenceSession(str(Path(args.models) / "flowhigh.axmodel"))
+ voc = axengine.InferenceSession(str(Path(args.models) / "bigvgan.axmodel"))
+ emb = np.load(args.time_emb).astype(np.float32)
+ rng = np.random.RandomState(args.seed)
+ hop = frames - args.flow_overlap
+ starts = list(range(0, max(1, padded_total - frames + 1), hop))
+
+ t0 = time.time()
+ flow_ms = []
+ out = None
+ for s in starts:
+ c = mel[..., s:s + frames]
+ y = c + args.std * rng.randn(*c.shape).astype(np.float32)
+ for i in range(args.steps):
+ t1 = time.time()
+ v = flow.run(None, {
+ "x": np.ascontiguousarray(y),
+ "cond": np.ascontiguousarray(c),
+ "time_emb": np.ascontiguousarray(emb[i]),
+ })[0]
+ flow_ms.append((time.time() - t1) * 1000)
+ y = y + (1.0 / args.steps) * v
+ wav = decode_mel(voc, y, args.chunk, args.overlap)
+ if out is None:
+ out = wav
+ else:
+ n = min(args.flow_overlap * 480, len(out), len(wav))
+ if n > 0:
+ fade = np.linspace(0.0, 1.0, n, dtype=np.float32)
+ out[-n:] = out[-n:] * (1.0 - fade) + wav[:n] * fade
+ out = np.concatenate([out, wav[n:]])
+ out = out[:int(total * 480)]
+ out = audio.postprocess(out, cond_wave[:len(out)], len(out))[:target]
+ sf.write(args.output, out, audio.SR, subtype="PCM_16")
+ dt = time.time() - t0
+ print(f"chunks={len(starts)} flow_ms={flow_ms} total_ms={dt*1000:.1f} rtf={dt/(x.size/audio.SR):.4f}")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/python/flowhigh_sdk/__init__.py b/python/flowhigh_sdk/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/python/flowhigh_sdk/audio.py b/python/flowhigh_sdk/audio.py
new file mode 100644
index 0000000000000000000000000000000000000000..b7ff48beeb7afb04997355dd673675df772ecb93
--- /dev/null
+++ b/python/flowhigh_sdk/audio.py
@@ -0,0 +1,138 @@
+import numpy as np
+from math import gcd
+
+SR = 48000
+N_FFT = 2048
+HOP = 480
+N_MELS = 256
+FMIN = 20.0
+FMAX = 24000.0
+LOG_FLOOR = 1e-5
+MAG_EPS = 1e-9
+
+_MEL = None
+_WIN = None
+
+
+def _hz_to_mel(f):
+ f = np.asarray(f, dtype=np.float64)
+ f_sp, min_log_hz = 200.0 / 3.0, 1000.0
+ min_log_mel = min_log_hz / f_sp
+ logstep = np.log(6.4) / 27.0
+ mel = np.empty_like(f)
+ lin = f < min_log_hz
+ mel[lin] = f[lin] / f_sp
+ mel[~lin] = min_log_mel + np.log(f[~lin] / min_log_hz) / logstep
+ return mel
+
+
+def _mel_to_hz(m):
+ m = np.asarray(m, dtype=np.float64)
+ f_sp, min_log_hz = 200.0 / 3.0, 1000.0
+ min_log_mel = min_log_hz / f_sp
+ logstep = np.log(6.4) / 27.0
+ hz = np.empty_like(m)
+ lin = m < min_log_mel
+ hz[lin] = m[lin] * f_sp
+ hz[~lin] = min_log_hz * np.exp(logstep * (m[~lin] - min_log_mel))
+ return hz
+
+
+def mel_filterbank():
+ global _MEL
+ if _MEL is None:
+ freqs = np.linspace(0.0, SR / 2.0, N_FFT // 2 + 1)
+ edges = np.linspace(_hz_to_mel([FMIN])[0], _hz_to_mel([FMAX])[0], N_MELS + 2)
+ hz = _mel_to_hz(edges)
+ fb = np.zeros((N_MELS, freqs.shape[0]), dtype=np.float32)
+ for m in range(N_MELS):
+ left, center, right = hz[m], hz[m + 1], hz[m + 2]
+ up = (freqs - left) / (center - left)
+ down = (right - freqs) / (right - center)
+ fb[m] = np.maximum(0.0, np.minimum(up, down)) * (2.0 / max(1e-8, right - left))
+ _MEL = fb
+ return _MEL
+
+
+def hann():
+ global _WIN
+ if _WIN is None:
+ _WIN = np.hanning(N_FFT + 1)[:-1].astype(np.float64)
+ return _WIN
+
+
+def log_mel(audio):
+ x = np.asarray(audio, dtype=np.float64).reshape(-1)
+ pad = (N_FFT - HOP) // 2
+ x = np.pad(x, (pad, pad), mode="reflect")
+ frames = 1 + (x.size - N_FFT) // HOP
+ idx = np.arange(N_FFT)[None, :] + HOP * np.arange(frames)[:, None]
+ spec = np.fft.rfft(x[idx] * hann(), n=N_FFT, axis=1).T
+ mag = np.sqrt(spec.real ** 2 + spec.imag ** 2 + MAG_EPS)
+ mel = np.log(np.clip(mel_filterbank() @ mag, LOG_FLOOR, None))
+ return mel.T[None].astype(np.float32)
+
+
+def stft(x, center=True, pad_mode="constant"):
+ x = np.asarray(x, dtype=np.float64).reshape(-1)
+ if center:
+ p = N_FFT // 2
+ x = np.pad(x, (p, p), mode=pad_mode)
+ frames = 1 + (x.size - N_FFT) // HOP
+ idx = np.arange(N_FFT)[None, :] + HOP * np.arange(frames)[:, None]
+ return np.fft.rfft(x[idx] * hann(), n=N_FFT, axis=1).T
+
+
+def istft(spec, length=None, center=True):
+ spec = np.asarray(spec)
+ frames = np.fft.irfft(spec.T, n=N_FFT, axis=1) * hann()
+ out_len = N_FFT + HOP * (frames.shape[0] - 1)
+ ola = np.zeros(out_len, dtype=np.float64)
+ wsum = np.zeros(out_len, dtype=np.float64)
+ w2 = hann() ** 2
+ for i in range(frames.shape[0]):
+ s = i * HOP
+ ola[s:s + N_FFT] += frames[i]
+ wsum[s:s + N_FFT] += w2
+ ola /= np.where(wsum > 1e-11, wsum, 1.0)
+ if center:
+ ola = ola[N_FFT // 2:len(ola) - N_FFT // 2]
+ if length is not None:
+ if ola.size > length:
+ ola = ola[:length]
+ elif ola.size < length:
+ ola = np.pad(ola, (0, length - ola.size))
+ return ola.astype(np.float32)
+
+
+def cutoff_bin(spec):
+ energy = np.cumsum(np.abs(spec).sum(axis=-1))
+ if energy[-1] <= 0:
+ return 0
+ limit = energy[-1] * 0.99
+ below = np.nonzero(energy < limit)[0]
+ return int(below[-1]) + 1 if below.size else 0
+
+
+def postprocess(pred, src, length):
+ ps = stft(pred, center=True, pad_mode="constant")
+ ss = stft(src, center=True, pad_mode="constant")
+ n = min(ps.shape[-1], ss.shape[-1])
+ ps, ss = ps[:, :n], ss[:, :n]
+ cr = cutoff_bin(ss)
+ merged = ps.copy()
+ merged[:cr] = ss[:cr]
+ out = istft(merged, length=length, center=True)
+ peak = np.max(np.abs(out))
+ if peak > 0:
+ out = out / peak * 0.99
+ return out.astype(np.float32)
+
+
+def resample(x, sr_in, sr_out=SR):
+ x = np.asarray(x, dtype=np.float32).reshape(-1)
+ if sr_in == sr_out:
+ return x
+ g = gcd(int(sr_out), int(sr_in))
+ from scipy.signal import resample_poly
+ return resample_poly(x, sr_out // g, sr_in // g).astype(np.float32)
diff --git a/python/requirements.txt b/python/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e669475e752d10794f132a778c789fc714ad0924
--- /dev/null
+++ b/python/requirements.txt
@@ -0,0 +1,3 @@
+numpy
+scipy
+soundfile
diff --git a/reports/quantization.md b/reports/quantization.md
new file mode 100644
index 0000000000000000000000000000000000000000..83a58ec9bf51f760953637f9c2a95ba3d658b427
--- /dev/null
+++ b/reports/quantization.md
@@ -0,0 +1,67 @@
+# FlowHigh AX650 quantization report
+
+## Target
+
+- Board: AX650N, NPU3, axengine 2.12.0s, compiler 8.0.
+- Flow: U16 activations / S8 weights, 38 MB.
+- BigVGAN: U16 activations / S8 weights, 20 MB.
+- Input: 8 kHz / 16 kHz -> 48 kHz.
+- No denoising.
+
+## Graph split
+
+```text
+host: resample_poly -> log-mel [1,256,T] -> 1-step flow -> BigVGAN chunks -> STFT merge
+NPU: flow velocity (37 MB) + BigVGAN 1 s chunks (20 MB)
+```
+
+The flow NPU input is channel-first `[1,256,500]`; the wrapper transposes to `[1,500,256]` internally. This is required: Pulsar2 lowers 3D tensors channel-first, and feeding `[1,500,256]` directly makes attention run on the wrong axis.
+
+## Numerical checks
+
+| Check | Result |
+|---|---|
+| Flow ONNX vs PyTorch velocity | max err 1.5e-4 |
+| Flow U16/S8 on board vs ONNX | SNR 32.96 dB, corr 0.99977 |
+| Flow latency, 5 s | 21 ms (after warmup) |
+| BigVGAN ONNX vs PyTorch | max err 8.2e-6 |
+| BigVGAN U16/S8 on board vs ONNX, 1 s | SNR 20.55 dB, corr 0.99560 |
+| BigVGAN latency, 1 s | ~93 ms |
+| BigVGAN chunk overlap | 0.2 s; boundary jump reduced from 0.44 to 0.005 |
+
+BigVGAN is the sensitive part; its direct waveform SNR is low, but the final speech quality after spectral merging is close to the FP32 pipeline.
+
+## Full pipeline quality
+
+VCTK `p232_013`, 48 kHz reference. Board uses 1-step flow with `std=1e-4`, BigVGAN 1 s / 0.2 s overlap. Baseline and board use different RNG seeds, so the PESQ/LSD comparison is indicative; flow and BigVGAN SNR rows are strict same-input comparisons.
+
+| Input | Pipeline | PESQ-WB | STOI | Mel LSD |
+|---|---|---|---:|---:|
+| 8 kHz | PyTorch FP32 | 3.872 | 0.9981 | 2.323 |
+| 8 kHz | AX650 U16/S8 | **3.876** | **0.9982** | 2.333 |
+| 16 kHz | PyTorch FP32 | 4.570 | 1.0000 | 2.315 |
+| 16 kHz | AX650 U16/S8 | **4.573** | **1.0000** | 2.302 |
+
+## Speed
+
+5 s input, Python/axengine, one flow step:
+
+| Stage | Time |
+|---|---:|
+| Flow | 33 ms |
+| BigVGAN (6 x 1 s chunks) | 578 ms |
+| Host STFT/mel/postprocess | ~600 ms |
+| Total | 0.94–1.22 s |
+| RTF | 0.19–0.24 |
+
+The current runtime is Python-only. Moving STFT/postprocess to C++ and using a native flow/vocoder loop is the next optimization; the NPU portion itself is 0.61 s for 5 s.
+
+## Long audio
+
+The flow graph is fixed at 500 mel frames (5 s). Longer audio is processed in 5 s chunks with 0.5 s overlap and waveform crossfade; BigVGAN uses 1 s chunks with 0.2 s overlap. The 60 s Samplelib input was processed end-to-end with no boundary clicks above the normal waveform derivative.
+
+## Limitations
+
+- The 5 s flow chunk is a hard graph size; longer context would need a different compiled graph.
+- No denoising; FLowHigh is BWE only.
+- C++ runtime is not included in this first quantization milestone.
diff --git a/run_ax650.sh b/run_ax650.sh
new file mode 100644
index 0000000000000000000000000000000000000000..a5cedbd3291534346bedfd92027daa0d085ba9ad
--- /dev/null
+++ b/run_ax650.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+set -e
+cd "$(dirname "$0")"
+if [ "$#" -ge 2 ] && [ "${1#-}" = "$1" ]; then
+ IN="$1"; OUT="$2"; shift 2
+ exec python3 python/demo_board.py --models models --steps 1 --std 0.0001 --input "$IN" --output "$OUT" "$@"
+fi
+exec python3 python/demo_board.py --models models --steps 1 --std 0.0001 "$@"
diff --git a/samples/listen/16k/speech_2_input_16k.wav b/samples/listen/16k/speech_2_input_16k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..353e1443e30805efcb84065bc6b7dd58c0b508f7
--- /dev/null
+++ b/samples/listen/16k/speech_2_input_16k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0c7773c82ce75aa5e8a14d5bb53ee5915dbb65f47272ae9f527ac767c7b1f80c
+size 163884
diff --git a/samples/listen/16k/speech_3_input_16k.wav b/samples/listen/16k/speech_3_input_16k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..2b94eea47a6f989c1dda2ddd3f79d8fa8241cc0d
--- /dev/null
+++ b/samples/listen/16k/speech_3_input_16k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:19cb7158760a383a60f1c2e5de23a780331f492fd5a7ccc63a58cadb8ad2f804
+size 163884
diff --git a/samples/listen/48k_from16k/speech_2_output_48k.wav b/samples/listen/48k_from16k/speech_2_output_48k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..c3a2dec7263842f65057474cfdfcbeafe45766de
--- /dev/null
+++ b/samples/listen/48k_from16k/speech_2_output_48k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9dddb1324a6bd655a1d3e3eebe426ebe7fd1f27cecb5691a8a1c9c65a6900b78
+size 491564
diff --git a/samples/listen/48k_from16k/speech_3_output_48k.wav b/samples/listen/48k_from16k/speech_3_output_48k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..e77814a1dabf2b6609fd70bd1c0a834f41f40d26
--- /dev/null
+++ b/samples/listen/48k_from16k/speech_3_output_48k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ea134e4f9a4c1ce8c683f1b4c8d867614c48fd9c7d86012c5b28f4eac929eba9
+size 491564
diff --git a/samples/listen/48k_from8k/OSR_cn_000_0072_output_48k.wav b/samples/listen/48k_from8k/OSR_cn_000_0072_output_48k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..377f382b8c1ebd72f1bb05a7e1e5584f6d4d6247
--- /dev/null
+++ b/samples/listen/48k_from8k/OSR_cn_000_0072_output_48k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3aacb425e8d754df060a22409847c89bae4100837eae32326e7d206bcc607afa
+size 1916204
diff --git a/samples/listen/48k_from8k/OSR_cn_000_0073_output_48k.wav b/samples/listen/48k_from8k/OSR_cn_000_0073_output_48k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..c867fa548fa272dca3d07d9475784a08e1f4ba7f
--- /dev/null
+++ b/samples/listen/48k_from8k/OSR_cn_000_0073_output_48k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4ccd4b0a34f5a6cc92c944410cb2d20a68ccf4a875f3a34ef8597ac2a205b638
+size 2102444
diff --git a/samples/listen/48k_from8k/OSR_cn_000_0074_output_48k.wav b/samples/listen/48k_from8k/OSR_cn_000_0074_output_48k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..0f051feefc0e36db695581d6a828b586f242ad81
--- /dev/null
+++ b/samples/listen/48k_from8k/OSR_cn_000_0074_output_48k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f34689207317fa1b6d6bbf5cbf9f8214fca395f7883161dea7258e4e3b4a91a7
+size 2207084
diff --git a/samples/listen/48k_from8k/OSR_cn_000_0075_output_48k.wav b/samples/listen/48k_from8k/OSR_cn_000_0075_output_48k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..bc2a5b4aa2ea7be15add2a6aaebd6f69ed3f5db5
--- /dev/null
+++ b/samples/listen/48k_from8k/OSR_cn_000_0075_output_48k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7e5845b5def78204cfae9d3fb4dfa5bf8604bf2f0537ad5abdf2cb7c57b77822
+size 2389484
diff --git a/samples/listen/48k_from8k/OSR_us_000_0010_output_48k.wav b/samples/listen/48k_from8k/OSR_us_000_0010_output_48k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..4b2c2dd030c8768cbb637f8770a3e3b78c678241
--- /dev/null
+++ b/samples/listen/48k_from8k/OSR_us_000_0010_output_48k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:020b7219f36a61dc11ea0b003a8249ee7de2b8ed4cb4b0a14c27f7250836c18a
+size 3227564
diff --git a/samples/listen/48k_from8k/OSR_us_000_0013_output_48k.wav b/samples/listen/48k_from8k/OSR_us_000_0013_output_48k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..95724f64674fc8a4f9b5daa79c797a63f7aa2329
--- /dev/null
+++ b/samples/listen/48k_from8k/OSR_us_000_0013_output_48k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d23124c3e9a8415a9ca48de6b3c432fb2534f91d660b0ef680a86fdc156aa2c4
+size 3123884
diff --git a/samples/listen/48k_from8k/OSR_us_000_0057_output_48k.wav b/samples/listen/48k_from8k/OSR_us_000_0057_output_48k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..7a7ec65d6a56b3b27bf493526fc62b55c6506297
--- /dev/null
+++ b/samples/listen/48k_from8k/OSR_us_000_0057_output_48k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:11c50ba9a97219286e7e15aaf58043083e871fa36eafdeb0cc571656f821a23a
+size 3768044
diff --git a/samples/listen/48k_from8k/OSR_us_000_0059_output_48k.wav b/samples/listen/48k_from8k/OSR_us_000_0059_output_48k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..4273c82ab6c70f933af25d06c76ba96b2de6b0bd
--- /dev/null
+++ b/samples/listen/48k_from8k/OSR_us_000_0059_output_48k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6b72a16bda85904b21786ecea508bbe847e1579dc2c34f558284ff765bbd36a2
+size 5348204
diff --git a/samples/listen/48k_from8k/samplelib_speech_1m_output_48k.wav b/samples/listen/48k_from8k/samplelib_speech_1m_output_48k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..1f6682c6fd4b653e3c8b5f47ccead6c724b47a2e
--- /dev/null
+++ b/samples/listen/48k_from8k/samplelib_speech_1m_output_48k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f87bcb7e77799e390f1017231d35931bef3c6d7c1262334c7cc775189a21bdbe
+size 5760044
diff --git a/samples/listen/48k_from8k/speech_2_output_48k.wav b/samples/listen/48k_from8k/speech_2_output_48k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..778adf4568b7198ef92c74e727f6cd3da789d6a0
--- /dev/null
+++ b/samples/listen/48k_from8k/speech_2_output_48k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ba2dcda972762f4369839be6776fd77c7291edfd00a7b164ef8ab433963e3641
+size 491564
diff --git a/samples/listen/48k_from8k/speech_3_output_48k.wav b/samples/listen/48k_from8k/speech_3_output_48k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..69dc763679153a104ef0bfa70ecc5457dd6d5290
--- /dev/null
+++ b/samples/listen/48k_from8k/speech_3_output_48k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6aa796c46e7f7938c242018ba818c97dabedf29cf74c02c298be73658d6ff77b
+size 491564
diff --git a/samples/listen/8k/OSR_cn_000_0072_input_8k.wav b/samples/listen/8k/OSR_cn_000_0072_input_8k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..4ad8245a0b161d7e1f4708edb00547e526471599
--- /dev/null
+++ b/samples/listen/8k/OSR_cn_000_0072_input_8k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a7e2e6c7a0476d0286c6b1df92d15ab938888dfecd73efb29e4a0b82740fa761
+size 319526
diff --git a/samples/listen/8k/OSR_cn_000_0073_input_8k.wav b/samples/listen/8k/OSR_cn_000_0073_input_8k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..d9f604678c29531e6da10cd01ec12c56dbacc72f
--- /dev/null
+++ b/samples/listen/8k/OSR_cn_000_0073_input_8k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ffacc5400d699ff1b84917308a4f9f0eb996a7957d4ee4bb126c7d3a6ee1e375
+size 350544
diff --git a/samples/listen/8k/OSR_cn_000_0074_input_8k.wav b/samples/listen/8k/OSR_cn_000_0074_input_8k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..6980eadd66eca7c3a1f1fe1666ecaf07dc5636c4
--- /dev/null
+++ b/samples/listen/8k/OSR_cn_000_0074_input_8k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8ef91f9f846a94d5e617fdba65a9acbb1eaffcbbafee50880e92bb857e171c7f
+size 367988
diff --git a/samples/listen/8k/OSR_cn_000_0075_input_8k.wav b/samples/listen/8k/OSR_cn_000_0075_input_8k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..8db539d69e3eb8502f10a2fc8b0f3d0a731abb70
--- /dev/null
+++ b/samples/listen/8k/OSR_cn_000_0075_input_8k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3fd3b56518d3aed721b5e3c98c7492796eb85d225b52ee325053d9d595edcb5e
+size 398442
diff --git a/samples/listen/8k/OSR_us_000_0010_input_8k.wav b/samples/listen/8k/OSR_us_000_0010_input_8k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..16330497f2c409a1d756be93b679cc1f83f12a28
--- /dev/null
+++ b/samples/listen/8k/OSR_us_000_0010_input_8k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a4bf9becd046d7aedb6d05b6e12347a6294a44f74d263089c636fb0a2b1e6561
+size 538014
diff --git a/samples/listen/8k/OSR_us_000_0013_input_8k.wav b/samples/listen/8k/OSR_us_000_0013_input_8k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..4718a0579a61edb02e0dd29da9b531c2d6b656c2
--- /dev/null
+++ b/samples/listen/8k/OSR_us_000_0013_input_8k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3af3f5df07da603b7a421a345aad023df28c862ba92f68af360cc8c64c71436e
+size 520730
diff --git a/samples/listen/8k/OSR_us_000_0057_input_8k.wav b/samples/listen/8k/OSR_us_000_0057_input_8k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..e9703442886db55037b88c2b48db9b915cfb7bbf
--- /dev/null
+++ b/samples/listen/8k/OSR_us_000_0057_input_8k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ebf286a093ca75e7f53b26180c6e54e7f179680b19d57a52f19516dd036381fe
+size 628192
diff --git a/samples/listen/8k/OSR_us_000_0059_input_8k.wav b/samples/listen/8k/OSR_us_000_0059_input_8k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..75d6392c6dcad25a0347d1932f2ee4197d8f83f4
--- /dev/null
+++ b/samples/listen/8k/OSR_us_000_0059_input_8k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:84520e52d7f8e7fadbb0d3bfbf18ddf80ff8bd7862d9287a48bfe8060223e554
+size 891442
diff --git a/samples/listen/8k/samplelib_speech_1m_input_8k.wav b/samples/listen/8k/samplelib_speech_1m_input_8k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..e9f1b246584f6cac58d264c5d9c8b6d05ac4fce2
--- /dev/null
+++ b/samples/listen/8k/samplelib_speech_1m_input_8k.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:41fa574399ab8fa2f9263be1d386449f884627d205e72c310233c481cacf9b57
+size 960164
diff --git a/samples/listen/8k/speech_2_input_8k.wav b/samples/listen/8k/speech_2_input_8k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..95f5c5bac2bf8a436764c7a8f61eb96575e0de51
Binary files /dev/null and b/samples/listen/8k/speech_2_input_8k.wav differ
diff --git a/samples/listen/8k/speech_3_input_8k.wav b/samples/listen/8k/speech_3_input_8k.wav
new file mode 100644
index 0000000000000000000000000000000000000000..4a0ef74f1ce2311055b356fc67d54a3c8ce9b1d2
Binary files /dev/null and b/samples/listen/8k/speech_3_input_8k.wav differ
diff --git a/samples/listen/spectrograms/OSR_cn_000_0072_input_8k_spec.png b/samples/listen/spectrograms/OSR_cn_000_0072_input_8k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..8e12cebdb3930e95e3bb02ea923f4b2bb3dfaa96
--- /dev/null
+++ b/samples/listen/spectrograms/OSR_cn_000_0072_input_8k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:af4344a794278809216c8d2cd6b4b4f16ee5e6c1a8c22d70e709759ad1f9157b
+size 749918
diff --git a/samples/listen/spectrograms/OSR_cn_000_0072_output_48k_spec.png b/samples/listen/spectrograms/OSR_cn_000_0072_output_48k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..ebd059d434b94a343b820326e4deebba205fe5a8
--- /dev/null
+++ b/samples/listen/spectrograms/OSR_cn_000_0072_output_48k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:20c8a89640cd98c9cb4ee5f8034298a07f81e6f3cdb35e5b3c1066799b12b539
+size 803398
diff --git a/samples/listen/spectrograms/OSR_cn_000_0073_input_8k_spec.png b/samples/listen/spectrograms/OSR_cn_000_0073_input_8k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..a531df69c788c2bd6ffbfada55b2b1347fa56ff9
--- /dev/null
+++ b/samples/listen/spectrograms/OSR_cn_000_0073_input_8k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:09d9dc8d700f57565043846656f19121dfd45ffdfb60b76b38460dac1310d437
+size 786860
diff --git a/samples/listen/spectrograms/OSR_cn_000_0073_output_48k_spec.png b/samples/listen/spectrograms/OSR_cn_000_0073_output_48k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..f80c4241dbf7597d3268c42e225f01f6db3f8a19
--- /dev/null
+++ b/samples/listen/spectrograms/OSR_cn_000_0073_output_48k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:534492d17c0d2e4d9c87cbc2dfbff885b74c04a38405fd4a051332b0e2ab044a
+size 864997
diff --git a/samples/listen/spectrograms/OSR_cn_000_0074_input_8k_spec.png b/samples/listen/spectrograms/OSR_cn_000_0074_input_8k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b4b2f1df88c8d8d1d197b58cba3c12d9ea3011a
--- /dev/null
+++ b/samples/listen/spectrograms/OSR_cn_000_0074_input_8k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7c002a33d997213a67115778bffbfa9faa179e7c73917079f948ae7351420813
+size 784331
diff --git a/samples/listen/spectrograms/OSR_cn_000_0074_output_48k_spec.png b/samples/listen/spectrograms/OSR_cn_000_0074_output_48k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..c82b1a7076cda74226aa515e4c397651823dde59
--- /dev/null
+++ b/samples/listen/spectrograms/OSR_cn_000_0074_output_48k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3cd9536c5cb81466eed57ff0b4b3b8e0f92b6bc240e0d9f4cfd85cbd50d2dd37
+size 703632
diff --git a/samples/listen/spectrograms/OSR_cn_000_0075_input_8k_spec.png b/samples/listen/spectrograms/OSR_cn_000_0075_input_8k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..14037291fa44e19d37afe12744f9fc0fdac670f9
--- /dev/null
+++ b/samples/listen/spectrograms/OSR_cn_000_0075_input_8k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:74c5148ed9c578f84de95a6d5b660bc46612736470fc196f6f131a3aea6e423f
+size 765049
diff --git a/samples/listen/spectrograms/OSR_cn_000_0075_output_48k_spec.png b/samples/listen/spectrograms/OSR_cn_000_0075_output_48k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..1fb283e8fc93be11f49ce73d5335845b125a1447
--- /dev/null
+++ b/samples/listen/spectrograms/OSR_cn_000_0075_output_48k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a12fdd53869c559c273179ae58265e65b327ce1ea3011a5e4f526ef6fe72f6bd
+size 716338
diff --git a/samples/listen/spectrograms/OSR_us_000_0010_input_8k_spec.png b/samples/listen/spectrograms/OSR_us_000_0010_input_8k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..1566cca904cf21ace01ac6a9c50e6438072fc758
--- /dev/null
+++ b/samples/listen/spectrograms/OSR_us_000_0010_input_8k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b733a0a5716c4d8e464be256fd28c44ce02d7a9c23c07d283acb850dc5faec14
+size 812271
diff --git a/samples/listen/spectrograms/OSR_us_000_0010_output_48k_spec.png b/samples/listen/spectrograms/OSR_us_000_0010_output_48k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..1079e888212fac27c21b946f80bc108b00eeae77
--- /dev/null
+++ b/samples/listen/spectrograms/OSR_us_000_0010_output_48k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ac09d801ed20f3cce08d40056ef963c8e07231b1b5bfac89c62b6a2dd7f6a947
+size 826157
diff --git a/samples/listen/spectrograms/OSR_us_000_0013_input_8k_spec.png b/samples/listen/spectrograms/OSR_us_000_0013_input_8k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..7a8edec5e357a757f9652231b2af6d8c74864cfb
--- /dev/null
+++ b/samples/listen/spectrograms/OSR_us_000_0013_input_8k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:32bceb0029bd981c761198dd3fb941229d3afaba4cbc94a58da586b79572197c
+size 787741
diff --git a/samples/listen/spectrograms/OSR_us_000_0013_output_48k_spec.png b/samples/listen/spectrograms/OSR_us_000_0013_output_48k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..10352eac6e198b597ba2640f7037b71e6e2f9316
--- /dev/null
+++ b/samples/listen/spectrograms/OSR_us_000_0013_output_48k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:66a07296bc3b4ab246e3ab2f19e5006720153ca1e9e9ce3d910dd778792fc707
+size 823177
diff --git a/samples/listen/spectrograms/OSR_us_000_0057_input_8k_spec.png b/samples/listen/spectrograms/OSR_us_000_0057_input_8k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3433e30d016f368fa848945e70ab7a0fba984bc
--- /dev/null
+++ b/samples/listen/spectrograms/OSR_us_000_0057_input_8k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6d4c0dadee1a5d51e7f3aa5970e3b898bfd6f65fa8a92a6226e80d138c690246
+size 916219
diff --git a/samples/listen/spectrograms/OSR_us_000_0057_output_48k_spec.png b/samples/listen/spectrograms/OSR_us_000_0057_output_48k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..ca4c6150d832439bb9670643a034fbb890429981
--- /dev/null
+++ b/samples/listen/spectrograms/OSR_us_000_0057_output_48k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c9a7f2ddc501ac4719fd9bc4195ace019ca06386e9fa8aa2af85a4f4554c149c
+size 728008
diff --git a/samples/listen/spectrograms/OSR_us_000_0059_input_8k_spec.png b/samples/listen/spectrograms/OSR_us_000_0059_input_8k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..93a2fd438bb950542212b173547e19b26be5534c
--- /dev/null
+++ b/samples/listen/spectrograms/OSR_us_000_0059_input_8k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:881be86a949525b331a92c1cf05dd5f01b2ceff93307a2eccddc802b81b0ad4e
+size 937556
diff --git a/samples/listen/spectrograms/OSR_us_000_0059_output_48k_spec.png b/samples/listen/spectrograms/OSR_us_000_0059_output_48k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..82766dc4653bb57e07d3c41bf3df10629e747e1b
--- /dev/null
+++ b/samples/listen/spectrograms/OSR_us_000_0059_output_48k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9dc63482d90a31b2791422fd0df1526ca38510b144f66d3071577b62239e1a9d
+size 581897
diff --git a/samples/listen/spectrograms/samplelib_speech_1m_input_8k_spec.png b/samples/listen/spectrograms/samplelib_speech_1m_input_8k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e26f56c2782843929ea8b064b340a72de676013
--- /dev/null
+++ b/samples/listen/spectrograms/samplelib_speech_1m_input_8k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9ec146ffdceb34e157b93622c509176d53bdf6de8c40731c1578b4ae6f3b884f
+size 605830
diff --git a/samples/listen/spectrograms/samplelib_speech_1m_output_48k_spec.png b/samples/listen/spectrograms/samplelib_speech_1m_output_48k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..3338d4414891e7c33d2bd62b6b548854a2e66c03
--- /dev/null
+++ b/samples/listen/spectrograms/samplelib_speech_1m_output_48k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:025fcd13709c2c7162e9c45b8620f90ef25d576c75a2474acbb91f50a6beb7d8
+size 877592
diff --git a/samples/listen/spectrograms/speech_2_input_16k_spec.png b/samples/listen/spectrograms/speech_2_input_16k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..62c4483641180a589d78c42a0e2852ea5d267ada
--- /dev/null
+++ b/samples/listen/spectrograms/speech_2_input_16k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4fe0c76de28daf1446d37a072fb08a304875c53b34b134218ce705739a4e3130
+size 513272
diff --git a/samples/listen/spectrograms/speech_2_input_8k.png b/samples/listen/spectrograms/speech_2_input_8k.png
new file mode 100644
index 0000000000000000000000000000000000000000..12f4e97031d259eacc6d2ee1644138f916e8aea1
--- /dev/null
+++ b/samples/listen/spectrograms/speech_2_input_8k.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:24a615f5cdbbfc93e1043efc9061d515028509ed024316a6b32a16f215c280f9
+size 322997
diff --git a/samples/listen/spectrograms/speech_2_input_8k_spec.png b/samples/listen/spectrograms/speech_2_input_8k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..f8e106442197e2b8696c9ca889fd7f49f49eaf41
--- /dev/null
+++ b/samples/listen/spectrograms/speech_2_input_8k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:aded11b5c54ee45609d7efe4d544faeb819b3fb1a8268bd334afea817c9d42ce
+size 294149
diff --git a/samples/listen/spectrograms/speech_2_output_16k_48k_spec.png b/samples/listen/spectrograms/speech_2_output_16k_48k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..fde0094f23b736df0d5cccddbedcb9ed81832ec7
--- /dev/null
+++ b/samples/listen/spectrograms/speech_2_output_16k_48k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7b5ef76d6558a9fba9d858a0cc6e90365813dcc519efe1b77a402b6af1f9adcc
+size 528563
diff --git a/samples/listen/spectrograms/speech_2_output_8k_48k.png b/samples/listen/spectrograms/speech_2_output_8k_48k.png
new file mode 100644
index 0000000000000000000000000000000000000000..34d690a132c81674a08d44f6b494535d6e97941b
--- /dev/null
+++ b/samples/listen/spectrograms/speech_2_output_8k_48k.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:308a3dff8a20af7ee5b0531f0c5b82fb20df4a31757d74e053cef3e3b260f92d
+size 587469
diff --git a/samples/listen/spectrograms/speech_2_output_8k_48k_spec.png b/samples/listen/spectrograms/speech_2_output_8k_48k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..2b3d8cb5662732ede1f681a3b2369001b492ac9e
--- /dev/null
+++ b/samples/listen/spectrograms/speech_2_output_8k_48k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:83cfca42a4eea6cc198c23f2b0d01e96953869176f09a9d06020c8f4436b9536
+size 518198
diff --git a/samples/listen/spectrograms/speech_3_input_16k_spec.png b/samples/listen/spectrograms/speech_3_input_16k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..507b26cd0f7b36f9795fa043c9041c111fde34ef
--- /dev/null
+++ b/samples/listen/spectrograms/speech_3_input_16k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ae083843e8a4e6eeee9bf953706257d5d20d7bf0bee6049f993315f127d7fc7c
+size 412593
diff --git a/samples/listen/spectrograms/speech_3_input_8k_spec.png b/samples/listen/spectrograms/speech_3_input_8k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..65711894fb979dc49b470d6abb2ee9e1f563af03
--- /dev/null
+++ b/samples/listen/spectrograms/speech_3_input_8k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2c1b3a6440649389d4bbe62efe0ca725e4561d42e4da4b72531d707824f45b8c
+size 337617
diff --git a/samples/listen/spectrograms/speech_3_output_16k_48k_spec.png b/samples/listen/spectrograms/speech_3_output_16k_48k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..6df8921245e10ea9bc09a3cbf9452cd0613f2e6a
--- /dev/null
+++ b/samples/listen/spectrograms/speech_3_output_16k_48k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2a666821d253e97a08da404fdabefa2bbc236ca74c9c3404853135b33af941b5
+size 352626
diff --git a/samples/listen/spectrograms/speech_3_output_8k_48k_spec.png b/samples/listen/spectrograms/speech_3_output_8k_48k_spec.png
new file mode 100644
index 0000000000000000000000000000000000000000..6e8e44eefac26b1bf1698d051aae5abcee80a097
--- /dev/null
+++ b/samples/listen/spectrograms/speech_3_output_8k_48k_spec.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d230f1396250d3fd5590752685f81f3427856bbb9db9d1a514b6ecdd9063b42c
+size 340832