news 2026/4/23 20:12:08

HarmonyOS 各个层级的通信机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOS 各个层级的通信机制

第一部分 层级通信

一、核心思想:架构延伸与范式统一

鸿蒙的通信架构可以被看作是Android Binder范式的一次大规模延伸与统一。它将Android成熟的单设备内IPC(进程间通信)范式,通过一套新的中间层,扩展为了跨设备的RPC(远程过程调用)范式,并致力于让开发者觉得这两种调用没有区别。

为了方便类比理解,下表是整个架构的对比概览:

通信层级Android (类比)HarmonyOS (对应架构)核心思想与关系
应用层 (逻辑单元)Activity, ServiceAbility (FA/PA)从Android的组件模型演进而来,是调度和通信的基本单元。
框架层 (编程接口)Android SDK (Java/Kotlin API)ArkUI/Ability框架 (ArkTS/JS/Java API)为应用开发者提供统一的编程接口,封装底层通信复杂性。
服务管理层 (服务目录)ServiceManagerSystem Ability Manager (SAMgr)架构核心类比点:功能完全对等,是系统的“服务电话簿”,负责系统服务的注册、发现和管理。
IPC/RPC 核心层 (通信机制)Binder 驱动1. 单设备:Binder-like驱动2. 跨设备:分布式软总线 (DSoftBus)架构演进关键:在单设备保留高性能Binder-like机制;通过DSoftBus将“进程”概念扩展为“设备”,实现跨设备Binder式调用。
接口契约层AIDL (Android Interface Definition Language)鸿蒙 IDL设计理念一致:用于严格定义服务接口,保证通信双方的类型安全,是生成Proxy/Stub代码的契约。

二、逐层深入:与Android的详细对比

1. 服务管理层:从ServiceManager到SAMgr

这是理解上下层通信的第一个枢纽,两者角色完全一致。

  • Android ServiceManager:系统启动时,所有关键服务(如ActivityManagerService, WindowManagerService)都向它注册。客户端要访问服务,首先查询ServiceManager获取该服务的Binder引用。

  • 鸿蒙 SAMgr:扮演完全相同的角色。所有“系统能力”(System Ability)都向SAMgr注册,并有一个唯一的SystemAbility ID。应用或服务通过GetSystemAbility()调用,向SAMgr查询并获取对应服务的远程对象代理。

2. IPC/RPC核心层:从Binder驱动到“Binder + 软总线”

这是架构演进的核心,鸿蒙在此分层。

  • 单设备内通信 (IPC):鸿蒙使用了与Android Binder高度相似甚至优化的驱动机制(即“Binder-like”驱动)。它同样位于内核层,提供一次拷贝、高性能的进程间通信能力

  • 跨设备通信 (RPC):这是鸿蒙的创造。分布式软总线(DSoftBus)在此核心作用。

    • 角色:它不是一个具体的驱动,而是一个位于系统服务层的“通信基座”子系统。它抽象了Wi-Fi、蓝牙等物理链路,实现设备的自动发现、安全组网和高效传输。

    • 与Binder的协同:当一次服务调用被判定为跨设备时(例如,手机应用调用智慧屏的摄像头服务),本地Binder驱动会将请求递交给分布式调度子系统。该子系统通过DSoftBus建立的安全通道,将请求发送到目标设备。对于目标设备而言,它收到的是一个标准的本地Binder调用请求。DSoftBus相当于在Binder通信路径中插入了一个透明的、跨设备的“扩展坞”

3. 接口契约层:从AIDL到鸿蒙IDL

两者设计理念一脉相承,是实现安全、高效通信的保障。

  • 作用:无论是Android的AIDL还是鸿蒙的IDL,其核心作用都是定义客户端和服务端之间的通信接口(方法名、参数、返回值)。通过工具编译后,会自动生成客户端代理(Proxy)和服务端存根(Stub)代码。

  • 意义:这保证了通信双方的类型安全,并将复杂的序列化/反序列化、事务编组等操作自动化,让远程调用在代码层面看起来如同本地函数调用。

4. 轻量级设备的补充:LiteIPC

对于运行LiteOS-A内核的资源受限设备(如某些IoT设备),鸿蒙提供了LiteIPC作为一种更轻量的选择。其思想也是服务化,有类似于ServiceManager的ServiceManager来管理服务(Service)和权限。可以将它理解为在这些设备上,Binder-like机制的一个简化实现。


三、总结:通信路径全景

综合以上,可以描绘出两条清晰的通信路径:

  1. 单设备内通信路径应用/服务 (客户端)ArkTS/Java框架API→ 查询SAMgr获取服务引用 → 通过内核Binder-like驱动系统服务 (服务端)

    • 此路径与Android的AppServiceManagerBinder驱动System Service几乎一致。

  2. 跨设备通信路径设备A上的应用框架API→ 查询本地SAMgr发现服务在远端 →分布式调度子系统介入 → 通过DSoftBus安全网络通道 → 到达设备B→ 在设备B内转为本地Binder调用→ 访问设备B上的目标服务

    • 此路径是鸿蒙的核心创新,它让跨设备调用复用设备内成熟的Binder模型,实现了范式统一。

总而言之,鸿蒙的通信架构并非抛弃了Android的验证,而是在深刻理解Binder + ServiceManager这一高效范式的基础上,通过引入分布式软总线(DSoftBus)系统能力管理(SAMgr),将通信的边界从单个设备的进程之间,成功地扩展到了网络中的多个设备之间,最终实现了“一次开发,多端部署”和“超级终端”的体验。

第二部分 分布组件

以下是基于官方文档开源代码仓对这三个组件架构的整理分析,其中IDL和SAMgr的官方信息较为完整,而DSoftBus的协议细节更多依赖源码分析。

为便于快速对比理解,将它们的核心要素汇总如下表:

组件核心架构/语法要点代码仓/目录位置官方依据
IDL (接口描述语言)数据类型、接口定义、生成Proxy/Stub开发工具链 (idl)《OpenHarmony IDL工具规格及使用说明书》
分布式软总线 (DSoftBus)统一通信基座、设备发现、连接、传输/foundation/communication/dsoftbus官方子系统简介
系统能力管理框架 (SAMgr)服务注册、发现、生命周期管理/foundation/systemabilitymgr/官方SAMGR子系统说明

一、IDL接口描述语言

IDL用于严格定义跨进程或跨设备通信的服务接口,是实现RPC类型安全的基础。其核心架构和语法如下:

  • 1. 数据类型映射:IDL定义了与C++、TS等语言映射的基本类型(如intString)、可序列化的sequenceable类型、interface类型以及容器类型(如List<T>,Map<KT,VT>)。

  • 2. 接口定义语法:采用类BNF范式。一个.idl文件定义一个接口,接口内声明方法。关键语法包括:

    • 接口属性[oneway]表示异步,无返回值。

    • 方法属性:同上,但需注意异步方法不能有out/inout参数或返回值。

    • 参数方向:必须明确指定[in][out][inout]

    • 示例

      // 示例:IIdlTestService.idl interface OHOS.IIdlTestService { int TestIntTransaction([in] int data); // 同步方法,输入参数 oneway void TestStringTransaction([in] String data); // 异步方法 }
  • 3. 代码生成与使用:IDL工具(idl可执行文件)编译.idl文件,自动生成代理(Proxy)桩(Stub)代码。

    • 服务端:实现Stub类,在onRemoteRequest中处理具体业务逻辑。

    • 客户端:通过Proxy类调用方法,如同本地调用。

二、分布式软总线 (DSoftBus)

DSoftBus是鸿蒙分布式通信的“基座”,统一抽象底层网络差异,提供设备发现、连接和传输能力。由于详细的网络协议并未在公开文档中完全披露,其架构主要体现为设计思想和关键流程:

  • 1. 核心设计思想

    • 统一抽象:将Wi-Fi、蓝牙等不同物理链路统一为逻辑通信通道。

    • 自发现与自组网:设备可自动发现并连接同一局域网内的其他信任设备。

    • 安全通道:通信过程经过加密和身份认证。

  • 2. 关键流程

    • 组网(发现):服务启动后,获取在线设备列表,注册监听以感知设备上下线变化。

    • 传输(会话)

      1. 创建会话服务并注册监听。

      2. 指定设备上线后,主动建立会话。

      3. 会话建立成功后,通过该通道发送数据。

      4. 会话结束时关闭通道。

  • 3. 通信模式:支持点对点、发布/订阅等多种模式,适应不同业务场景。

  • 源码结构:核心实现位于OpenHarmony源码的/foundation/communication/dsoftbus目录下。

三、系统能力管理框架 (SAMgr)

SAMgr是所有系统服务(System Ability)的注册、发现和生命周期管理中心,类似于一个服务电话簿和调度中心。

  • 1. 核心架构:SAMgr子系统包含几个关键模块:

    • safwk:定义系统能力的实现规范,提供启动、注册API。

    • samgr:提供系统能力的注册、查询等管理API。

    • safwk_lite / samgr_lite:为轻量/小型系统提供的轻量化实现。

  • 2. 核心工作机制

    • 服务注册:每个系统服务(SA)启动时,向SAMgr注册一个唯一的整数ID和其远程对象。注册方式有静态(系统启动时)和动态(按需加载)两种。

    • 服务发现与调用:客户端(应用或其他服务)通过GetSystemAbility(SA_ID)向SAMgr查询。SAMgr返回一个代理对象,后续调用通过此代理进行,对开发者透明。

    • 生命周期管理:SAMgr负责服务的启动(OnStart)、停止(OnStop)以及崩溃后自动拉起。

    • 分布式扩展:在跨设备场景下,SAMgr可与分布式框架协同,使本地客户端能发现和调用远程设备上的系统能力。

  • 3. 源码结构:核心代码位于/foundation/systemabilitymgr/目录下,对应上述模块。

四、 总结

IDL、DSoftBus、SAMgr三者紧密协作,构成了鸿蒙分布式通信的基石:

  1. IDL定义了通信的契约(接口是什么),确保跨进程/设备调用的规范性。

  2. SAMgr扮演了服务的总机(服务在哪里),管理者所有系统能力的目录和生命周期。

  3. DSoftBus提供了通信的高速公路(数据怎么走),负责实际的数据传输,屏蔽网络复杂性。

第三部分 会话管理

一、 核心要点速览

组件核心工作机制与关键源码结构核心API与官方文档参考
IDL编译器工作流程:解析.idl文件 → 校验语法 → 生成目标语言(TS/C++)的ProxyStub代码。关键产出_proxy(客户端)、_stub(服务端) 和接口文件。工具链命令idl -gen-ts -d dir -c file.idl语法定义:数据类型、接口、方法参数的BNF范式。
DSoftBus会话管理源码目录:位于/foundation/communication/dsoftbus/core/transmission核心对象ISessionListener回调结构体。关键流程:创建会话服务(CreateSessionServer) → 打开会话(OpenSession) → 发送/接收数据 → 关闭清理。核心APICreateSessionServer,OpenSession,SendBytes,CloseSession,RemoveSessionServer架构说明:分布式通信子系统官方README。
SAMgr (系统能力管理框架)模块构成safwk(定义与启动)、samgr(注册与查询)、lite版本。核心机制:基于唯一SA ID的服务注册表与查询机制。核心APIAddSystemAbility(注册),GetSystemAbility(发现/获取)。官方介绍:SAMGR子系统架构文档。

二、 IDL编译器工作机制详解

IDL(接口描述语言)编译器的核心工作是充当“翻译官”和“代码生成器”,它将开发者定义的接口契约(.idl文件)转换为具体的、可编译的编程语言代码,实现跨进程/跨设备调用的自动化。

  1. 输入与解析

    • 输入:开发者编写的.idl文件。该文件严格遵循BNF范式定义,只能包含一个interface,且名称须与文件名相同。

    • 解析与校验:编译器首先解析文件,校验语法正确性(如接口属性、方法参数方向[in][out][inout]等)和类型合法性。

  2. 代码生成(以TS为例)编译器根据-gen-ts-gen-cpp等参数,生成三种核心文件:

    • 接口文件 (i_xxx.ts):声明了IDL中定义的所有方法,是客户端和服务端共同遵守的TypeScript接口契约

    • 代理端代码 (xxx_proxy.ts):继承自rpc.RemoteProxy。它实现了接口文件中的方法,内部将调用请求、参数序列化,并通过RPC通道发送给远端。对客户端而言,调用Proxy对象就像调用本地方法一样。

    • 桩端代码 (xxx_stub.ts):继承自rpc.RemoteObject。它接收来自Proxy的请求,反序列化参数,并调用开发者编写的实际服务实现,然后将结果序列化返回。

  3. 使用流程开发者执行命令(如idl -gen-ts -d ./output -c ./IIdlTestService.idl)生成代码后:

    • 服务端:实现具体的业务逻辑,并继承生成的Stub类

    • 客户端通过生成的Proxy类来调用远程服务。


三、 DSoftBus会话管理源码解析

DSoftBus的会话(Session)管理是实现设备间可靠数据传输的核心模块。其源码主要位于OpenHarmony代码仓的/foundation/communication/dsoftbus/core/transmission目录下。

  1. 核心数据结构:ISessionListener会话的所有事件都通过此回调接口通知给上层业务。

    // 会话监听器定义 typedef struct { int (*OnSessionOpened)(int sessionId, int result); // 会话建立结果回调 void (*OnSessionClosed)(int sessionId); // 会话关闭回调 void (*OnBytesReceived)(int sessionId, const void *data, unsigned int dataLen); // 收到字节流 void (*OnMessageReceived)(int sessionId, const void *data, unsigned int dataLen); // 收到消息 } ISessionListener;
  2. 会话生命周期管理流程一次完整的会话交互遵循以下典型流程:

    1. 创建会话服务 (CreateSessionServer):业务进程首先调用此API,传入一个唯一的会话名称(sessionName)和ISessionListener回调,向DSoftBus注册自己为一个可被连接的服务端点

    2. 打开会话 (OpenSession):当需要与某个对端设备通信时,调用此API,指定本地会话名对端会话名对端设备网络ID。DSoftBus会负责建立安全的传输通道,成功后将返回一个用于后续通信的sessionId

    3. 数据传输 (SendBytes/SendMessage):使用上一步获取的sessionId,调用发送API进行数据传输。对端在其注册的OnBytesReceivedOnMessageReceived回调中接收数据。

    4. 关闭与清理 (CloseSession,RemoveSessionServer):通信结束后,关闭指定会话。当业务不再需要该会话服务时,应调用RemoveSessionServer进行注销,释放资源。


四、 SAMgr详细API与工作机制

SAMgr(系统能力管理框架)是整个鸿蒙系统服务的“大管家”,所有系统能力(System Ability)都必须向其注册,并由其统一管理生命周期和提供查询。

  1. 架构与模块SAMgr由以下几个核心模块构成,代码位于/foundation/systemabilitymgr/目录下:

    • safwk:定义System Ability的实现规范,提供启动、注册等基础框架API。

    • samgr:提供系统能力的注册、查询等核心管理API。

    • safwk_lite / samgr_lite:为内存资源受限的轻量/小型系统提供的轻量化实现。

  2. 核心API列表与功能尽管搜索结果中没有提供完整的官方API参考手册,但综合多个技术博客和官方介绍,其最核心的API可以归纳为以下几类:

    API类别核心函数 (示例)功能描述
    服务注册AddSystemAbility(int32_t systemAbilityId, const sptr<IRemoteObject>& ability);向SAMgr注册一个系统能力。每个能力由唯一的SA ID标识。
    服务发现与获取GetSystemAbility(int32_t systemAbilityId);根据SA ID查询并获取系统能力的远程对象代理。如果服务未启动,SAMgr可能会按需拉起。
    客户端辅助SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();客户端获取SAMgr自身远程对象的标准方法,是调用上述API的前提。
    服务端基类SystemAbility::Publish(sptr<IRemoteObject> ability);系统服务在OnStart()中调用,将自身发布给SAMgr。
  3. 工作流程示例

    • 服务端注册:一个系统服务(如LocationService)启动后,在其OnStart()生命周期函数中,调用Publish(this)或通过GetSystemAbilityManager()->AddSystemAbility(LOCATION_SERVICE_ID, this)向SAMgr注册。

    • 客户端调用:应用需要定位服务时,调用GetSystemAbility(LOCATION_SERVICE_ID)。SAMgr在其注册表中查找,返回该服务的远程代理对象(Proxy)。客户端通过此代理进行RPC调用,整个过程无需关心服务所在的进程。

第四部分 鸿蒙特色

下表梳理了这三个问题的关键信息来源:

关注点核心答案概览主要信息来源分析
IDL生成的具体代码段有详细流程和代码示例。官方提供了从C/C++头文件自动生成IDL的工具(h2idl),并有完整的工作原理和生成示例。来自官方开发者博客和文档,内容具体。
DSoftBus会话建立过程仅有高层流程描述。官方文档只概括了会话创建、打开、发送数据、关闭等步骤,没有底层协议和网络交互的细节。来自开源文档网站,为高层概述,细节缺失。
SAMgr跨设备查询机制只有原理性说明。官方介绍指出SAMgr支持跨设备查询,并简述了其作为分布式系统服务“枢纽”的角色,但缺少分布式发现、路由等核心机制的详细说明。来自开源文档和技术博客,后者对原理阐述较生动。

下面将基于现有信息,对这三个问题进行详细说明。

一、IDL生成的具体代码段:h2idl工具的工作流程

官方不仅定义了IDL语法,还提供了从现有C/C++头文件(.h)自动生成IDL文件的工具,例如h2idlnapi-gen插件中的h2sa功能。其核心工作是完成从C/C++类型到IDL类型的映射和转换

1. 核心类型映射规则这是生成正确IDL代码的基础。工具内部维护了一个类型映射表,部分关键映射如下:

C/C++ 类型映射后的 IDL 类型
int32_t,intint
std::stringString
std::vector<T>List<T>
std::map<K, V>Map<K, V>
boolboolean

2. 从C++头文件到IDL文件的完整生成示例假设有一个C++头文件audio_adapter.h,定义了以下接口:

// audio_adapter.h (C++ 头文件) namespace ohos { namespace audio { class IAudioAdapter { public: virtual int32_t SetVolume(int32_t volume) = 0; virtual int32_t GetVolume(int32_t& volume) = 0; // 注意:volume是输出参数 }; } // namespace audio } // namespace ohos

使用h2idl工具转换后,会生成类似下面的IDL文件:

// 生成的 IAudioAdapter.idl package ohos.audio; ​ interface IAudioAdapter { int32_t SetVolume([in] int32_t volume); int32_t GetVolume([out] int32_t volume); // 工具自动识别并添加[out]方向 }

关键生成步骤解析

  1. 解析提取:工具(如_header_parser.py)会解析C++头文件,提取出类名、方法名、参数类型等信息。

  2. 类型转换:根据映射表,将int32_t转换为int,将std::string转换为String

  3. 推断参数方向:工具会分析C++代码。例如,对于GetVolume方法中的引用参数int32_t& volume,工具能推断其为输出参数,并在IDL中自动添加[out]标签。

  4. 生成最终IDL:按照鸿蒙IDL的语法规范,生成最终的接口文件。

二、DSoftBus会话建立的底层网络过程

关于这部分,公开的官方文档仅描述了高层的编程步骤和逻辑流程,并未深入其底层的网络协议、握手过程、编解码等实现细节。

根据文档,一次完整的会话传输流程如下:

  1. 创建会话服务:业务调用CreateSessionServer(),注册一个监听回调。

  2. 建立会话:待目标设备上线后,调用OpenSession()与其建立连接。

  3. 发送数据:会话建立成功后,使用SendBytes()等函数发送数据。

  4. 关闭会话:通信完成后,调用CloseSession()RemoveSessionServer()进行清理。

文档强调,所有设备必须位于同一局域网中,这是软总线实现自发现和自组网的基础网络约束条件。底层如何利用Wi-Fi或蓝牙等链路实现设备发现、安全连接和可靠传输,目前缺乏公开的协议细节。

三、SAMgr在分布式场景下的跨设备查询机制

官方文档确认了SAMgr(系统能力管理框架)具备查询跨设备分布式系统服务的功能。其分布式角色可以概括为“分布式服务能力的统一查询入口”

1. 核心机制描述在分布式场景下,其工作机制可以理解为:

  • 服务注册:每个设备上的本地服务(System Ability)会向本设备的SAMgr注册。

  • 跨设备查询:当应用通过GetSystemAbility()请求一个服务时,本地SAMgr会判断该服务是否在本机。

  • 分布式路由:如果不在,SAMgr会通过分布式调度机制(可能与分布式任务调度子系统dmsfwk协同),将查询请求路由到网络中的其他设备。

  • 透明调用:找到目标服务后,会返回一个跨设备的代理对象(Proxy)给调用者。后续的调用会通过分布式软总线(DSoftBus)进行跨设备RPC,但对开发者而言,调用方式与本地服务无异

2. 代码流程示意以下是一个高度简化的代码逻辑示意,展示了SAMgr如何使跨设备调用对开发者透明:

// 应用代码:调用方式与请求本地服务完全相同 // SAMgr和分布式框架在背后处理了所有跨设备逻辑 sptr<IRemoteObject> remoteObject = SystemAbilityManagerClient::GetInstance().GetSystemAbility(DISTRIBUTED_SERVICE_ID); ​ // 假设获取到的是智慧屏上的音频服务代理 sptr<IAudioService> audioProxy = iface_cast<IAudioService>(remoteObject); audioProxy->PlayMusic("song.mp3"); // 此调用实际在远程设备执行

四、总结与建议

总的来说,目前关于鸿蒙底层架构的公开信息呈现“工具与流程可见,深层协议与机制未公开”的特点。

问题当前信息状态性质
IDL生成代码段较为详细,有工具原理和示例开发规范/工具链
DSoftBus底层网络过程仅有高层API使用流程未公开的实现细节
SAMgr跨设备查询有原理描述和架构定位已公开的架构设计
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 14:52:11

智造2030:云原生、数字孪生与可持续制造的未来图景

2030年&#xff0c;一座卓越级智能工厂的日常是这样开始的&#xff1a;中央数字大脑基于全球订单波动和供应链风险&#xff0c;在数字孪生体中自动生成并仿真了三种最优排产方案&#xff1b;云原生应用集群在数秒内完成资源的弹性伸缩&#xff0c;以支持突发的高并发工艺仿真需…

作者头像 李华
网站建设 2026/4/23 14:51:02

GSE高级宏编译器:魔兽世界自动化战斗的技术实现方案

GSE高级宏编译器&#xff1a;魔兽世界自动化战斗的技术实现方案 【免费下载链接】GSE-Advanced-Macro-Compiler GSE is an alternative advanced macro editor and engine for World of Warcraft. It uses Travis for UnitTests, Coveralls to report on test coverage and the…

作者头像 李华
网站建设 2026/4/23 14:45:00

人体姿态检测与动作搜索:从入门到精通的完整指南

人体姿态检测与动作搜索&#xff1a;从入门到精通的完整指南 【免费下载链接】pose-search x6ud.github.io/pose-search 项目地址: https://gitcode.com/gh_mirrors/po/pose-search 在当今人工智能蓬勃发展的时代&#xff0c;实时人体姿态检测和智能动作搜索技术正在彻底…

作者头像 李华
网站建设 2026/4/23 12:00:35

EmotiVoice能否替代真人配音?实测结果告诉你

EmotiVoice能否替代真人配音&#xff1f;实测结果告诉你 在某短视频平台上&#xff0c;一个名为“AI小夏”的虚拟主播正用温柔又略带俏皮的语气讲述今日天气。她的声音自然流畅&#xff0c;情绪起伏恰到好处——说到晴天时轻快上扬&#xff0c;提到降温则微微低沉。观众几乎无法…

作者头像 李华
网站建设 2026/4/22 15:01:25

如何快速解决Edge-TTS语音合成地区访问限制问题

Edge-TTS是一个强大的Python语音合成库&#xff0c;让开发者能够免费使用微软Edge的在线文本转语音服务。然而&#xff0c;近期部分地区的用户在使用Edge-TTS时频繁遇到访问限制问题&#xff0c;严重影响了语音合成功能的正常使用。 【免费下载链接】edge-tts Use Microsoft Ed…

作者头像 李华
网站建设 2026/4/23 9:50:57

ChatTTS-ui语音合成实战:打造个性化语音包完整指南

ChatTTS-ui语音合成实战&#xff1a;打造个性化语音包完整指南 【免费下载链接】ChatTTS-ui 匹配ChatTTS的web界面和api接口 项目地址: https://gitcode.com/GitHub_Trending/ch/ChatTTS-ui 还在为语音合成应用缺乏特色而烦恼吗&#xff1f;ChatTTS-ui作为当前热门的开源…

作者头像 李华