通过本文,您可以了解iOS和Mac端语音数据处理的功能。

场景

语音识别

阿里云的语音识别指的是将本地发布端或订阅端的音频数据转化为文字,实现流程如下:
  1. 阿里云RTC会将音频数据发送至音频识别SDK中。
  2. 音频识别SDK将音频数据发送至音频识别服务进行实时语音处理并返回识别结果。
  3. 音频识别SDK为用户提供识别结果。
详细请参见智能语音交互

方案架构图

方案架构图

调用时序图

调用时序图

接口及使用

通过调用接口subscribeAudioData得到回调数据,从回调接口onAudioSampleCallback获取音频数据,并根据业务场景使用相应的数据源。

onAudioSampleCallback接口参数如下:
参数 类型 描述
audioSource AliRtcAudioSource 音频裸数据源类型
audioSample AliRtcAudioDataSample * 音频裸数据
AliRtcAudioSource音频裸数据源类型说明如下:
枚举名 描述
AliRtcAudiosourcePub 推流音频数据
AliRtcAudiosourceSub 拉流音频数据
AliRtcAudiosourceRawData 采集音频裸数据
AliRtcAudiosourceVolume 音量
说明 采集音频裸数据为本地采集的原始音频数据,推流音频数据为经过音频3A处理后的音频数据。
AliRtcAudioDataSample音频裸数据说明如下:
参数 描述
dataPtr 裸数据
numOfSamples 音频样本点数
bytesPerSample 量化位数
numOfChannels 声道数
samplesPerSec 采样率

语音数据处理

RTC获取音频数据方式如下:

  1. 设置入会模式为音乐模式。
    接口方法:
    + (instancetype)sharedInstance:(id<AliRtcEngineDelegate>)delegate extras:(NSString *)extras;
    通过设置extras参数来控制是否为音乐模式:
    说明 extras为json字符串,如果当前使用了其他key值的extras配置,可以共存。
    {
      "user_specified_scene_mode" : "SCENE_MUSIC_MODE",
    }
    音乐模式示例代码如下所示:
    NSMutableDictionary *extrasDic = [[NSMutableDictionary alloc] init];
    [extrasDic setValue:@"ENGINE_BASIC_QUALITY_MODE" forKey:@"user_specified_engine_mode"];
    [extrasDic setValue:@"SCENE_MUSIC_MODE" forKey:@"user_specified_scene_mode"];
    NSError *parseError = nil;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:extrasDic options:NSJSONWritingPrettyPrinted error:&parseError];
    NSString *extras = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    AliRtcEngine *engine = [AliRtcEngine sharedInstance:self extras:extras];
  2. 获取音频发布端裸数据。
    注册音频裸数据。接口方法如下:
    说明 该接口必须在音频流发布成功之后调用才能生效。调用此接口后,即可开始订阅音频裸数据,裸数据通过回调接口返回。
    - (void)subscribeAudioData:(AliRtcAudioSource)audioSource;
    如果您想停止获取音频裸数据,调用以下接口:
    - (void)unSubscribeAudioData:(AliRtcAudioSource)audioSource;
    通过回调获取对应的音频裸数据。回调接口如下:
    说明 调用subscribeAudioData接口后,通过此回调获取对应的音频裸数据。
    {
    // 开始订阅(在音频流publish成功之后)
    [self.engine subscribeAudioData:(AliRtcAudiosourcePub)];
    }
    
    // 订阅的音频数据回调
    - (void)onAudioSampleCallback:(AliRtcAudioSource)audioSource audioSample:(AliRtcAudioDataSample *)audioSample {
    
        if (audioSample.dataPtr == 0) {
            //没有音频订阅数据
            return;
        }
    
        if (audioSource == AliRtcAudiosourcePub) {
            // pub数据回调
        }
    
        // 获取buffer 和 bufferSize
        int bufferSize = audioSample.numOfSamples * audioSample.bytesPerSample * audioSample.numOfChannels;
        void *audioSampleBufferPtr = NULL;
    
        if(bufferSize) {
            audioSampleBufferPtr = malloc(bufferSize);
            if(audioSampleBufferPtr) {
                memcpy(audioSampleBufferPtr, (void *)audioSample.dataPtr, bufferSize);
            }
        }
    
        // 写入文件(此处省略FILE对象的初始化和销毁等,请写在外部)    
        fwrite(audioSampleBufferPtr, 1, bufferSize, file);
    
        if (audioSampleBufferPtr) {
            free(audioSampleBufferPtr);
            audioSampleBufferPtr = NULL;
        }
    }

语音服务操作,详细请参见:智能语音交互