将浮点数组转换为AVAudioPCMBuffer以进行速度识别



我有一个浮点数组,它是来自第三方源的原始音频数据。我想通过appendAudioPCMBuffer将其传递给语音识别请求,但它接受AVAudioPCMBuffer。如何将我的NSMutableArray转换为AVAudioPCMBuffer

作为参考,以下是buffer变量在传递给此函数之前的创建方式。它是用C.写的

void CallNativePlugin( const float buffer[], int size ) {
NSMutableArray *myArray = [[NSMutableArray alloc] init];
for (int i = 0; i < size; i++) {
NSNumber *number = [[NSNumber alloc] initWithFloat:buffer[i]];
[myArray addObject:number];
[delegateObject recognizeSpeechFromBuffer:myArray ];
}
}

然后,我必须获取buffer并将其传递给语音识别器(objective-c(的当前代码:

-(void) recognizeSpeechFromBuffer: (NSMutableArray*) buffer {
NSLog( @"Array length: %lu@", (unsigned long) buffer.count );

recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc] init];
recognitionRequest.shouldReportPartialResults = YES;
recognitionTask = [speechRecognizer recognitionTaskWithRequest:recognitionRequest.resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) {
BOOL isFinal = NO;
if (result) {
NSLog(@"RESULT:%@",result.bestTranscription.formattedString);
isFinal = !result.isFinal;
}
if (error) {
recognitionRequest = nil;
recognitionTask = nil;
}
}];
// Do something like [recognitionRequest appendAudioPCMBuffer:buffer];
}

由于Objective-C在CallNativePlugin中可用,假设您知道音频采样率并可以调整委托协议,则可以对其进行返工以在那里创建AVAudioPCMBuffer

// Assuming mono, sample rate ????
void CallNativePlugin( const float buffer[], int size ) {
AVAudioFormat *fmt = [[AVAudioFormat alloc] initWithCommonFormat:AVAudioPCMFormatFloat32 sampleRate:/* ?? */ channels:1 interleaved:YES];
AVAudioPCMBuffer *buf = [[AVAudioPCMBuffer alloc] initWithPCMFormat:fmt frameCapacity:size];
memcpy(buf.floatChannelData[0], buffer, sizeof(float) * size);
buf.frameLength = size;
[delegateObject recognizeSpeechFromPCMBuffer:buf];
}

如果这不可能,您可以类似地在-recognizeSpeechFromPCMBuffer:中创建一个AVAudioPCMBuffer,并单独分配浮点值。

最新更新