Giter VIP home page Giter VIP logo

watson-ios-sdk's Introduction

Watson Developer Cloud iOS SDK

Build Status Carthage Compatible codecov.io Docs Swift 2.1.1

The Watson Developer Cloud iOS SDK is a collection of services to allow developers to quickly add Watson Cognitive Computing services to their Swift iOS applications.

Visit our Quickstart Guide to build your first iOS app with Watson!

The Watson Developer Cloud iOS SDK is currently in beta.

Table of Contents

Upgrading to Xcode 7.3

Apple released Xcode 7.3 and Swift 2.2 on March 21, 2016. To use the Watson Developer Cloud iOS SDK with Xcode 7.3 you will have to rebuild all dependencies (including those with pre-built binaries) because there is no binary compatability between Swift 2.1 and Swift 2.2.

Please use the terminal to navigate to your project directory and execute the following command: carthage update --platform iOS --no-use-binaries

This will rebuild all dependencies (including those with pre-built binaries) using Xcode 7.3 and Swift 2.2. Be aware that you will receive many warnings related to deprecations that will occur in Swift 3. These warnings do not affect the operation of the SDK and will be addressed in future releases of our dependencies.

Installation

The Watson Developer Cloud iOS SDK requires third-party dependencies such as ObjectMapper and Alamofire. The dependency management tool Carthage is used to help manage those frameworks. The recommended version of Carthage is v0.11 or higher.

There are two main methods to install Carthage. The first method is to download and run the Carthage.pkg installer. You can locate the latest release here.

The second method of installing is using Homebrew for the download and installation of carthage with the following commands

brew update && brew install carthage

Once the dependency manager is installed, the next step is to download the needed frameworks for the SDK to the project path. Make sure you are in the root of the project directory and run the following command. All of the frameworks can be found on the filesystem directory at location ./Carthage/Build/iOS/

carthage update --platform iOS

For more details on using the iOS SDK in your application, please review the Quickstart Guide.

Frameworks Used:

IBM Watson Services

Getting started with Watson Developer Cloud and Bluemix

The IBM Watson™ Developer Cloud (WDC) offers a variety of services for developing cognitive applications. Each Watson service provides a Representational State Transfer (REST) Application Programming Interface (API) for interacting with the service. Some services, such as the Speech to Text service, provide additional interfaces.

IBM Bluemix™ is the cloud platform in which you deploy applications that you develop with Watson Developer Cloud services. The Watson Developer Cloud documentation provides information for developing applications with Watson services in Bluemix. You can learn more about Bluemix from the following links:

The IBM Bluemix documentation, specifically the pages What is Bluemix? and the Bluemix overview. IBM developerWorks, specifically the IBM Bluemix section of IBM developerWorks and the article that provides An introduction to the application lifecycle on IBM Bluemix.

Alchemy Language

The AlchemyLanguage API utilizes sophisticated natural language processing techniques to provide high-level semantic information about your content.

AlchemyLanguage Features
  • Entity Extraction
  • Sentiment Analysis
  • Keyword Extraction
  • Concept Tagging
  • Relation Extraction
  • Taxonomy Classification
  • Author Extraction
  • Language Detection
  • Text Extraction
  • Microformats Parsing
  • Feed Detection
Requirements
  • Review the original AlchemyLanguage API here
  • An Alchemy API Key
Usage

Instantiate an AlchemyLanguage object and set its api key via a TokenAuthenticationStrategy

let alchemyLanguage = AlchemyLanguage(apiKey: "your-apikey-here")

API calls are instance methods, and model class instances are returned as part of our callback.

e.g.

alchemyLanguage.getEntities(requestType: .URL,
  html: nil,
  url: "http://www.google.com",
  text: nil) {

    (error, entities) in

    // returned data is inside "entities" in this case
    // code here

}

Alchemy Vision

AlchemyVision is an API that can analyze an image and return the objects, people, and text found within the image. AlchemyVision can enhance the way businesses make decisions by integrating image cognition.

Links
  • AlchemyVision API docs here
  • Try out the demo
Requirements
Usage

Instantiate an AlchemyVision object and set its api key

let alchemyVision = AlchemyVision(apiKey: "your-apikey-here")

API calls are instance methods, and model class instances are returned as part of our callback.

e.g.

alchemyVision.recognizeFaces(VisionConstants.ImageFacesType.FILE,
    image: imageFromURL!,
    completionHandler: { imageFaceTags, error in

	// code here

})

Dialog

The IBM Watson Dialog service provides a comprehensive and robust platform for managing conversations between virtual agents and users through an application programming interface (API). Developers automate branching conversations that use natural language to automatically respond to user questions, cross-sell and up-sell, walk users through processes or applications, or even hand-hold users through difficult tasks.

To use the Dialog service, developers script conversations as they would happen in the real world, upload them to a Dialog application, and enable back-and-forth conversations with a user.

Instantiate the Dialog service:

let dialog = Dialog(username: "your-username-here", password: "your-password-here")

Create a Dialog application by uploading a Dialog file:

var dialogID: Dialog.DialogID?
dialog.createDialog(dialogName, fileURL: dialogFile) { dialogID, error in
	self.dialogID = dialogID
}

Start a conversation with the Dialog application:

var conversationID: Int?
var clientID: Int?
dialog.converse(dialogID!) { response, error in
	// save conversation parameters
	self.conversationID = response?.conversationID
	self.clientID = response?.clientID

	// print message from Watson
	print(response?.response)
}

Continue a conversation with the Dialog application:

dialog.converse(dialogID!, conversationID: conversationID!,
	clientID: clientID!, input: input) { response, error in

	// print message from Watson
	print(response?.response)
}

The following links provide additional information about the IBM Watson Dialog Service:

Language Translation

The IBM Watson™ Language Translation service provides an Application Programming Interface (API) that lets you select a domain, customize it, then identify or select the language of text, and then translate the text from one supported language to another.

How to instantiate and use the Language Translation service:

let languageTranslation = LanguageTranslation(username: "your-username-here", password: "your-password-here")
languageTranslation.getIdentifiableLanguages({(languages:[LanguageTranslation.IdentifiableLanguage]?, error) in

	// code here
})

The following links provide more information about the Language Translation service:

Natural Language Classifier

The IBM Watson™ Natural Language Classifier service uses machine learning algorithms to return the top matching predefined classes for short text inputs.

How to instantiate and use the Natural Language Classifier service:

let naturalLanguageClassifier = NaturalLanguageClassifier(username: "your-username-here", password: "your-password-here")

naturalLanguageClassifier.classify(self.classifierIdInstanceId, text: "is it sunny?", completionHandler:{(classification, error) in

	// code here
})

The following links provide more information about the Natural Language Classifier service:

Personality Insights

The IBM Watson™ Personality Insights service provides an Application Programming Interface (API) that enables applications to derive insights from social media, enterprise data, or other digital communications. The service uses linguistic analytics to infer personality and social characteristics, including Big Five, Needs, and Values, from text.

let personalityInsights = PersonalityInsights(username: "your-username-here", password: "your-password-here")

personalityInsights.getProfile("Some text here") { profile, error in

    // code here
}

The following links provide more information about the Personality Insights service:

Speech to Text

The IBM Watson Speech to Text service enables you to add speech transcription capabilities to your application. It uses machine intelligence to combine information about grammar and language structure to generate an accurate transcription. Transcriptions are supported for various audio formats and languages.

Recorded Audio

The following example demonstrates how to use the Speech to Text service to transcribe an audio file.

let bundle = NSBundle(forClass: self.dynamicType)
guard let fileURL = bundle.URLForResource("filename", withExtension: "wav") else {
	print("File could not be loaded.")
	return
}

let speechToText = SpeechToText(username: "your-username-here", password: "your-password-here")
let settings = SpeechToTextSettings(contentType: .WAV)
let failure = { (error: NSError) in print(error) }

speechToText.transcribe(fileURL, settings: settings, failure: failure) { results in
	if let transcription = results.last?.alternatives.last?.transcript {
   		print(transcription)
   }
}

Streaming Audio

Audio can also be streamed from the microphone to the Speech to Text service for real-time transcriptions. The following example demonstrates how to use the Speech to Text service with streaming audio. (Unfortunately, the microphone is not accessible from within the Simulator. Only applications on a physical device can stream microphone audio to Speech to Text.)

let speechToText = SpeechToText(username: "your-username-here", password: "your-password-here")

var settings = SpeechToTextSettings(contentType: .L16(rate: 44100, channels: 1))
settings.continuous = true
settings.interimResults = true

let failure = { (error: NSError) in print(error) }
let stopStreaming = speechToText.transcribe(settings, failure: failure) { results in
	if let transcription = results.last?.alternatives.last?.transcript {
		print(transcription)
	}
}

// Streaming will continue until either an end-of-speech event is detected by
// the Speech to Text service or the `stopStreaming` function is executed.

Custom Capture Sessions

Advanced users who want to create and manage their own AVCaptureSession can construct an AVCaptureAudioDataOutput to stream audio to the Speech to Text service. This is particularly useful for users who would like to visualize an audio waveform, save audio to disk, or otherwise access the microphone audio data while simultaneously streaming to the Speech to Text service.

The following example demonstrates how to use an AVCaptureSession to stream audio to the Speech to Text service.

class ViewController: UIViewController {
    var captureSession: AVCaptureSession?

    override func viewDidLoad() {
        super.viewDidLoad()

        let speechToText = SpeechToText(username: "your-username-here", password: "your-password-here")

        captureSession = AVCaptureSession()
        guard let captureSession = captureSession else {
            return
        }

        let microphoneDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeAudio)
        let microphoneInput = try? AVCaptureDeviceInput(device: microphoneDevice)
        if captureSession.canAddInput(microphoneInput) {
            captureSession.addInput(microphoneInput)
        }

        var settings = SpeechToTextSettings(contentType: .L16(rate: 44100, channels: 1))
        settings.continuous = true
        settings.interimResults = true

        let failure = { (error: NSError) in print(error) }
        let outputOpt = speechToText.createTranscriptionOutput(settings, failure: failure) { results in
            if let transcription = results.last?.alternatives.last?.transcript {
                print(transcription)
            }
        }

        guard let output = outputOpt else {
            return
        }
        let transcriptionOutput = output.0
        let stopStreaming = output.1

        if captureSession.canAddOutput(transcriptionOutput) {
            captureSession.addOutput(transcriptionOutput)
        }

        captureSession.startRunning()
    }

    // Streaming will continue until either an end-of-speech event is detected by
    // the Speech to Text service, the `stopStreaming` function is executed, or
    // the capture session is stopped.
}

Additional Information

The following links provide additional information about the IBM Speech to Text service:

Text to Speech

The Text to Speech service gives your app the ability to synthesize spoken text in a variety of voices.

Create a TextToSpeech service:

let textToSpeech = TextToSpeech(username: "your-username-here", password: "your-password-here")

To call the service to synthesize text:

textToSpeech.synthesize("Hello World") { 
    data, error in
	
    if let data = data {
	     // code here
	}
}

When the callback function is invoked, and the request was successful, the data object is an NSData structure containing WAVE formatted audio in 48kHz and mono-channel.

If you wish to play the audio through the device's speakers, create an AVAudioPlayer with that NSData object:

let audioPlayer = try AVAudioPlayer(data: data)
audioPlayer.prepareToPlay()
audioPlayer.play()

The Watson TTS service contains support for many voices with different genders, languages, and dialects. For a complete list, see the documentation or call the service's to list the possible voices in an asynchronous callback:

textToSpeech.listVoices({
	voices, error in
	  // code here

})

The following voices can be used:

Voice Language Gender
de-DE_BirgitVoice German Female
de-DE_DieterVoice German Male
en-GB_KateVoice English (British) Female
en-US_AllisonVoice English (US) Female
en-US_LisaVoice English (US) Female
es-ES_EnriqueVoice Spanish (Castilian) Male
es-ES_LauraVoice Spanish (Castilian) Female
es-US_SofiaVoice Spanish (North American) Female
fr-FR_ReneeVoice French Female
it-IT_FrancescaVoice Italian Female

To use the voice, such as Kate's, specify the voice identifier in the synthesize method:

textToSpeech.synthesize("Hello World", voice: "en-GB_KateVoice", "oncompletion: {
	data, error in

	if let data = data {
		// code here
	}
)

The following links provide more information about the Text To Speech service:

Authentication

IBM Watson Services are hosted in the Bluemix platform. Before you can use each service in the SDK, the service must first be created in Bluemix, bound to an Application, and you must have the credentials that Bluemix generates for that service. Alchemy services use a single API key, and all the other Watson services use a username and password credential. For the services that have username and password credentials, a web service is used to grant a temporary Watson token to the client that can be used for subsequent calls.

It is not advisable in a full production app to embed the username and passwords in your application, since the application could be decompiled to extract those credentials. Instead, these credentials should remain on a deployed server, and should handle fetching the Watson token on behalf of the mobile application. Since there could be many strategies one could take to authenticate with Bluemix, we abstract the mechanism with a collection of classes that use the protocol AuthenticationStrategy.

To quickly get started with the SDK, you can use a BasicAuthenticationStrategy when you create a service. You can specify the username and password, and it automatically handles fetching a temporary key from the token server. If the token expires, the strategy will fetch a new one.

You can create a new AuthenticationStrategy unique for your application by creating a new class using the AuthenticationStrategy protocol. The required method refreshToken must be implemented and this is responsible for fetching a new token from a web services and storing the internal property token inside of the class.

Build + Test

XCode is used to build the project for testing and deployment. Select Product->Build For->Testing to build the project in XCode's menu.

In order to build the project and run the unit tests, a credentials.plist file needs to be populated with proper credentials in order to comumnicate with the running Watson services. A copy of this file is located in the project's folder under WatsonDeveloperCloudTests. The credentials.plist file contains a key and value for each service's user name and password. For example, Personality Insights has a key of PersonalityInsightsUsername for the user name and a key of PersonalityInsightsPassword for the password. A user name and password can be optained from a running Watson service on Bluemix. Please refer to the IBM Watson Services section for more information about Watson Services and Bluemix

There are many tests already in place, positive and negative, that can be displayed when selecting the Test Navigator in XCode. Right click on the test you want to run and select Test in the context menu to run that specific test. You can also select a full node and right-click to run all of the tests in that node or service.

Tests can be found in the WatsonDeveloperCloudTests target, as well as in each individual service’s directory. All of them can be run through Xcode’s testing interface using XCTest. Travis CI will also execute tests for pull requests and pushes to the repository.

Open Source @ IBM

Find more open source projects on the IBM Github Page

License

This library is licensed under Apache 2.0. Full license text is available in LICENSE.

This SDK is intended solely for use with an Apple iOS product and intended to be used in conjunction with officially licensed Apple development tools.

Contributing

See CONTRIBUTING on how to help out.

watson-ios-sdk's People

Contributors

rfdickerson avatar vherrin avatar glennrfisher avatar jballands avatar kweinmeister avatar dsato80 avatar germanattanasio avatar sccheng avatar luish avatar mihaelamiches avatar keighl avatar lucasdamiani avatar

Watchers

James Cloos avatar Samarth Kejriwal avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.