语音同步合成iOS SDK
引导式阅读
Others
语音同步合成iOS SDK
作者
c***r
上架时间
2025-01-17 02:17:27

语音同步合成iOS SDK

1、功能介绍

华为云提供了语音同步合成WebSocket接口,可以将文本转化为语音,并实时返回合成的音频数据。本工程将WebSocket接口封装为Objective-C接口,方便iOS客户端调用

2、您将学到什么?

iOS应用如何调用语音同步合成WebSocket接口实现语音同步合成功能。

3、前置条件

  • 1、已注册华为帐号并开通华为云,已进行实名认证
  • 2、已具备开发环境 ,支持Xcode14及以上版本,iOS11及以上。
  • 3、已获取账号对应的 Access Key(AK)和 Secret Access Key(SK)或IAM帐号及密码。请在华为云控制台“我的凭证 > 访问密钥”页面上创建和查看您的AK/SK。具体请参见 访问密钥
  • 4、已获取MetaStudio服务对应区域的项目ID,请在控制台“我的凭证 > API凭证”页面上查看项目ID。具体请参见API凭证
  • 5、本接口目前仅支持“华北-北京四”和“华东-上海一”区域使用,且必须提交工单申请开通后才能使用。
  • 6、使用接口前,需要在MetaStudio控制台服务概览页面,开通“声音合成”的按需计费。 详细操作为:单击“声音合成”卡片中的“去开通”,在弹出的“开通按需计费服务提示”对话框中,勾选同意协议。单击“确定”,开通按需计费。

4、工程说明

下载三方库:SocketRocket,添加到Xcode工程中

主要接口参数的详细说明,具体可以参考源码:

@protocol TTSpeaker <NSObject,TTSpeakWebSocketListener> /** * 开始朗读,发声,不写入本地文件。注意:此接口不支持并行调用,只支持串行调用,必须在上一次调用结束(onFinish或onError通知)后再调用下一次。 * * @param text 朗读的文字 * @param callback 执行朗读的结果通知 */ - (void)startSpeaking:(NSString *)text callback:(id<TTSpeakerCallback>)callback; /** * 开始朗读,可以自定义朗读选项:是否发声、是否写入本地文件。具体参考TTSpeakOption枚举。注意:此接口不支持并行调用,只支持串行调用,必须在上一次调用结束(onFinish或onError通知)后再调用下一次。 * * @param text 朗读的文字 * @param speakOption 朗读的选项 * @param callback 执行朗读的结果通知 */ - (void)startSpeaking:(NSString *)text speakOption:(TTSpeakerOption *)speakOption callback:(id<TTSpeakerCallback>)callback; /** 停止朗读。 */ - (void)stopSpeaking; /** * 暂停朗读。此时只暂停播放声音,不会停止接收服务端WebSocket的音频数据流。 */ - (void)pauseSpeaking; /** * 恢复朗读。 */ - (void)resumeSpeaking; /** * 获取当前朗读状态,具体参考TTSpeakState枚举。 * * @return 朗读状态 */ - (TTSSpeakState)getSpeakState; /** * 添加朗读状态监听,当朗读状态发声变更时会会上报。 * * @param listener 朗读状态监听 */ - (void)addOnSpeakStateChangeListener:(id<TTSpeakerStateChangeListener>)listener; /** * 移除朗读状态监听。 * * @param listener 朗读状态监听 */ - (void)removeOnSpeakStateChangeListener:(id<TTSpeakerStateChangeListener>)listener; @end @protocol TTSConfigurator <NSObject> /** * 设置是否为调试模式,调试模式下会额外打印调试日志(开启日志打印的前提下),并且会关闭CA证书校验。警告:正式产品禁止设置为调试模式。 * * @param isDebug 是否为调试模式 */ - (void)setDebug:(BOOL)isDebug; /** * 设置是否开启日志打印。警告:如果是调试模式,会直接打印未脱敏的信息。 * * @param isLogPrintingEnabled 是否开启日志打印 */ - (void)setLogPrintingEnabled:(BOOL)isLogPrintingEnabled; /** * 注入日志打印器,如果未注入,则使用默认日志打印器,输出到控制台。 * * @param logger 注入的日志打印器 */ - (void)setLogger:(id<TTSLogger>)logger; /** * 设置站点。 * * @param region 站点 */ - (void)setRegion:(TTSRegion *)region; /** * 设置项目Id * * @param projectId 项目Id */ - (void)setProjectId:(NSString *)projectId; /** * 设置鉴权参数。 * * @param authConfig 鉴权参数。警告:正式产品禁止将鉴权参数编码到端侧代码中,应当通过服务端下发鉴权参数,端侧再使用鉴权参数 */ - (void)setAuthConfig:(TTSAuthConfig *)authConfig; /** * 设置语音参数。 * * @param voiceConfig 语音参数。建议使用默认值 */ - (void)setVoiceConfig:(TTSVoiceConfig *)voiceConfig; @end

5、关键代码片段

5.1、初始化配置

TTSAuthConfig *authConfig = [[TTSAuthConfig alloc] init]; authConfig.username = TestData.getData.username; authConfig.password = TestData.getData.password; authConfig.domain = TestData.getData.domain; authConfig.token = @""; // 根据需要填入token TTSVoiceConfig *voiceConfig = [[TTSVoiceConfig alloc] init]; voiceConfig.speed = self.speed; voiceConfig.pitch = self.pitch; voiceConfig.volume = self.volumn; voiceConfig.voiceAssetId = [self getVoiceAssetId]; TTSRegion *region = [TTSRegion regionWithCode:TTSRegionCodeShangHai]; BOOL isDebug = self.isDebug; BOOL isLogPrintingEnabled = self.isLogPrintingEnabled; NSString *projectId = TestData.getData.projectId; TTSConfigurator *configurator = TTSSdk.sharedInstance.configurator; [configurator setDebug:isDebug]; [configurator setLogPrintingEnabled:isLogPrintingEnabled]; [configurator setRegion:region]; [configurator setProjectId:projectId]; [configurator setAuthConfig:authConfig]; [configurator setVoiceConfig:voiceConfig];

5.2、执行语音合成

/// - (IBAction)senderttsAction:(UIButton *)sender { TTSpeakerOption *speakOption = [[TTSpeakerOption alloc] init]; [TTSSdk.sharedInstance.speaker startSpeaking:SdkConfig.sharedInstance.getArticle speakOption:speakOption callback:self]; } #pragma mark - TTSpeakerCallback /** * 开始朗读的通知。 * * @param speechGroupId 音频流的组Id。同一段文字的音频流组Id一致 */ - (void)onBegin:(NSString *)speechGroupId { NSLog(@"onBegin speechGroupId:%@",speechGroupId); } /** * 正在接收朗读音频流的通知。注意:这个通知不是实际播放状态,仅代表音频流正在接收中。当收到音频流时,开始自动播放(如果配置了需要播放)。 * * @param voiceData 音频流数据 * @param speechGroupId 音频流的组Id。同一段文字的音频流组Id一致 */ - (void)onSpeaking:(NSData *)voiceData speechGroupId:(NSString *)speechGroupId { NSLog(@"voiceData:%ld,speechGroupId:%@",voiceData.length,speechGroupId); } /** * 朗读音频流接收完毕的通知。注意:这个通知不是实际播放状态,仅代表音频流传输完毕。此时很可能依然在播放中(音频流尚未播放完毕)。 * * @param allVoiceData 本段文字所有音频流数据 * @param speechGroupId 音频流的组Id。同一段文字的音频流组Id一致 */ - (void)onFinish:(NSData *)allVoiceData speechGroupId:(NSString *)speechGroupId { NSLog(@"allVoiceData:%ld,speechGroupId:%@",allVoiceData.length,speechGroupId); } /** * 朗读错误通知。警告:仅供调试参考,正式产品请重新封装错误码。 * * @param errorCode 错误码 * @param errorMsg 错误信息 */ - (void)onError:(NSString *)errorCode errorMsg:(NSString *)errorMsg { NSLog(@"errorCode:%@,errorMsg:%@",errorCode,errorMsg); }

6、参考

本示例的代码工程仅用于简单演示,实际开发过程中应严格遵循开发指南。访问以下链接可以获取详细信息:语音同步合成WebSocket接口