我有一个浮点数组,它是来自第三方源的原始音频数据。我想通过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
,并单独分配浮点值。