FunASR Python API
Models, inference, training, and utilities.
{overview_links}#!/usr/bin/env python3 """Generate API page with source code preview and GitHub links. Run this script from the repo root on main branch. Output: gh-pages-output/api.html for deployment to gh-pages. This script is designed to be run by GitHub Actions on every push to main, automatically regenerating the API docs. """ import argparse import ast import glob import html as htmlmod import os import re import shutil from pathlib import Path REPO_URL = "https://github.com/modelscope/FunASR" BRANCH = "main" REPO_ROOT = Path(__file__).resolve().parents[1] parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--output-dir", type=Path, default=REPO_ROOT / "gh-pages-output") OUTPUT_DIR = parser.parse_args().output_dir.resolve() STYLESHEET = REPO_ROOT / "gh-pages-output" / "api-reference.css" os.chdir(REPO_ROOT) tree_structure = { "funasr.auto": {"auto_model": "funasr/auto/auto_model.py"}, "funasr.register": {"register": "funasr/register.py"}, "funasr.models": {}, "funasr.frontends": {}, "funasr.tokenizer": {}, "funasr.utils": {}, "funasr.bin": {}, "funasr.download": {}, "funasr.train_utils": {}, "funasr.datasets": {}, "funasr.losses": {}, "funasr.schedulers": {}, } # Auto-discover for f in sorted(glob.glob("funasr/models/*/model.py")): if "whisper_lib" in f: continue tree_structure["funasr.models"][f.split("/")[-2]] = f for top in ["frontends", "tokenizer", "utils", "bin", "download", "train_utils", "losses", "schedulers"]: for f in sorted(glob.glob(f"funasr/{top}/*.py")): if "__init__" in f or "abs_" in f: continue tree_structure[f"funasr.{top}"][os.path.basename(f).replace(".py", "")] = f for f in sorted(glob.glob("funasr/datasets/*.py") + glob.glob("funasr/datasets/audio_datasets/*.py")): if "__init__" in f or "__pycache__" in f: continue tree_structure["funasr.datasets"][os.path.basename(f).replace(".py", "")] = f tree_structure = {k: v for k, v in tree_structure.items() if v} SKIP_CLASSES = { "SinusoidalPositionEncoder", "StreamSinusoidalPositionEncoder", "PositionwiseFeedForward", "MultiHeadedAttentionSANM", "LayerNorm", "EncoderLayerSANM", "VadStateMachine", "FrameState", "AudioChangeState", "VadDetectMode", "VADXOptions", "E2EVadSpeechBufWithDoa", "E2EVadFrameProb", "WindowDetector", "Stats", } def esc(s): return htmlmod.escape(s) if s else "" def format_doc(doc): if not doc: return '
No documentation yet.
' lines = doc.strip().split("\n") out = "" in_list = False for line in lines: s = line.strip() if s in ("Args:", "Returns:", "Raises:", "Examples:", "Note:", "Notes:", "Features:", "Models:", "Requirements:", "Output:", "Output format:"): if in_list: out += "\n"; in_list = False out += f'{esc(m.group(1))} — {esc(m.group(2))}{esc(s)}
\n' if in_list: out += "{esc(entry["source"])}'
if entry["truncated"]:
content += f'View full source on GitHub →'
content += '{esc(sig)}{esc(m["source"])}'
if m["truncated"]:
content += f'View full source on GitHub →'
content += '{esc(entry["name"])}({esc(args_str)}){esc(entry["source"])}'
if entry["truncated"]:
content += f'View full source on GitHub →'
content += '{len(all_data)} modules {total_entries} classes and functions
Models, inference, training, and utilities.
{overview_links}