RTC SDK提供了獲取音頻數據的功能,您可以將獲取到的語音數據根據實際需求進行處理。通過閱讀本文,您可以了解到獲取音頻數據的方法。

使用場景

您可以將本地發布端或訂閱端的音頻數據通過阿里云語音識別服務轉換成文字,實現流程如下所示:
  1. 阿里云RTC會將音頻數據發送至音頻識別SDK中。
  2. 音頻識別SDK將音頻數據發送至音頻識別服務進行實時語音處理并返回識別結果。
  3. 音頻識別SDK為用戶提供識別結果。
更多信息,請參見智能語音交互

方案架構圖

方案架構圖

調用時序圖

調用時序圖

接口及使用

通過調用接口subscribeAudioData得到回調數據,從回調接口onAudioSampleCallback獲取音頻數據,并根據業務場景使用相應的數據源。

onAudioSampleCallback接口參數如下:
參數 類型 描述
audioSource AliRtcAudioSource 音頻裸數據源類型。
audioSample AliRtcAudioDataSample * 音頻裸數據。

語音數據處理

RTC獲取音頻數據方式如下:

  1. 設置入會模式為音樂模式。
    接口方法:
    + (instancetype)sharedInstance:(id<AliRtcEngineDelegate>)delegate extras:(NSString *)extras;
    設置extras參數為音樂模式,更多信息,請參見extras參數配置說明
    {
      "user_specified_scene_mode" : "SCENE_MUSIC_MODE",
    }
    說明 extras為JSON字符串,如果當前使用了其他key值的extras配置,可以共存。
    音樂模式示例代碼如下所示:
    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. 獲取音頻發布端裸數據。
    1. 注冊音頻裸數據,調用以下接口:
      - (void)subscribeAudioData:(AliRtcAudioSource)audioSource;
      說明 該接口必須在音頻流發布成功之后調用才能生效。調用此接口后,即可開始訂閱音頻裸數據,裸數據通過回調接口返回。
    2. 停止獲取音頻裸數據,調用以下接口:
      - (void)unSubscribeAudioData:(AliRtcAudioSource)audioSource;
    3. 通過回調獲取對應的音頻裸數據,回調接口如下所示:
      說明 調用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;
          }
      }