实现
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;
}
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;
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();
}