#!/usr/bin/env python3 import os import re from pathlib import Path from typing import List BASE_URL = "https://huggingface.co/csukuangfj/sherpa-onnx-apk/resolve/main/" from dataclasses import dataclass @dataclass class APK: major: int minor: int patch: int arch: str short_name: str def __init__(self, s): # sherpa-onnx-1.9.23-arm64-v8a-asr_2pass-en-small_zipformer_whisper_tiny.apk # sherpa-onnx-1.9.23-x86-asr_2pass-en-small_zipformer_whisper_tiny.apk s = str(s).split("/")[-1] split = s.split("-") self.major, self.minor, self.patch = list(map(int, split[2].split("."))) self.arch = split[3] self.lang = split[5] self.short_name = split[6] if "arm" in s: self.arch += "-" + split[4] self.lang = split[6] self.short_name = split[7] if "armeabi" in self.arch: self.arch = "y" + self.arch if "arm64" in self.arch: self.arch = "z" + self.arch if "small" in self.short_name: self.short_name = "zzz" + self.short_name def sort_by_apk(x): x = APK(x) return (x.major, x.minor, x.patch, x.arch, x.lang, x.short_name) def get_all_files(d_list: List[str], suffix: str) -> List[str]: if isinstance(d_list, str): d_list = [d_list] min_major = 1 min_minor = 9 min_patch = 10 ss = [] for d in d_list: for root, _, files in os.walk(d): for f in files: if f.endswith(suffix): major, minor, patch = list(map(int, f.split("-")[2].split("."))) if major >= min_major and minor >= min_minor and patch >= min_patch: ss.append(os.path.join(root, f)) ans = sorted(ss, key=sort_by_apk, reverse=True) return list(map(lambda x: BASE_URL + str(x), ans)) def to_file(filename: str, files: List[str]): content = r"""

APKs for two-pass speech recognition

This page lists the two-pass speech recognition APKs for sherpa-onnx, one of the deployment frameworks of the Next-gen Kaldi project.
The name of an APK has the following rule: where
Two-pass: Two models are used during the recognition. A streaming model is used in the first pass, while a non-streaming model is used in the second pass. The purpose of the first pass is to give feedback to users that the system is working and it displays results while users are speaking. When an endpoint is detected, the samples between two endpoints are sent to the second pass model for recognition. The output of the second pass model is the final recognition result.

Features of the first-pass model:
Features of the second-pass model:

You can download all supported models from https://github.com/k2-fsa/sherpa-onnx/releases/tag/asr-models

Note about the license The code of Next-gen Kaldi is using Apache-2.0 license. However, we support models from different frameworks. Please check the license of your selected model.

APK Comment First-pass Second-pass
sherpa-onnx-x.y.z-arm64-v8a-asr_2pass-zh-small_zipformer_zipformer.apk It supports only Chinese. sherpa-onnx-streaming-zipformer-zh-14M-2023-02-23 icefall-asr-zipformer-wenetspeech-20230615
sherpa-onnx-x.y.z-arm64-v8a-asr_2pass-zh-small_zipformer_paraformer.apk It supports only Chinese. sherpa-onnx-streaming-zipformer-zh-14M-2023-02-23 sherpa-onnx-paraformer-zh-2023-03-28
sherpa-onnx-x.y.z-arm64-v8a-asr_2pass-en-small_zipformer_whisper_tiny.apk It supports only English. sherpa-onnx-streaming-zipformer-en-20M-2023-02-17 sherpa-onnx-whisper-tiny.en


""" if "-cn" not in filename: content += """ For Chinese users, please visit this address, which replaces huggingface.co with hf-mirror.com

中国用户, 请访问这个地址

""" with open(filename, "w") as f: print(content, file=f) for x in files: name = x.rsplit("/", maxsplit=1)[-1] print(f'{name}
', file=f) def main(): apk = get_all_files("asr-2pass", suffix=".apk") to_file("./apk-asr-2pass.html", apk) # for Chinese users apk2 = [] for a in apk: a = a.replace("huggingface.co", "hf-mirror.com") a = a.replace("resolve", "blob") apk2.append(a) to_file("./apk-asr-2pass-cn.html", apk2) if __name__ == "__main__": main()