You need to enable JavaScript to run this app.
导航

【Java】流式节拍检测

最近更新时间2023.03.16 11:40:14

首次发布时间2023.03.16 11:40:14

实现

1. 创建handle

SAMICoreExtractorCreateParam createParam = new SAMICoreExtractorCreateParam();
createParam.sampleRate = sampleRate;
createParam.numChannel = numChannel;
createParam.maxBlockSize = max_block_size;
int ret = samiCore.SAMICoreCreateHandleByIdentify(
        SAMICoreIdentify.SAMICoreIdentify_Extractor_BeatTracking, createParam);
if (ret != SAMICoreCode.SAMI_OK) {
    System.out.println("Create SAMICoreIdentify_Extractor_BeatTracking failed, ret " + ret);
    return ret;
}else{
    createHandleDone = true;
}

2. 加载模型

String modelFileName = "model/beat_tracking/bt_streaming_espresso_v1.1.model";
SAMICoreProperty property = new SAMICoreProperty();
property.id = SAMICorePropertyId.SAMICorePropertyId_LoadModelBinary;
property.type = SAMICoreDataType.SAMICoreDataType_ModelBin;

property.dataByteArray =  FunctionHelper.readBinaryFile(modelFileName,context);
property.dataArrayLen = property.dataByteArray.length;

ret = samiCore.SAMICoreSetProperty(SAMICorePropertyId.SAMICorePropertyId_LoadModelBinary, property);
if (ret != SAMICoreCode.SAMI_OK) {
    System.out.println("BeatTracking SetProperty failed, ret " + ret);
    samiCore.SAMICoreDestroyHandle();
    return ret;
}
  1. 3.初始化buffer

inBlock = new SAMICoreBlock();
inBlock.dataType = SAMICoreDataType.SAMICoreDataType_AudioBuffer;
inAudioBuffer = new SAMICoreAudioBuffer();
inAudioBuffer.numberChannels = numChannel;
inAudioBuffer.numberSamples = createParam.maxBlockSize;
inAudioBuffer.data = new float[(int) inAudioBuffer.numberChannels][(int) inAudioBuffer.numberSamples];
inBlock.audioData = new SAMICoreAudioBuffer[1];
inBlock.audioData[0] = inAudioBuffer;
  1. 4.处理数据和获取结果

for (int numSamples = 0; numSamples < totalNumSamples;) {
    if (numSamples + inAudioBuffer.numberSamples > totalNumSamples) {
        break;
    }

    for (int i = 0; i < inAudioBuffer.numberChannels; i++) {
        for (int j = 0; j < inAudioBuffer.numberSamples; j++) {
            inAudioBuffer.data[i][j] = in_planar_float_data[i][numSamples + j];
        }
    }

    int ret = samiCore.SAMICoreProcess(inBlock, null);
    if (ret != SAMICoreCode.SAMI_OK) {
        System.out.println("BeatTracking process audio data failed, ret " + ret);
        return ret;
    }

    // 获取检测结果
    SAMICoreProperty samiCoreProperty = new SAMICoreProperty();
    ret = samiCore.SAMICoreGetPropertyById(SAMICorePropertyId.SAMICorePropertyID_FrameFeatures,samiCoreProperty);
    if (ret==SAMICoreCode.SAMI_OK && samiCoreProperty.dataObjectArray != null){
        for (Object temp:samiCoreProperty.dataObjectArray){
            SAMICoreFeatureSet feature_set = (SAMICoreFeatureSet) samiCoreProperty.dataObjectArray[0];
            for(int i = 0; i < feature_set.numFeatureTypes; ++i) {
                if(feature_set.set[i].featureID == SAMICorePropertyId.SAMICorePropertyID_FrameFeature_BEAT_TRACKING.getValue()) {
                    SAMICoreFeatureArray feature = feature_set.set[i];
                    if (feature != null){
                        float timestamp  = feature.array[0].time;
                        float beat = feature.array[0].values[0];
                        System.out.println("timestamp:" + timestamp + "; beat:" + beat);
                        System.out.println();
                    }
                }
            }
        }
    }
    numSamples = numSamples + inAudioBuffer.numberSamples;
}

5.释放handle

if (createHandleDone){
    samiCore.SAMICoreDestroyHandle();
}