☰
JerryScript 在 STM32F4-Discovery 与 NuttX 上的完整移植构建与运行指南
2026/9/28 2:54:26 网站建设 项目流程
  • 语言运行时
  • 嵌入式
  • 物联网
  • 编译器

【免费下载链接】jerryscript

Ultra-lightweight JavaScript engine for the Internet of Things.

项目地址:https://gitcode.com/gh_mirrors/je/jerryscript
点击查看免费下载

本指南基于 JerryScript 官方仓库 targets/os/nuttx/README.md 整理,完整讲解如何将超轻量级 JavaScript 引擎 JerryScript 移植到 STM32F4-Discovery 开发板,并运行在 Apache NuttX 实时操作系统之上。读完本文,你将掌握从搭建交叉编译环境、配置 NuttX 内核、集成 JerryScript 应用、生成 ROMFS 文件系统镜像,到烧录固件并通过 NSH 串口 Shell 执行 JavaScript 脚本的全套流程,同时理解该移植背后的源码级实现(Kconfig 配置项、Makefile 构建参数、端口适配层与 ARM 汇编的 setjmp/longjmp 实现)。

一、移植目标与仓库文件概览

JerryScript 官方为 NuttX 提供了独立的移植目录,位于仓库的 targets/os/nuttx 下,目标平台组合为:

  • 开发板:STM32F4-Discovery(意法半导体评估板,搭载 Cortex-M4 内核的 STM32F4 系列 MCU)
  • 操作系统:NuttX(Apache 基金会下的类 POSIX 实时操作系统)
  • 文档验证环境:Ubuntu 20.04 主机,NuttX 最新实测可用版本为 10.2

该目录包含一组小而完整的移植文件,各自职责如下:

文件作用
Kconfig定义 JerryScript 在 NuttX 中的 Kconfig 菜单项(开关、优先级、栈大小)
Make.defs当CONFIG_INTERPRETERS_JERRYSCRIPT=y时,将本目录注册进 NuttX 应用构建系统
Makefile描述jerry应用的编译规则,并调用 JerryScript 的tools/build.py交叉编译核心静态库
jerry-main.cjerry命令行的入口实现:参数解析、REPL、脚本执行、调试服务器
jerry-port.cJerryScript 端口适配层:日志、行读取、fatal、时区、时间等接口的 NuttX 实现
setjmp.S 与 setjmp.hCortex-M4 浮点上下文的 setjmp/longjmp 汇编实现与类型定义
Makefile.travis用于 CI 的无交互自动构建目标(安装依赖、clone NuttX、配置、编译)

整套移植以"应用"的形式挂在 NuttX 的apps/interpreters/jerryscript路径下,随 NuttX 固件一起编译链接,最终在设备上得到一个名为jerry的 NSH 命令。

二、搭建 STM32F4-Discovery 构建环境

2.1 克隆所需项目

先在主机上创建统一的工作目录jerry-nuttx,并克隆四个项目:JerryScript 本体、NuttX 内核(10.2 分支)、NuttX 应用库(apps)、kconfig 工具以及 ST-Link 烧录工具:

# Create a base folder for all the projects. mkdir jerry-nuttx && cd jerry-nuttx git clone https://github.com/jerryscript-project/jerryscript.git git clone https://github.com/apache/incubator-nuttx.git nuttx -b releases/10.2 git clone https://github.com/apache/incubator-nuttx-apps.git apps -b releases/10.2 git clone https://bitbucket.org/nuttx/tools.git tools git clone https://github.com/texane/stlink.git -b v1.5.1-patch

执行完成后,目录结构应为:

jerry-nuttx + jerryscript | + targets | + os | + nuttx + nuttx + apps + tools + stlink

后续所有命令都假定你位于jerry-nuttx根目录下执行。

2.2 安装项目依赖

JerryScript 提供了依赖安装脚本 tools/apt-get-install-deps.sh,可先运行它补齐 JerryScript 本体的构建依赖:

# Assuming you are in jerry-nuttx folder. jerryscript/tools/apt-get-install-deps.sh

随后分别安装 NuttX 的交叉编译工具链、构建工具、以及 ST-Link 与串口通信工具:

# Toolchain dependencies of NuttX. sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi # Tool dependencies of NuttX. sudo apt install \ bison flex gettext texinfo libncurses5-dev libncursesw5-dev \ gperf automake libtool pkg-config build-essential gperf genromfs \ libgmp-dev libmpc-dev libmpfr-dev libisl-dev binutils-dev libelf-dev \ libexpat-dev gcc-multilib g++-multilib picocom u-boot-tools util-linux # ST-Link and serial communication dependencies. sudo apt install libusb-1.0-0-dev minicom

其中gcc-arm-none-eabi用于交叉编译 Cortex-M 固件;genromfs用于后续生成 ROMFS 文件系统镜像;minicom用于连接开发板串口;u-boot-tools(mkimage 等)是 NuttX 构建所需的辅助工具。

三、把 JerryScript 应用接入 NuttX 应用树

NuttX 的应用(apps)采用模块化组织,每个应用位于apps/<类别>/<应用名>目录。这里需要把 JerryScript 的移植文件放到apps/interpreters/jerryscript:

# Assuming you are in jerry-nuttx folder. mkdir -p apps/interpreters/jerryscript cp jerryscript/targets/os/nuttx/* apps/interpreters/jerryscript/ # Or more simply: # ln -s jerryscript/targets/os/nuttx apps/interpreters/jerryscript

cp与符号链接两种方式等价,后者可避免文件复制,便于同步修改。

这一步生效的机制在 Make.defs 中:当配置项CONFIG_INTERPRETERS_JERRYSCRIPT=y时,CONFIGURED_APPS会追加$(APPDIR)/interpreters/jerryscript,从而把该目录纳入 NuttX 整体构建:

ifeq ($(CONFIG_INTERPRETERS_JERRYSCRIPT),y) CONFIGURED_APPS += $(APPDIR)/interpreters/jerryscript endif

而 Kconfig 定义了三个核心配置项:

  • INTERPRETERS_JERRYSCRIPT:布尔开关,默认关闭(default n);
  • INTERPRETERS_JERRYSCRIPT_PRIORITY:jerry任务的优先级,默认 100;
  • INTERPRETERS_JERRYSCRIPT_STACKSIZE:jerry任务的栈大小(字节),默认 16384。

这些默认值在 Makefile 中被直接引用为PRIORITY与STACKSIZE,进而通过Application.mk生成 NSH 内建命令。

四、构建 kconfig-frontends 配置工具

NuttX 的图形化配置依赖kconfig-frontends工具集。如果系统包管理器已经安装了kconfig-frontends,可跳过本节;否则需要从之前克隆的tools仓库中编译安装:

# Assuming you are in jerry-nuttx folder. cd tools/kconfig-frontends ./configure \ --disable-nconf \ --disable-gconf \ --disable-qconf \ --disable-shared \ --enable-static \ --prefix=${PWD}/install make make install # Add install folder to PATH PATH=${PWD}/install/bin:$PATH

注意这里的 configure 选项:禁用了nconf/gconf/qconf三种图形前端、采用静态链接(--enable-static),安装到本地install目录,最后把该目录加入PATH,供后续menuconfig/olddefconfig使用。

五、配置 NuttX 内核并启用 JerryScript

NuttX 的构建配置全部存放在nuttx/.config文件中。首先基于官方提供的usbnsh配置模板初始化配置——该模板把 USB 作为 NSH 控制台(USB console shell):

# Assuming you are in jerry-nuttx folder. cd nuttx/tools # Configure NuttX to use USB console shell. ./configure.sh stm32f4discovery:usbnsh

默认情况下 JerryScript 处于禁用状态,需要手动开启。官方提供了两种方式:交互式menuconfig(5.1 节)或直接修改.config文件(5.2 节)。

5.1 方式一:使用 menuconfig 交互配置

# Assuming you are in jerry-nuttx folder. # Might be required to run `make menuconfig` twice. make -C nuttx menuconfig

基础配置(必选):

  • 启用System Type -> FPU support:STM32F4 带硬件浮点单元,JerryScript 数学库需要启用 FPU 支持;
  • 启用Application Configuration -> Interpreters -> JerryScript:即把CONFIG_INTERPRETERS_JERRYSCRIPT置为y。

可选配置一:启用 ROMFS,把 JavaScript 输入文件烧录进设备 flash:

  • 启用File systems -> ROMFS file system
  • 启用Application configuration -> NSH library -> Scripting Support -> Support ROMFS start-up script

可选配置二:启用 MMCSD,在开发板上挂载 micro-SD 卡。注意以下选项针对的是 STM32F4-Discovery 基板上的 micro-SD 卡槽:

  • 启用System Type -> STM32 Peripheral Support -> SDIO
  • 启用RTOS Features -> Work queue support -> High priority (kernel) worker thread
  • 启用RTOS Features -> RTOS hooks -> Custom board late initialization
  • 启用RTOS Features -> RTOS hooks -> Enable on_exit() API
  • 启用Driver Support -> MMC/SD Driver Support
  • 禁用Driver Support -> MMC/SD Driver Support -> MMC/SD write protect pin
  • 禁用Driver Support -> MMC/SD Driver Support -> MMC/SD SPI transfer support
  • 启用Driver Support -> MMC/SD Driver Support -> MMC/SD SDIO transfer support
  • 启用File systems -> FAT file system
  • 启用File systems -> FAT file system -> FAT upper/lower names
  • 启用File systems -> FAT file system -> FAT long file names

5.2 方式二:直接追加 .config 内容(无交互)

更简单的做法是把所需配置直接追加到nuttx/.config末尾。最小启用集合如下:

# Assuming you are in jerry-nuttx folder. cat >> nuttx/.config << EOL CONFIG_ARCH_FPU=y CONFIG_SCHED_ONEXIT=y CONFIG_INTERPRETERS_JERRYSCRIPT=y CONFIG_INTERPRETERS_JERRYSCRIPT_PRIORITY=100 CONFIG_INTERPRETERS_JERRYSCRIPT_STACKSIZE=16384 EOL

各选项含义:

  • CONFIG_ARCH_FPU=y:启用 FPU(对应 menuconfig 中的 FPU support);
  • CONFIG_SCHED_ONEXIT=y:启用on_exit()API(对应 RTOS hooks);
  • CONFIG_INTERPRETERS_JERRYSCRIPT=y:启用 JerryScript 应用;
  • CONFIG_INTERPRETERS_JERRYSCRIPT_PRIORITY=100:jerry任务优先级;
  • CONFIG_INTERPRETERS_JERRYSCRIPT_STACKSIZE=16384:jerry任务栈大小(字节)。

可选:启用 ROM 文件系统(ROMFS):

# Assuming you are in jerry-nuttx folder. cat >> nuttx/.config << EOL CONFIG_BOARDCTL_ROMDISK=y CONFIG_FS_ROMFS=y CONFIG_NSH_ROMFSETC=y CONFIG_NSH_ROMFSMOUNTPT="/etc" CONFIG_NSH_INITSCRIPT="init.d/rcS" CONFIG_NSH_ROMFSDEVNO=0 CONFIG_NSH_ROMFSSECTSIZE=64 CONFIG_NSH_DEFAULTROMFS=y EOL

这些选项让 NSH 把 ROMFS 挂载到/etc,并执行init.d/rcS作为启动脚本,ROMFS 设备号、扇区大小等均可按需调整。

可选:启用 MMCSD 驱动与 FAT 文件系统。以下选项针对 STM32F4-Discovery 基板上的 micro-SD 卡槽:

# Assuming you are in jerry-nuttx folder. cat >> nuttx/.config << EOL CONFIG_STM32_SDIO=y CONFIG_STM32_SDIO_DMAPRIO=0x00010000 CONFIG_MMCSD_HAVE_CARDDETECT=y CONFIG_BOARD_LATE_INITIALIZE=y CONFIG_BOARD_INITTHREAD_STACKSIZE=2048 CONFIG_BOARD_INITTHREAD_PRIORITY=240 CONFIG_SIG_SIGWORK=17 CONFIG_SCHED_WORKQUEUE=y CONFIG_SCHED_HPWORK=y CONFIG_SCHED_HPNTHREADS=1 CONFIG_SCHED_HPWORKPRIORITY=224 CONFIG_SCHED_HPWORKSTACKSIZE=2048 CONFIG_BCH=y CONFIG_ARCH_HAVE_SDIO=y CONFIG_ARCH_HAVE_SDIOWAIT_WRCOMPLETE=y CONFIG_ARCH_HAVE_SDIO_PREFLIGHT=y CONFIG_MMCSD=y CONFIG_MMCSD_NSLOTS=1 CONFIG_MMCSD_MMCSUPPORT=y CONFIG_MMCSD_SDIO=y CONFIG_FS_FAT=y CONFIG_FAT_LCNAMES=y CONFIG_FAT_LFN=y CONFIG_FAT_MAXFNAME=32 CONFIG_FAT_LFN_ALIAS_TRAILCHARS=0 CONFIG_FSUTILS_MKFATFS=y CONFIG_NSH_MMCSDSLOTNO=0 EOL

这段配置把 STM32 的 SDIO 外设、MMC/SD 驱动(SDIO 传输模式)、FAT 文件系统、板级后初始化线程以及内核工作队列一并打开,为后续挂载 SD 卡读取脚本文件做好准备。

六、为设备准备 JavaScript 输入文件

JerryScript 在设备上需要 JavaScript 源文件作为输入。根据第 5 步的选择,有两种承载方式:ROMFS(烧录进 flash)或 SD 卡(FAT32 文件系统)。

6.1 方式一:由自定义目录生成 ROMFS 镜像

如果使用了 MMCSD 方式,可跳过本节。否则需要把存放 JS 文件的目录打包成 C 头文件。受 flash 容量限制,尽量精简目录内容:

# Assuming you are in jerry-nuttx folder. mkdir jerry-example # Let hello.js be a possible JavaScript input for JerryScript. cp jerryscript/tests/hello.js jerry-example # Generate ROMFS image from a custom folder. genromfs -f romfs_img -d jerry-example # Dump image as C header file and override NuttX's default ROMFS file. xxd -i romfs_img apps/nshlib/nsh_romfsimg.h # Add const modifier to place the content to flash memory. sed -i "s/unsigned/const\ unsigned/g" apps/nshlib/nsh_romfsimg.h

流程说明:genromfs把jerry-example目录打包为 ROMFS 镜像文件;xxd -i把二进制镜像转成 C 数组并覆盖 NuttX 默认的 [nsh_romfsimg.h] 模板(注意:该头文件位于克隆的 apps 仓库中,并非 JerryScript 仓库文件);最后的sed把unsigned改成const unsigned,使镜像数据被放入只读的 flash 段而非 RAM。

仓库自带的示例 tests/hello.js 内容仅一行:print ("Hello JerryScript!");,非常适合作为 ROMFS 中的首个测试脚本。

6.2 方式二:把文件复制到 SD 卡

如果使用了 ROMFS 方式,可跳过本节。否则只需把 JS 文件复制到一张 FAT32 格式化的内存卡上,插入开发板的 micro-SD 卡槽即可。

七、编译 NuttX(含 JerryScript)

在jerry-nuttx根目录下执行:

# Assuming you are in jerry-nuttx folder. make -C nuttx

整个构建链路中,Makefile 扮演关键角色。它的libjerry目标会调用 JerryScript 的tools/build.py交叉编译四个静态库(libjerry-core.a、libjerry-ext.a、libjerry-math.a、libjerry-port.a),核心构建参数如下:

libjerry: $(JERRYSCRIPT_ROOT_DIR)/tools/build.py \ --clean \ --lto=OFF \ --jerry-cmdline=OFF \ --jerry-math=ON \ --amalgam=ON \ --mem-heap=70 \ --profile=es.next \ --compile-flag="-I${NUTTX_INCLUDE_DIR}" \ --toolchain=$(abspath $(JERRYSCRIPT_ROOT_DIR)/cmake/toolchain_mcu_stm32f4.cmake)

各参数含义:

  • --lto=OFF:关闭链接期优化,避免交叉链接阶段与 NuttX 工具链产生兼容问题;
  • --jerry-cmdline=OFF:不构建桌面版命令行程序,因为 NuttX 侧使用自带的jerry-main.c;
  • --jerry-math=ON:启用 JerryScript 内置数学库(jerry-math),替代 libm;
  • --amalgam=ON:使用合并(amalgamated)单文件构建方式,减少目标文件数量;
  • --mem-heap=70:内部堆大小设为 70 KB,这是面向 MCU 场景的紧凑配置;
  • --profile=es.next:采用 profiles/es.next.profile 功能集,启用完整的 ES.Next 特性;
  • --compile-flag="-I${NUTTX_INCLUDE_DIR}":把 NuttX 的include目录加入头文件搜索路径;
  • --toolchain=cmake/toolchain_mcu_stm32f4.cmake:指定交叉编译工具链文件。

工具链文件 cmake/toolchain_mcu_stm32f4.cmake 定义了目标平台:armv7l/STM32F4,编译标志为-mlittle-endian -mthumb -mcpu=cortex-m4 -march=armv7e-m -mfpu=fpv4-sp-d16 -mfloat-abi=hard,编译器为arm-none-eabi-gcc,即针对带单精度 FPU 的 Cortex-M4 硬浮点 ABI 生成代码。

库文件构建完成后,通过copylibs目标复制到应用目录,$(firstword $(AR)) x $@逐个解包进 NuttX 链接;ASRCS = setjmp.S、CSRCS = jerry-port.c、MAINSRC = jerry-main.c则把三个移植源文件直接编入应用。最终产物是nuttx.bin固件镜像。

八、烧录固件到开发板

连接开发板的 Mini-USB 口(用于供电与烧录),编译 ST-Link 工具并烧写:

# Assuming you are in jerry-nuttx folder. make -C stlink release sudo stlink/build/Release/st-flash write nuttx/nuttx.bin 0x8000000

0x8000000是 STM32F4 内部 flash 的起始地址,st-flash会把nuttx.bin从该地址开始写入。

九、连接设备串口

连接开发板的 Micro-USB 口(用于串口通信)。设备在主机上通常显示为/dev/ttyACM0,使用minicom以 115200 波特率连接:

sudo minicom --device=/dev/ttyACM0 --baud=115200

在minicom中通过按键组合CTRL-A -> Z -> U设置Add Carriage Ret(回车换行)选项。可能需要按下开发板的RESET键并在控制台上多次按Enter,NSH 提示符才会出现:

NuttShell (NSH) NuttX-10.2.0 nsh>

十、在 NSH 中运行 JerryScript

10.1 无输入文件运行(内置演示)

直接在nsh>提示符后输入jerry不带任何参数:

NuttShell (NSH) NuttX-10.2.0 nsh> jerry No input files, running a hello world demo: Hello world 5 times from JerryScript

无文件输入时,jerry先输出提示并运行一段内置的 hello world 演示。

10.2 运行 ROMFS 中的脚本

如果启用了 ROMFS,脚本位于挂载点/etc下,直接以路径传入:

NuttShell (NSH) NuttX-10.2.0 nsh> jerry /etc/hello.js

10.3 运行 SD 卡中的脚本

启用 MMCSD 后,NuttX 初始化完成时 SD 卡读卡器显示为/dev/mmcsd0。先挂载再执行:

NuttShell (NSH) NuttX-10.2.0 nsh> mount -t vfat /dev/mmcsd0 /mnt nsh> jerry /mnt/hello.js

十一、jerry 命令行的源码级解析

设备上的jerry命令由 jerry-main.c 实现,其执行逻辑可分为三个阶段。

参数解析阶段:循环扫描命令行参数,最多接受 16 个参数(JERRY_MAX_COMMAND_LINE_ARGS)。支持的选项与官方桌面版一致的子集:

选项说明
-h/--help打印用法说明
--log-level [0-3]设置日志级别(0=错误、1=警告、2=信息、3=调试,对应JERRY_LOG_LEVEL_*)
--mem-stats启用内存统计(JERRY_INIT_MEM_STATS),并把日志级别设为 DEBUG
--show-opcodes打印执行的字节码(JERRY_INIT_SHOW_OPCODES | JERRY_INIT_SHOW_REGEXP_OPCODES)
--start-debug-server启动调试服务器
--debug-server-port [port]指定调试服务器端口,默认 5001

其余非选项参数被收集为脚本文件名列表(file_names[])。

初始化与执行阶段:调用jerry_init(flags)初始化引擎;若开启了调试服务器,则通过扩展库jerryx_debugger_after_connect建立 TCP 与 WebSocket 双重调试通道(见 debugger-ws.c 等扩展实现);随后把assert、gc、print三个原生函数注册为全局对象方法(jerryx_register_global)。若无文件参数,进入jerryx_repl交互式 REPL 循环;否则逐个调用jerryx_source_exec_script执行脚本文件,出现异常时打印未处理异常并以退出码 1 终止。

收尾阶段:调用jerry_run_jobs处理挂起的 Promise 微任务队列,最后jerry_cleanup释放引擎资源。

十二、端口适配层与底层支撑实现

JerryScript 引擎与宿主系统之间通过"端口层"解耦,NuttX 移植的端口实现集中在 jerry-port.c,全部接口都很精简:

  • jerry_port_log:日志输出,NuttX 移植中为空实现(消息被忽略),因为控制台输出统一走print扩展;
  • jerry_port_line_read:读取一行输入,返回 NULL(REPL 输入通道在 jerry-main.c 中另行处理);
  • jerry_port_fatal:致命错误处理,直接以错误码调用exit()终止进程;
  • jerry_port_local_tza:本地时区偏移,移植中固定返回 0,即"我们活在 UTC";
  • jerry_port_current_time:当前时间,移植中返回 0(设备通常无 RTC,时间功能需按需扩展)。

另一个关键底层依赖是setjmp/longjmp。JerryScript 的错误处理依赖这两个函数,而 STM32F4 使用了 FPU 寄存器,NuttX 自带的实现可能不保存浮点上下文,因此移植目录专门提供了 setjmp.S 与 setjmp.h。jmp_buf定义为 14 个uint64_t元素;setjmp用stmia保存r4-r11与返回地址lr,str保存栈指针sp,再用vstm保存浮点寄存器s16-s31;longjmp按对称顺序恢复这些寄存器,并把val作为setjmp的返回值(若val为 0 则强制返回 1,以区分"直接调用返回 0"与"longjmp 返回"两种情形)。

十三、自动化构建参考(CI 脚本)

Makefile.travis 给出了完全无交互的自动化构建流程,与本文手动步骤一一对应,可作为脚本化移植的参考:

  • install-apt-get-deps:apt 安装gcc-arm-none-eabi与gperf;
  • install-kconfig:克隆 nuttx/tools 并本地编译安装 kconfig-frontends(含autoreconf --force --install兼容处理);
  • install-clone-nuttx:克隆 nuttx 与 apps 的releases/10.2分支;
  • script-add-jerryscript-app:用ln -s ../../jerryscript/targets/os/nuttx ../apps/interpreters/jerryscript建立应用链接;
  • script-configure-usbnsh:执行configure.sh stm32f4discovery:usbnsh;
  • script:向.config追加CONFIG_ARCH_FPU=y、CONFIG_SCHED_ONEXIT=y、CONFIG_INTERPRETERS_JERRYSCRIPT=y三项,运行make olddefconfig后执行make -C ../nuttx完成固件构建。

十四、常见问题与关键要点

  1. 菜单配置需运行两次:官方文档提示make menuconfig可能需要运行两次,以刷新应用菜单树;
  2. ROMFS 与 MMCSD 二选一:两种脚本承载方式互斥,选择其一即可,第 6 步会明确"Skip this section"提示;
  3. 注意 flash 容量:生成 ROMFS 镜像前尽量精简目录体积,STM32F4-Discovery 的 flash 有限;
  4. 堆大小与功能集可调:--mem-heap=70(70 KB 堆)与--profile=es.next是 Makefile 中针对该板卡的默认取舍,开发者可按内存预算调整;
  5. 串口参数固定:使用 115200 波特率,并通过minicom的CTRL-A -> Z -> U开启回车选项,否则输入可能无法被正确解析;
  6. USB 双口分工:Mini-USB 负责供电与 ST-Link 烧录,Micro-USB 负责串口控制台,二者不要混淆。

至此,一套"STM32F4-Discovery + NuttX 10.2 + JerryScript"的嵌入式 JavaScript 运行环境已完整打通:从交叉编译、内核配置、应用集成、脚本烧录到设备端执行,均可按本文步骤复现;而 Kconfig、Makefile、jerry-main.c、jerry-port.c 与 setjmp.S 等文件,则为二次定制(如新增端口接口、调整任务栈、接入调试器)提供了清晰的切入点。

  • 语言运行时
  • 嵌入式
  • 物联网
  • 编译器

【免费下载链接】jerryscript

Ultra-lightweight JavaScript engine for the Internet of Things.

项目地址:https://gitcode.com/gh_mirrors/je/jerryscript
点击查看免费下载

相关推荐

上一篇:SpeechBrain 实战:使用 GigaSpeech 数据集训练 CTC 与 Transducer 语音识别模型
下一篇:如何快速获取国家中小学智慧教育平台电子课本:一键下载PDF教材完整指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询