语音转文字场景实践
准备工作
在开始之前,请确保已创建应用并完成客户端 SDK 集成。
提示
本文以集成 5.X IMKit SDK 为例,实现语音转文字功能。如您使用 IMLib SDK,需要主动获取 HQVoiceMessage
的 FileUrl
(远端地址),业务侧调用其他三方 SDK 将语音消息成功转文字后,调用 RongCoreClient
的 setMessageExtra
方法将转换后的信息,放到消息的附加信息中自行实现此功能。Web 端不支持使用此文档实现语音转文字能力。
语音转文字功能:IMKit SDK 录制语音文件(支持最长 60 秒的音频)。当您进入聊天界面后,可以手动长按消息列表中的语音消息气泡,在出现的菜单中,单击转文字后,业务侧调用其他三方 SDK 将语音消息成功转文字后,展示语音对应的文字信息。具体支持的语言以三方能力为准。
效果示例


操作步骤
1. 自定义长按消息菜单
在会话页面长按消息可打开弹窗,根据当前消息类型判断,如果是高清语音消息,增加"转文字"选项。在 onMessageItemLongClick
回调中做"转文字"的处理,您的业务侧调用其他第三方的 API,获取到转换后的信息设置到 Message 的 Extra
中。调用 refreshMessage
后,SDK 自动刷新消息展示信息。
- Android
- iOS
Java
MessageItemLongClickAction speechToText =
new MessageItemLongClickAction.Builder()
.titleResId(R.string.speech_to_text)
.actionListener(
new MessageItemLongClickAction.MessageItemLongClickListener() {
@Override
public boolean onMessageItemLongClick(
Context context, UiMessage uiMessage) {
// 获取 message 实体
Message message = uiMessage.getMessage();
// 给当前 message 的 extra 赋值
message.setExtra("1231234");
// 将 message 的 extra 存到本地数据库中
RongCoreClient.getInstance().setMessageExtra(message.getMessageId(),"1231234",null);
// 刷新单条 Message 信息
IMCenter.getInstance().refreshMessage(message);
return true;
}
})
.showFilter(
new MessageItemLongClickAction.Filter() {
@Override
public boolean filter(UiMessage uiMessage) {
//判断是高清语音消息,显示转文字 Item
Message message = uiMessage.getMessage();
return (message.getContent() instanceof HQVoiceMessage);
}
})
.build();
MessageItemLongClickActionManager.getInstance()
.addMessageItemLongClickAction(speechToText);
Objective C
// 1.重写长按事件,添加转文字按钮:
- (NSArray<UIMenuItem *> *)getLongTouchMessageCellMenuList:(RCMessageModel *)model {
NSMutableArray<UIMenuItem *> *menuList = [[super getLongTouchMessageCellMenuList:model] mutableCopy];
if ([model.content isKindOfClass:[RCHQVoiceMessage class]]) {
UIMenuItem *forwardItem = [[UIMenuItem alloc] initWithTitle:@"语音转文字"
action:@selector(audioToString)];
[menuList addObject:forwardItem];
}
return menuList.copy;
}
// 2. 实现点击方法做"转文字"的处理,您的业务侧调用其他第三方的 API,获取到转换后的信息设置到 Message 的 Extra 中:
// 子类页面声明属性
@property (nonatomic, strong) RCMessageModel *currentSelectedModel;
// 实现点击方法
- (void)audioToString {
// 实现业务层的语音转文字功能
NSString *result = @"语音转文字";
[[RCCoreClient sharedCoreClient] setMessageExtra:self.currentSelectedModel.messageId value:result completion:^(BOOL ret) {
dispatch_async(dispatch_get_main_queue(), ^{
self.currentSelectedModel.extra = result;
self.currentSelectedModel.cellSize = CGSizeZero;
[self.conversationMessageCollectionView reloadData];
RCMessageModel *model = [self.conversationDataRepository lastObject];
if (model.messageId == self.currentSelectedModel.messageId ) {
[self scrollToBottomAnimated:YES];
}
});
}];
}
2. 修改高清语音消息的展示样式
Android 端实现流程
- 将 SDK 默认的
HQVoiceMessageItemProvider
类,rc_item_hq_voice_message.xml
资源复制到您项目目录下重新命名。 - 调用
replaceMessageProvider
方法替换掉 SDK 默认的消息展示模板。替换后,SDK 在渲染消息时,会自动调用该类型消息的自定义模板进行渲染。 - 在自定义
rc_item_hq_voice_message.xml
中增加转换文字后的展示 View,自定义HQVoiceMessageItemProvider
中增加判断,如果消息附加信息不为空,则展示转换后的文字。
代码类参考:
iOS 端实现流程
导入下面的类,在聊天页面注册绑定自定义的 Cell:
- iOS 端 CustomHQVoiceMessageCell.m
- iOS 端 CustomVoicePlayer.m
- iOS 端 CustomHQVoiceMsgDownloadManager.m
- iOS 端 CustomVoicePlayer.h
- iOS 端 CustomHQVoiceMsgDownloadInfo.h
- iOS 端 CustomHQVoiceMessageCell.h
- iOS 端 CustomHQVoiceMsgDownloadManager.h
- iOS 端 CustomHQVoiceMsgDownloadInfo.m
Objective C
- (void)registerCustomCellsAndMessages {
[super registerCustomCellsAndMessages];
///注册自定义语音转文字消息 Cell
[self registerClass:[CustomHQVoiceMessageCell class] forMessageClass:[RCHQVoiceMessage class]];
}
3. 修改语音消息采样率
因市场上大多厂商的转音转文字功能,支持的是 16K 的采样率,所以如需修改语音消息采样率,您需要集成 IMKit 源码,在下图位置增加采样率设置信息。
Android 端修改位置
Java
mMediaRecorder.setAudioSamplingRate(SamplingRate.RC_SAMPLE_RATE_16000.getValue());

iOS 端修改位置
Objective C
rcHQVoiceRecorderHandler.recordSettings = @{
AVFormatIDKey : @(kAudioFormatMPEG4AAC_HE),
AVNumberOfChannelsKey : @1,
AVEncoderBitRateKey : @(16000)
};
