Вот еще несколько подробностей о том, как я заставил это работать.
- Я скачал пример переплета . Возможно, вы захотите пропустить этот шаг, но вам действительно нужно начать с этого проекта, если вы хотите, чтобы это сработало.
Я создал цель-c библиотеку с Xcode (которую я назвал SpeechKitLibrary), которая имеет двойное назначение - одна из них - определить SpeechKitApplicationKey (которая является зависимостью extern, которая нужна SpeechKit):
const unsigned char SpeechKitApplicationKey[] = {...};
, а другой - определить класс, который использует каркас SpeechKit и связывается с ним. (в Xcode добавьте платформу SpeechKit в разделе фреймворков проекта).
Файл .m, который я написал, выглядит примерно так ... (вы можете понять, что файл .h - очень простой). Я не уверен на 100%, что вам нужно все это, но я хотел убедиться, что библиотека статических архивов, которая появилась на этом этапе, будет импортировать правильные символы. Возможно, вы сможете как-то избежать этого, но в своих экспериментах я обнаружил, что мне нужно сделать что-то подобное ...
// the SpeechKitWrapper isn't actually used - rather, it is a way to exercise all the API's that
// the binding library needs from the SpeechKit framework, so that those can be linked into the generated .a file.
@implementation SpeechKitWrapper
@synthesize status;
- (id)initWithDelegate:(id <SKRecognizerDelegate>)delegate
{
self = [super init];
if (self) {
del = delegate;
[self setStatus:@"initializing"];
SpeechKit setupWithID:@"NMDPTRIAL_ogazitt20120220010133"
host:@"sandbox.nmdp.nuancemobility.net"
port:443
useSSL:NO
delegate:nil];
NSString *text = [NSString stringWithFormat:@"initialized. sessionid = %@", [SpeechKit sessionID]];
[self setStatus:text];
SKEarcon* earconStart = [SKEarcon earconWithName:@"beep.wav"];
[SpeechKit setEarcon:earconStart forType:SKStartRecordingEarconType];
voiceSearch = [[SKRecognizer alloc] initWithType:SKDictationRecognizerType
detection:SKLongEndOfSpeechDetection
language:@"en_US"
delegate:delegate];
text = [NSString stringWithFormat:@"recognizer connecting. sessionid = %@", [SpeechKit sessionID]];
[self setStatus:text];
}
return self;
}
@end
Затем я скомпилировал / связал этот статический архив для трех разных архитектур - i386, arm6 и arm7. Makefile в BindingSample - это шаблон того, как это сделать. Но в итоге вы получаете три библиотеки - libSpeechKitLibrary- {i386, arm6, arm7} .a. Затем make-файл создает универсальную библиотеку (libSpeechKitLibraryUniversal.a) с использованием инструмента OSX lipo (1).
Только теперь вы готовы к созданию библиотеки привязок. Вы можете повторно использовать AssemblyInfo.cs в образце связывания (который покажет, как создать импорт в универсальной библиотеке для всех архитектур - и примет некоторые флаги компиляции) ...
[assembly: LinkWith ("libSpeechKitLibraryUniversal.a", LinkTarget.Simulator | LinkTarget.ArmV6 | LinkTarget.ArmV7, ForceLoad = true)]
Вы компилируете файл ApiDefinition.cs с помощью btouch согласно Makefile (я думаю, что мне нужно было повторить некоторую информацию в StructsAndEnums.cs, чтобы она работала). Обратите внимание - единственная функциональность, которую я не получил, - это "SetEarcon" - поскольку это архивная библиотека, а не фреймворк, я не могу связать wav как файл ресурсов ... и я не могу понять узнать, как заставить метод SetEarcon принять ресурс из моего пакета приложений.
using System;
using MonoTouch.Foundation;
namespace Nuance.SpeechKit
{
// SKEarcon.h
public enum SKEarconType
{
SKStartRecordingEarconType = 1,
SKStopRecordingEarconType = 2,
SKCancelRecordingEarconType = 3,
};
// SKRecognizer.h
public enum SKEndOfSpeechDetection
{
SKNoEndOfSpeechDetection = 1,
SKShortEndOfSpeechDetection = 2,
SKLongEndOfSpeechDetection = 3,
};
public static class SKRecognizerType
{
public static string SKDictationRecognizerType = "dictation";
public static string SKWebSearchRecognizerType = "websearch";
};
// SpeechKitErrors.h
public enum SpeechKitErrors
{
SKServerConnectionError = 1,
SKServerRetryError = 2,
SKRecognizerError = 3,
SKVocalizerError = 4,
SKCancelledError = 5,
};
// SKEarcon.h
[BaseType(typeof(NSObject))]
interface SKEarcon
{
[Export("initWithContentsOfFile:")]
IntPtr Constructor(string path);
[Static, Export("earconWithName:")]
SKEarcon FromName(string name);
}
// SKRecognition.h
[BaseType(typeof(NSObject))]
interface SKRecognition
{
[Export("results")]
string[] Results { get; }
[Export("scores")]
NSNumber[] Scores { get; }
[Export("suggestion")]
string Suggestion { get; }
[Export("firstResult")]
string FirstResult();
}
// SKRecognizer.h
[BaseType(typeof(NSObject))]
interface SKRecognizer
{
[Export("audioLevel")]
float AudioLevel { get; }
[Export ("initWithType:detection:language:delegate:")]
IntPtr Constructor (string type, SKEndOfSpeechDetection detection, string language, SKRecognizerDelegate del);
[Export("stopRecording")]
void StopRecording();
[Export("cancel")]
void Cancel();
/*
[Field ("SKSearchRecognizerType", "__Internal")]
NSString SKSearchRecognizerType { get; }
[Field ("SKDictationRecognizerType", "__Internal")]
NSString SKDictationRecognizerType { get; }
*/
}
[BaseType(typeof(NSObject))]
[Model]
interface SKRecognizerDelegate
{
[Export("recognizerDidBeginRecording:")]
void OnRecordingBegin (SKRecognizer recognizer);
[Export("recognizerDidFinishRecording:")]
void OnRecordingDone (SKRecognizer recognizer);
[Export("recognizer:didFinishWithResults:")]
[Abstract]
void OnResults (SKRecognizer recognizer, SKRecognition results);
[Export("recognizer:didFinishWithError:suggestion:")]
[Abstract]
void OnError (SKRecognizer recognizer, NSError error, string suggestion);
}
// speechkit.h
[BaseType(typeof(NSObject))]
interface SpeechKit
{
[Static, Export("setupWithID:host:port:useSSL:delegate:")]
void Initialize(string id, string host, int port, bool useSSL, [NullAllowed] SpeechKitDelegate del);
[Static, Export("destroy")]
void Destroy();
[Static, Export("sessionID")]
string GetSessionID();
[Static, Export("setEarcon:forType:")]
void SetEarcon(SKEarcon earcon, SKEarconType type);
}
[BaseType(typeof(NSObject))]
[Model]
interface SpeechKitDelegate
{
[Export("destroyed")]
void Destroyed();
}
[BaseType(typeof(NSObject))]
interface SpeechKitWrapper
{
[Export("initWithDelegate:")]
IntPtr Constructor(SKRecognizerDelegate del);
[Export("status")]
string Status { get; set; }
}
}
Теперь у вас есть сборка, на которую может ссылаться ваш проект приложения monotouch. Теперь важно помнить, что нужно связывать все фреймворки, которые являются зависимостями (не только SpeeckKit, но и зависимости SK) - вы делаете это, передавая mtouch некоторые дополнительные аргументы:
-gcc_flags "-F<insert_framework_path_here> -framework SpeechKit -framework SystemConfiguration -framework Security -framework AVFoundation -framework AudioToolbox"
Вот и все, ребята! Надеюсь, это было полезно ...
Если кто-нибудь (kos или иным образом) заставляет работать метод SetEarcon, пожалуйста, опубликуйте решение: -)