语音识别模块 - 基于 FireRed ASR 模型的多语言语音转文字解决方案
FireRedASR-AED-LFireRedASR-LLM-L输入列名 | 说明 |
|---|---|
contents | 包含音频数据的数组,元素类型为字符串(文件路径或URL)。 支持本地文件路径以及tos://、s3://、http://、https://开头的远程文件链接 |
contents_ids | 包含音频数据的数组,元素类型为字符串,用于唯一标识音频 默认值:None |
处理后的数组,元素为每个音频的理解结果文本。对于处理失败的音频,返回空字符串。
如参数没有默认值,则为必填参数
参数名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
audio_src_type | str | 音频格式类型 支持的音频格式类型,包含: - tos/http 地址(audio_url) - base64 编码(audio_base64) - 二进制流(audio_binary) 可选值:["audio_binary", "audio_url", "audio_base64"] | |
model_path | str | /opt/las/models | 模型存储路径 默认值:"/opt/las/models" |
model_name | str | FireRedAsr/FireRedASR-AED-L | 模型名称 支持的FireRed系列模型: - FireRedAsr/FireRedASR-AED-L: 小模型 - FireRedAsr/FireRedASR-LLM-L: 大模型 可选值:[ "FireRedAsr/FireRedASR-AED-L", "FireRedAsr/FireRedASR-LLM-L" ] 默认值:"FireRedAsr/FireRedASR-AED-L" |
batch_size | int | 1 | 单次处理的音频样本数量 默认值:1 |
beam_size | int | 3 | 解码时的beam宽度 控制解码时的搜索空间大小,数值越大,识别准确率可能提升但速度变慢 默认值:3 |
decode_min_len | int | 0 | 最小解码长度 限制输出文本的最小长度,0表示不限制 默认值:0 |
decode_max_len | int | 0 | 最大解码长度 限制输出文本的最大长度,0表示不限制 默认值:0 |
nbest | int | 1 | AED模型输出候选数 控制输出的候选文本数量,仅AED模型有效 默认值:1 |
softmax_smoothing | float | 1.25 | AED模型softmax平滑系数 调整softmax分布的平滑程度,仅AED模型有效 默认值:1.25 |
aed_length_penalty | float | 0.6 | AED模型长度惩罚 控制输出文本长度的惩罚系数,仅AED模型有效 默认值:0.6 |
eos_penalty | float | 1.0 | AED模型终止符惩罚 控制终止符的惩罚系数,仅AED模型有效 默认值:1.0 |
repetition_penalty | float | 3.0 | LLM模型重复惩罚 控制生成文本时重复内容的惩罚系数,仅LLM模型有效 默认值:3.0 |
llm_length_penalty | float | 1.0 | LLM模型长度惩罚 控制生成文本长度的惩罚系数,仅LLM模型有效 默认值:1.0 |
temperature | float | 1.0 | 温度系数 控制生成文本的随机性(0.0-1.0) 较高值适合创造性场景,较低值适合确定性场景 默认值:1.0 |
use_fp16 | bool | False | 是否使用FP16推理 是否启用半精度浮点数加速推理,节省显存 默认值:False |
下面的代码展示了如何使用 daft 运行算子将语音转换为文字。
from __future__ import annotations import logging import os import daft from daft import col from daft.las.functions.audio.audio_asr_firered import AudioAsrFireRed from daft.las.functions.udf import las_udf if __name__ == "__main__": if os.getenv("DAFT_RUNNER", "ray") == "ray": def configure_logging(): logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S.%s".format(), ) logging.getLogger("tracing.span").setLevel(logging.WARNING) logging.getLogger("daft_io.stats").setLevel(logging.WARNING) logging.getLogger("DaftStatisticsManager").setLevel(logging.WARNING) logging.getLogger("DaftFlotillaScheduler").setLevel(logging.WARNING) logging.getLogger("DaftFlotillaDispatcher").setLevel(logging.WARNING) import ray ray.init(dashboard_host="0.0.0.0", runtime_env={"worker_process_setup_hook": configure_logging}) daft.set_runner_ray() daft.set_execution_config(actor_udf_ready_timeout=600) daft.set_execution_config(min_cpu_per_task=0) tos_dir_url = os.getenv("TOS_DIR_URL", "las-cn-beijing-public-online.tos-cn-beijing.volces.com") samples = { "audio_path": [ f"https://{tos_dir_url}/public/shared_audio_dataset/sample_normal.wav" ] } model_path = os.getenv("MODEL_PATH", "/opt/las/models") audio_src_type = "audio_url" beam_size = 3 decode_min_len = 0 decode_max_len = 100 nbest = 1 softmax_smoothing = 1.25 aed_length_penalty = 0.6 eos_penalty = 1.0 repetition_penalty = 3.0 llm_length_penalty = 1.0 temperature = 1.0 use_fp16 = True batch_size = 1 num_gpus = 1 df = daft.from_pydict(samples) # 每个UDF都需要1个GPU,如果只有一个GPU,请注释掉一个UDF的代码只运行另一个 df = df.with_column( "asr_result_aed", las_udf( AudioAsrFireRed, construct_args={ "audio_src_type": audio_src_type, "model_path": model_path, "model_name": "FireRedAsr/FireRedASR-AED-L", "batch_size": batch_size, "beam_size": beam_size, "decode_min_len": decode_min_len, "decode_max_len": decode_max_len, "nbest": nbest, "softmax_smoothing": softmax_smoothing, "aed_length_penalty": aed_length_penalty, "eos_penalty": eos_penalty, }, num_gpus=num_gpus, batch_size=1, concurrency=1, )(col("audio_path")), ) df = df.with_column( "asr_result_llm", las_udf( AudioAsrFireRed, construct_args={ "audio_src_type": audio_src_type, "model_path": model_path, "model_name": "FireRedAsr/FireRedASR-LLM-L", "batch_size": batch_size, "beam_size": beam_size, "decode_min_len": decode_min_len, "decode_max_len": decode_max_len, "repetition_penalty": repetition_penalty, "llm_length_penalty": llm_length_penalty, "use_fp16": use_fp16, "temperature": temperature, }, num_gpus=num_gpus, batch_size=1, concurrency=1, )(col("audio_path")), ) df.show() # ╭────────────────────────────────┬────────────────────────────────────────────┬───────────────────────────────────────────╮ # │ audio_path ┆ asr_result_aed ┆ asr_result_llm │ # │ --- ┆ --- ┆ --- │ # │ Utf8 ┆ Utf8 ┆ Utf8 │ # ╞════════════════════════════════╪════════════════════════════════════════════╪═══════════════════════════════════════════╡ # │ https://las-cn-beijing-publ… ┆ 人我保住了金我取到了俺老孙啥功名不要只求回 ┆ 人我保住了金我取到了俺老孙啥功名不要只求 │ # │ ┆ 到这花果山终老过… ┆ 回到这花果山中了过… │ # ╰────────────────────────────────┴────────────────────────────────────────────┴───────────────────────────────────────────╯