From 48d170673334ae23fa14354aac49e1ef9d547c9a Mon Sep 17 00:00:00 2001 From: LauraGPT Date: Wed, 29 Jul 2026 20:33:18 +0000 Subject: [PATCH] chore: prepare FunASR 1.4.0 release Signed-off-by: LauraGPT --- README.md | 1 + README_ja.md | 1 + README_ko.md | 1 + README_zh.md | 1 + funasr/version.txt | 2 +- tests/test_release_version_contract.py | 24 ++++++++++++++++++++++++ 6 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 tests/test_release_version_contract.py diff --git a/README.md b/README.md index bfada3c07..b5255890c 100644 --- a/README.md +++ b/README.md @@ -322,6 +322,7 @@ asset is published. ## What's new +- 2026/07/31: **v1.4.0 on PyPI** — `AutoModel` now rejects the common `vda_model` misspelling before model download and points to `vad_model`, so VAD-dependent segmentation, speaker processing, and `sentence_info` are not silently disabled. The GitHub source release also updates the legacy WebSocket file runtime: clients wait for an explicit end-of-input acknowledgement while the server flushes pending offline, online, and 2pass audio and reports finalization failures. Install the Python package with `python -m pip install -U "funasr==1.4.0"`. [Release ->](https://github.com/modelscope/FunASR/releases/tag/v1.4.0) - 2026/07/27: **v1.3.30 on PyPI** — container-formatted WAV, MP3, FLAC, OGG, MP4/M4A, and WebM audio bytes are now decoded through their codecs instead of being misread as raw PCM. OpenAI-compatible responses preserve speaker labels, VAD sentence timing survives punctuation mismatch, trusted browser clients can opt in to CORS, and vLLM VAD chunks are capped at 30 seconds. The GitHub release also includes the current prebuilt llama.cpp runtime for nine desktop and server targets. Install with `python -m pip install -U "funasr==1.3.30"`. [Release ->](https://github.com/modelscope/FunASR/releases/tag/v1.3.30) - 2026/07/24: **v1.3.29 hotfix on PyPI** — SenseVoice long-audio inference now returns each VAD speech region through `sentence_info` when token timestamps and a punctuation model are unavailable. Subtitle clients receive the recognized text with real millisecond start/end bounds instead of one zero-length or full-media cue. Install with `python -m pip install -U "funasr==1.3.29"`. [Release ->](https://github.com/modelscope/FunASR/releases/tag/v1.3.29) - 2026/07/24: **v1.3.28 hotfix on PyPI** — realtime WebSocket finalization now preserves clean continuous partial transcripts when a VAD-locked decode truncates to a short prefix, repeats a hallucinated phrase, or raises; short STOP tails, VAD finalization, and speaker completion now share the same reliable path. SenseVoice subtitle segmentation also aligns rich tags, punctuation, and word/BPE timestamps without collapsing Chinese into one cue or damaging English surface text. Install with `python -m pip install -U "funasr==1.3.28"`. [Release ->](https://github.com/modelscope/FunASR/releases/tag/v1.3.28) diff --git a/README_ja.md b/README_ja.md index 759a4355d..9755860fb 100644 --- a/README_ja.md +++ b/README_ja.md @@ -99,6 +99,7 @@ Whisper は単一モデルですが、**FunASR はツールキット**です— ## 最新情報 +- 2026/07/31:**v1.4.0 を PyPI に公開** — `AutoModel` はモデルのダウンロード前に、よくある `vda_model` のスペルミスを拒否し、正しい `vad_model` を案内します。これにより、VAD に依存する分割、話者処理、`sentence_info` が気付かないまま無効になることを防ぎます。GitHub のソースリリースでは legacy WebSocket ファイルランタイムも更新され、クライアントは明示的な入力終了応答を待ち、サーバーは保留中の offline、online、2pass 音声を処理してから完了またはエラーを返します。Python パッケージのインストール:`python -m pip install -U "funasr==1.4.0"`。[Release →](https://github.com/modelscope/FunASR/releases/tag/v1.4.0) - 2026/07/27:**v1.3.30 を PyPI に公開** — WAV、MP3、FLAC、OGG、MP4/M4A、WebM などのコンテナ形式の音声バイト列を raw PCM と誤認せず、対応するコーデックでデコードするようになりました。OpenAI 互換レスポンスは話者ラベルを保持し、句読点が一致しない場合も VAD 区間時刻を保持します。信頼済みブラウザクライアント向け CORS と、vLLM の 30 秒 VAD 上限にも対応しました。GitHub Release には、デスクトップ/サーバー向け 9 ターゲットの最新 llama.cpp ビルドも同梱しています。インストール:`python -m pip install -U "funasr==1.3.30"`。[Release →](https://github.com/modelscope/FunASR/releases/tag/v1.3.30) - 2026/07/24:**v1.3.29 hotfix が PyPI に公開** — SenseVoice の長時間音声推論で word timestamp と句読点モデルがない場合でも、各 VAD 音声区間を `sentence_info` で返すようになりました。字幕クライアントは、ゼロ長またはメディア全体を覆う一つの cue ではなく、認識テキストと実際のミリ秒単位の開始・終了時刻を取得できます。インストール:`python -m pip install -U "funasr==1.3.29"`。[Release →](https://github.com/modelscope/FunASR/releases/tag/v1.3.29) - 2026/07/24:**v1.3.28 hotfix が PyPI に公開** — VAD で確定した realtime WebSocket の最終結果が短い接頭辞、反復 hallucination、または decode 例外へ退化した場合、現在の音声区間を連続して完全に覆う clean partial を保持します。短い STOP tail、VAD finalize、話者処理も同じ信頼できる完了経路に統一しました。SenseVoice 字幕は rich tag、句読点、word/BPE timestamp を正しく整列し、中国語を一つの cue に潰さず、英語表記も保持します。インストール:`python -m pip install -U "funasr==1.3.28"`。[Release →](https://github.com/modelscope/FunASR/releases/tag/v1.3.28) diff --git a/README_ko.md b/README_ko.md index 83afb7d11..88326ea31 100644 --- a/README_ko.md +++ b/README_ko.md @@ -99,6 +99,7 @@ Whisper는 단일 모델이지만, **FunASR는 툴킷**입니다. 용도에 맞 ## 최신 소식 +- 2026/07/31: **v1.4.0 PyPI 공개** — `AutoModel`은 모델 다운로드 전에 흔한 `vda_model` 오타를 거부하고 올바른 `vad_model` 인수를 안내합니다. 따라서 VAD 기반 분할, 화자 처리 및 `sentence_info`가 조용히 비활성화되지 않습니다. GitHub 소스 릴리스에서는 legacy WebSocket 파일 런타임도 개선되어, 클라이언트가 명시적인 입력 종료 응답을 기다리고 서버가 대기 중인 offline, online 및 2pass 오디오를 처리한 뒤 완료 또는 오류를 반환합니다. Python 패키지 설치: `python -m pip install -U "funasr==1.4.0"`. [Release →](https://github.com/modelscope/FunASR/releases/tag/v1.4.0) - 2026/07/27: **v1.3.30 PyPI 공개** — WAV, MP3, FLAC, OGG, MP4/M4A, WebM 컨테이너 형식의 오디오 바이트를 raw PCM으로 잘못 해석하지 않고 해당 코덱으로 디코딩합니다. OpenAI 호환 응답은 화자 라벨을 보존하고, 구두점이 일치하지 않아도 VAD 문장 시간을 유지합니다. 신뢰할 수 있는 브라우저 클라이언트용 CORS와 vLLM의 30초 VAD 구간 제한도 지원합니다. GitHub Release에는 데스크톱 및 서버용 9개 대상의 최신 llama.cpp 빌드도 함께 제공합니다. 설치: `python -m pip install -U "funasr==1.3.30"`. [Release →](https://github.com/modelscope/FunASR/releases/tag/v1.3.30) - 2026/07/24: **v1.3.29 hotfix PyPI 공개** — SenseVoice 장시간 오디오 추론에서 word timestamp와 구두점 모델이 없을 때도 각 VAD 음성 구간을 `sentence_info`로 반환합니다. 자막 클라이언트는 길이가 0이거나 미디어 전체를 덮는 단일 cue 대신 인식 텍스트와 실제 밀리초 단위 시작·종료 시간을 받을 수 있습니다. 설치: `python -m pip install -U "funasr==1.3.29"`. [Release →](https://github.com/modelscope/FunASR/releases/tag/v1.3.29) - 2026/07/24: **v1.3.28 hotfix PyPI 공개** — VAD로 확정된 realtime WebSocket 최종 결과가 짧은 접두사, 반복 hallucination 또는 decode 예외로 퇴화하면 현재 음성 구간을 연속해서 완전히 덮는 clean partial을 보존합니다. 짧은 STOP tail, VAD finalize, 화자 완료 처리도 동일한 안정적인 경로로 통합했습니다. SenseVoice 자막은 rich tag, 구두점, word/BPE timestamp를 올바르게 정렬해 중국어가 하나의 cue로 합쳐지거나 영어 원문이 손상되지 않습니다. 설치: `python -m pip install -U "funasr==1.3.28"`. [Release →](https://github.com/modelscope/FunASR/releases/tag/v1.3.28) diff --git a/README_zh.md b/README_zh.md index e21dae6b5..a7486a871 100644 --- a/README_zh.md +++ b/README_zh.md @@ -147,6 +147,7 @@ Whisper 是单个模型,**FunASR 是一个工具箱**——按场景挑模型 ## 最新动态 +- 2026/07/31:**v1.4.0 已发布到 PyPI** — `AutoModel` 现在会在下载模型前拒绝常见的 `vda_model` 误拼写并明确提示使用 `vad_model`,避免依赖 VAD 的分段、说话人处理和 `sentence_info` 被静默关闭。GitHub 源码发布同时更新 legacy WebSocket 文件运行时:客户端会等待明确的输入结束确认,服务端先刷新待处理的 offline、online 与 2pass 音频,并把收尾失败返回给客户端。Python 包安装命令:`python -m pip install -U "funasr==1.4.0"`。[发布页 →](https://github.com/modelscope/FunASR/releases/tag/v1.4.0) - 2026/07/27:**v1.3.30 已发布到 PyPI** — WAV、MP3、FLAC、OGG、MP4/M4A 和 WebM 等容器格式的音频字节现在会通过对应编解码器解码,不再被误当作原始 PCM。OpenAI 兼容响应会保留说话人标签,标点不匹配时仍保留 VAD 分句时间,受信任的浏览器客户端可按需启用 CORS,vLLM 的 VAD 分段上限为 30 秒。GitHub 发布页还同时提供覆盖九种桌面和服务器目标的当前 llama.cpp 预编译运行包。安装命令:`python -m pip install -U "funasr==1.3.30"`。[发布页 →](https://github.com/modelscope/FunASR/releases/tag/v1.3.30) - 2026/07/24:**v1.3.29 热修复已发布到 PyPI** — SenseVoice 长音频在没有词级时间戳和标点模型时,现在会通过 `sentence_info` 返回每个 VAD 语音片段。字幕客户端可直接获得识别文本及真实的毫秒级起止时间,不再退化为零时长或覆盖整段媒体的单条字幕。安装命令:`python -m pip install -U "funasr==1.3.29"`。[发布页 →](https://github.com/modelscope/FunASR/releases/tag/v1.3.29) - 2026/07/24:**v1.3.28 热修复已发布到 PyPI** — 实时 WebSocket 在 VAD 锁句结果退化为短前缀、重复幻觉或解码异常时,会保留连续且完整覆盖当前语音段的干净 partial;短音频 STOP、VAD 收尾和说话人结束现在统一走可靠的完成路径。SenseVoice 字幕分句也会正确对齐富标签、标点与词/BPE 时间戳,不再把中文压成一个字幕块,也不会破坏英文原文。安装命令:`python -m pip install -U "funasr==1.3.28"`。[发布页 →](https://github.com/modelscope/FunASR/releases/tag/v1.3.28) diff --git a/funasr/version.txt b/funasr/version.txt index 36165ba1f..88c5fb891 100644 --- a/funasr/version.txt +++ b/funasr/version.txt @@ -1 +1 @@ -1.3.30 +1.4.0 diff --git a/tests/test_release_version_contract.py b/tests/test_release_version_contract.py new file mode 100644 index 000000000..88057f7e8 --- /dev/null +++ b/tests/test_release_version_contract.py @@ -0,0 +1,24 @@ +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +RELEASE_VERSION = "1.4.0" +README_FILES = ("README.md", "README_zh.md", "README_ja.md", "README_ko.md") + + +def test_release_version_uses_required_carry_rule(): + version = (ROOT / "funasr" / "version.txt").read_text(encoding="utf-8").strip() + parts = version.split(".") + + assert version == RELEASE_VERSION + assert len(parts) == 3 + assert all(part.isdecimal() for part in parts) + assert all(0 <= int(part) <= 30 for part in parts) + + +def test_release_is_recorded_in_all_top_level_readmes(): + for name in README_FILES: + text = (ROOT / name).read_text(encoding="utf-8") + + assert f"funasr=={RELEASE_VERSION}" in text + assert f"releases/tag/v{RELEASE_VERSION}" in text