语音消息处理
更新时间: 2024/03/14 16:36:30
网易云信 NIM Android SDK 提供语音消息处理相关能力,包括高清语音的录制与播放功能以及语音转文字功能。
语音录制
网易云信 NIM Android SDK 提供AudioRecorder
类来支持语音的录制。
AudioRecorder
接口说明如下:
返回值 | AudioRecorder 接口 | 说明 |
---|---|---|
void | completeRecord(boolean cancel) |
完成(结束)录音,根据参数cancel ,做不同的回调:
|
void | destroyAudioRecorder() |
释放资源 |
int | getCurrentRecordMaxAmplitude() |
获取当前录音时最大振幅, 40ms 更新一次数据 |
void | handleEndRecord(boolean isSuccess, int duration) |
处理录制结束后的操作,回调IAudioRecordCallback#onRecordSuccess |
boolean | isRecording() |
是否正在录音 |
void | startRecord() |
启动(开始)录音,如果成功,会按照顺序回调IAudioRecordCallback#onRecordReady 和IAudioRecordCallback#onRecordStart |
构造录制实例
- API 原型
java/**
* 构造函数
*
* @param context 上下文
* @param recordType 录制音频类型(aac/amr)
* @param maxDuration 最长录音时长,到该长度后,会自动停止录音
* @param cb 录音过程回调
*/
public AudioRecorder(Context context, RecordType recordType,int maxDuration, IAudioRecordCallback cb);
- 参数说明
参数 | 说明 |
---|---|
context |
上下文 |
recordType |
录制音频类型(aac/amr) |
maxDuration |
最长录音时长,到该长度后,会自动停止录音 |
cb |
录音过程回调 |
IAudioRecordCallback
接口说明:
IAudioRecordCallback 接口 | 说明 |
---|---|
onRecordCancel() |
录音结束, 用户主动取消录音 |
onRecordFail() |
录音结束,出错 |
onRecordReachedMaxTime(int maxTime) |
到达指定的最长录音时间 |
onRecordReady() |
录音器已就绪,提供此接口用于在录音前关闭本地音视频播放(可选) |
onRecordStart(File audioFile, RecordType recordType) |
开始录音回调 |
onRecordSuccess(File audioFile, long audioLength, RecordType recordType) |
录音结束,成功 |
- 示例代码
java// 定义录音过程回调对象
IAudioRecordCallback callback = new IAudioRecordCallback () {
void onRecordReady() {
// 初始化完成回调,提供此接口用于在录音前关闭本地音视频播放(可选)
}
void onRecordStart(File audioFile, RecordType recordType) {
// 开始录音回调
}
void onRecordSuccess(File audioFile, long audioLength, RecordType recordType) {
// 录音结束,成功
}
void onRecordFail() {
// 录音结束,出错
}
void onRecordCancel() {
// 录音结束, 用户主动取消录音
}
void onRecordReachedMaxTime(int maxTime) {
// 到达指定的最长录音时间
}
};
// 初始化recorder
AudioRecorder recorder = new AudioRecorder(
context,
RecordType.AAC, // 录制音频类型(aac/amr)
maxDuration, // 最长录音时长,到该长度后,会自动停止录音, 默认120s
callback // 录音过程回调
);
录制控制
- 录制音频
java// 启动(开始)录音,如果成功,会按照顺序回调onRecordReady和onRecordStart。
recorder.startRecord();
- 结束/取消录制
java// 结束录音, 正常结束,或者取消录音
// cancel为true,代表取消;为false,代表结束录音。
recorder.completeRecord(cancel);
- 销毁实例
javarecorder.destroyAudioRecorder();
- 其他方法
java
// 是否正在录音
recorder.isRecording();
// 获取当前录音时最大振幅, 40ms更新一次数据。
recorder.getCurrentRecordMaxAmplitude();
// 录制达到最长录音时长时,确认当前录制
recorder.handleEndRecord(true, maxTime)
语音播放
网易云信 NIM Android SDK 提供AudioPlayer
类来支持语音播放的功能。
AudioPlayer 接口说明:
返回值 | AudioPlayer 接口 | 说明 |
---|---|---|
long | getCurrentPosition() |
获取当前音频播放进度 |
long | getDuration() |
获取音频持续时间长度 |
OnPlayListener | getOnPlayListener() |
获取 AudioPlayer 的播放进度监听 |
boolean | isPlaying() |
查询是否正在播放 |
void | seekTo(int msec) |
让播放器跳转到指定位置继续播放 |
void | setDataSource(String audioFile) |
设置音频来源 |
void | setOnPlayListener(OnPlayListener listener) |
设置播放监听 |
void | start(int audioStreamType) |
开始播放 |
void | stop() |
停止播放 |
构造播放实例
- API 原型
java/**
* 音频播放器构造函数
* @param context 上下文参数
* @param audioFile 待播放音频的文件路径
* @param listener 播放进度监听者
*/
public AudioPlayer(Context context, String audioFile, OnPlayListener listener);
- 参数说明
参数 | 说明 |
---|---|
context |
上下文参数 |
audioFile |
待播放音频的文件路径 |
listener |
播放进度监听者 |
OnPlayListener 接口说明:
OnPlayListener 接口 | 说明 |
---|---|
onCompletion() |
播放完成 |
onError(String error) |
播放过程中出错。参数为出错原因描述 |
onInterrupt() |
中断播放 |
onPlaying(long curPosition) |
播放进度报告,每隔 500ms 会回调一次,告诉当前进度。 参数为当前进度,单位为毫秒,可用于更新 UI |
onPrepared() |
文件解码完成,准备播放 |
- 示例代码
java// 定义一个播放进程回调类
OnPlayListener listener = new OnPlayListener() {
// 音频转码解码完成,会马上开始播放了
public void onPrepared() {}
// 播放结束
public void onCompletion() {}
// 播放被中断了
public void onInterrupt() {}
// 播放过程中出错。参数为出错原因描述
public void onError(String error){}
// 播放进度报告,每隔 500ms 会回调一次,告诉当前进度。 参数为当前进度,单位为毫秒,可用于更新 UI
public void onPlaying(long curPosition) {}
};
// 构造播放器对象
AudioPlayer player = new AudioPlayer(context, filePath, listener);
播放控制
- 播放音频
java// 开始播放。需要传入一个 audioStreamType 参数,表示是用听筒播放还是扬声器。
// AudioManager.STREAM_VOICE_CALL 表示使用听筒模式
// AudioManager.STREAM_MUSIC 表示使用扬声器模式
player.start(audioStreamType);
- 指定播放起点
java// 如果中途切换播放设备,重新调用 start,传入指定的 audioStreamType 即可。player 会自动停止播放,然后再以新的 streamType 重新开始播放。
// 如果需要从中断的地方继续播放,需要开发者记住已经播放到的位置,然后在 onPrepared 回调中调用 seekTo
player.seekTo(pausedPosition);
- 停止播放
javaplayer.stop();
- 其他方法
java// 获取当前音频播放进度
player.getCurrentPosition();
// 获取音频持续时间长度
player.getDuration();
// 查询是否正在播放
player.isPlaying();
// 设置音频来源
player.setDataSource(audioFile);
语音转文字
如需使用语音转文字功能,请通过云信控制台应用管理 > 产品功能 > IM即时通讯 > 全局功能申请开通语音识别功能。如果未开通功能的情况下调用接口,将返回 403
错误码。
语音转文字的原理:
- 录制音频文件(目前最大支持 60 秒)。
- 上传到云信存储服务器,返回文件 URL。
- 通过语音转文字接口传入该 URL 和相关参数,返回转换后的文字。
调用transVoiceToTextEnableForce
方法进行语音转文字。
示例代码:
javapublic void voiceToText(IMMessage msg, String sceneKey) {
AudioAttachment attachment = (AudioAttachment) msg.getAttachment();
String voiceUrl = attachment.getUrl();
String path = attachment.getPath();
refreshStartUI();
callFuture = NIMClient.getService(MsgService.class).transVoiceToTextEnableForce(voiceUrl, path, attachment.getDuration(), sceneKey, false);
callFuture.setCallback(new RequestCallback<String>() {
@Override
public void onSuccess(String param) {
voiceTransText.setText(param);
updateUI();
}
@Override
public void onFailed(int code) {
LogUtil.e(TAG, "voice to text failed, code=" + code);
voiceTransText.setText(R.string.trans_voice_failed);
failIcon.setVisibility(View.VISIBLE);
updateUI();
}
@Override
public void onException(Throwable exception) {
LogUtil.e(TAG, "voice to text throw exception, e=" + exception.getMessage());
voiceTransText.setText("参数错误");
failIcon.setVisibility(View.VISIBLE);
updateUI();
}
});
show();
}
此文档是否对你有帮助?