#!/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)[len("asr-2pass/") :] 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 generate_url(files: List[str]) -> List[str]: ans = [] base = BASE_URL for f in files: ans.append(base + str(f)) return ans def get_all_files(d: str, suffix: str) -> List[str]: ans = sorted(Path(d).glob(suffix), 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

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()