mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-08-03 06:17:29 +08:00
### Summary Adds FunASR as a self-hosted speech-to-text provider through its OpenAI-compatible `/v1/audio/transcriptions` endpoint. This is a focused replacement for #15526 by @Rene0422 and relates to #15448. The unrelated Markdown parser changes from the previous branch are intentionally removed so this PR contains only the FunASR provider integration. - register FunASR as a `SPEECH2TEXT` factory; - add `FunASRSeq2txt` with `sensevoice` and `http://localhost:8000/v1` defaults, an optional API key, URL normalization, and inherited transcription handling; - wire FunASR into the current local-provider schema with a prefilled local URL and official documentation link; - discover the server's `/v1/models` dynamically and expose every returned model as speech-to-text in the model picker; - use RAGFlow's existing default provider icon fallback instead of referencing a missing `funasr` asset; - list FunASR in the supported-provider documentation; - add focused backend and frontend regression tests. ### Validation - focused backend pytest suite -> `7 passed` - real CPU `funasr-server` + RAGFlow provider smoke test -> discovered `fun-asr-nano`, `sensevoice`, and `paraformer`; transcribed a real WAV as `我现在在录一段测试音频` (`10` tokens, `0.504s`) - `ruff check` and `ruff format --check` on the changed Python files - `python3 -m py_compile` on the provider and its test - JSON parse and a semantic assertion for exactly one enabled FunASR `SPEECH2TEXT` factory - focused frontend Jest test -> `2 passed` - ESLint and Prettier on all changed TypeScript files - `npm run build` -> production build succeeded (`14,181` modules transformed) - `git diff --check` ### Deployment Run FunASR separately and point the RAGFlow provider at it: ```bash pip install funasr funasr-server --device cuda --model sensevoice ``` The API key remains optional because the stock local server does not require authentication. A key can still be supplied when the endpoint is protected by a gateway. --------- Signed-off-by: LauraGPT <LauraGPT@users.noreply.github.com> Co-authored-by: LauraGPT <LauraGPT@users.noreply.github.com>
51 lines
1.3 KiB
TypeScript
51 lines
1.3 KiB
TypeScript
import {
|
|
ApiIcon,
|
|
LogOutIcon,
|
|
ModelProviderIcon,
|
|
PasswordIcon,
|
|
ProfileIcon,
|
|
TeamIcon,
|
|
} from '@/assets/icon/next-icon';
|
|
import { IconFont } from '@/components/icon-font';
|
|
import { LLMFactory } from '@/constants/llm';
|
|
import { UserSettingRouteKey } from '@/constants/setting';
|
|
import { MonitorOutlined } from '@ant-design/icons';
|
|
|
|
export const UserSettingIconMap = {
|
|
[UserSettingRouteKey.Profile]: <ProfileIcon />,
|
|
[UserSettingRouteKey.Password]: <PasswordIcon />,
|
|
[UserSettingRouteKey.Model]: <ModelProviderIcon />,
|
|
[UserSettingRouteKey.System]: <MonitorOutlined style={{ fontSize: 24 }} />,
|
|
[UserSettingRouteKey.Team]: <TeamIcon />,
|
|
[UserSettingRouteKey.Logout]: <LogOutIcon />,
|
|
[UserSettingRouteKey.Api]: <ApiIcon />,
|
|
[UserSettingRouteKey.MCP]: (
|
|
<IconFont name="mcp" className="size-6"></IconFont>
|
|
),
|
|
};
|
|
|
|
export * from '@/constants/setting';
|
|
|
|
export const LocalLlmFactories = [
|
|
LLMFactory.Ollama,
|
|
LLMFactory.Xinference,
|
|
LLMFactory.LocalAI,
|
|
LLMFactory.LMStudio,
|
|
LLMFactory.OpenAiAPICompatible,
|
|
LLMFactory.TogetherAI,
|
|
LLMFactory.Replicate,
|
|
LLMFactory.OpenRouter,
|
|
LLMFactory.HuggingFace,
|
|
LLMFactory.GPUStack,
|
|
LLMFactory.ModelScope,
|
|
LLMFactory.VLLM,
|
|
LLMFactory.RAGcon,
|
|
LLMFactory.FunASR,
|
|
];
|
|
|
|
export enum TenantRole {
|
|
Owner = 'owner',
|
|
Invite = 'invite',
|
|
Normal = 'normal',
|
|
}
|