IM 即时通讯
Android
开发指南

语音消息处理

更新时间: 2024/01/03 10:36:23

网易云信 NIM Android SDK 提供语音消息处理相关能力,包括高清语音的录制与播放功能以及语音转文字功能。

语音录制

网易云信 NIM Android SDK 提供AudioRecorder类来支持语音的录制。

AudioRecorder接口说明如下:

返回值 AudioRecorder 接口 说明
void completeRecord(boolean cancel) 完成(结束)录音,根据参数cancel,做不同的回调:
  • 如果canceltrue,回调 IAudioRecordCallback#onRecordCancel
  • 如果为false,回调IAudioRecordCallback#onRecordSuccess
void destroyAudioRecorder() 释放资源
int getCurrentRecordMaxAmplitude() 获取当前录音时最大振幅, 40ms 更新一次数据
void handleEndRecord(boolean isSuccess, int duration) 处理录制结束后的操作,回调IAudioRecordCallback#onRecordSuccess
boolean isRecording() 是否正在录音
void startRecord() 启动(开始)录音,如果成功,会按照顺序回调IAudioRecordCallback#onRecordReadyIAudioRecordCallback#onRecordStart

构造录制实例

  • API 原型
/**
 * 构造函数
 *
 * @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) 录音结束,成功
  • 示例代码
// 定义录音过程回调对象
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 // 录音过程回调
);

录制控制

  • 录制音频
// 启动(开始)录音,如果成功,会按照顺序回调onRecordReady和onRecordStart。
recorder.startRecord();
  • 结束/取消录制
// 结束录音, 正常结束,或者取消录音
// cancel为true,代表取消;为false,代表结束录音。
recorder.completeRecord(cancel);
  • 销毁实例
recorder.destroyAudioRecorder();
  • 其他方法

// 是否正在录音
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 原型
/**
 * 音频播放器构造函数
 * @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() 文件解码完成,准备播放
  • 示例代码
// 定义一个播放进程回调类
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);

播放控制

  • 播放音频
// 开始播放。需要传入一个 audioStreamType 参数,表示是用听筒播放还是扬声器。
// AudioManager.STREAM_VOICE_CALL    表示使用听筒模式
// AudioManager.STREAM_MUSIC         表示使用扬声器模式
player.start(audioStreamType);
  • 指定播放起点
// 如果中途切换播放设备,重新调用 start,传入指定的 audioStreamType 即可。player 会自动停止播放,然后再以新的 streamType 重新开始播放。
// 如果需要从中断的地方继续播放,需要开发者记住已经播放到的位置,然后在 onPrepared 回调中调用 seekTo
player.seekTo(pausedPosition);
  • 停止播放
player.stop();
  • 其他方法
// 获取当前音频播放进度
player.getCurrentPosition();

// 获取音频持续时间长度
player.getDuration();

// 查询是否正在播放
player.isPlaying();

// 设置音频来源
player.setDataSource(audioFile);

语音转文字

如需使用语音转文字功能,请通过云信控制台应用管理 > 产品功能 > IM即时通讯 > 全局功能申请开通语音识别功能。如果未开通功能的情况下调用接口,将返回 403 错误码。

语音转文字的原理:

  • 录制音频文件(目前最大支持 60 秒)。
  • 上传到云信存储服务器,返回文件 URL。
  • 通过语音转文字接口传入该 URL 和相关参数,返回转换后的文字。

调用transVoiceToTextEnableForce方法进行语音转文字。

示例代码:

public 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();
    }
此文档是否对你有帮助?
有帮助
去反馈
  • 语音录制
  • 构造录制实例
  • 录制控制
  • 语音播放
  • 构造播放实例
  • 播放控制
  • 语音转文字