Desert Ant Labs

Emo

Multilingual on-device emoji suggestion.

Emo model page
Platforms
iOS, macOS, tvOS, visionOS, Android, Linux, Windows, Browser, Node
Languages
22
Weights
v0.7.0

Install

requirements

Swift
.package(url: "https://github.com/Desert-Ant-Labs/desert-ant-core.git", from: "4.0.0")

Then add the Emo product to your target.

requirements

Kotlin
implementation("ai.desertant:emo:4.0.0")

requirements

Terminal
npm i @desert-ant-labs/emo @litertjs/core   # browser
npm i @desert-ant-labs/emo                  # Node, prebuilt native core

Usage

Create one Emo instance and reuse it. Creating the instance is cheap and doesn't block. The SDK loads the model on first use, or earlier if you call download.

Swift
import Emo

let emo = Emo()
let suggestions = try await emo.suggestions(for: "Pay my bills")
// [EmoSuggestion(emoji: "💰", confidence: ...), ...]

let toned = try await emo.suggestions(for: "go for a run", limit: 1, skinTone: .medium)
// 🏃🏽

suggestions and download are suspending functions. An Emo holds native resources, so close it when you're done, or let use { } close it.

Kotlin
import ai.desertant.emo.Emo
import ai.desertant.emo.EmojiSkinTone

Emo(context).use { emo ->
    val suggestions = emo.suggestions("Pay my bills")               // List<EmoSuggestion>
    val toned = emo.suggestions("go for a run", limit = 1, skinTone = EmojiSkinTone.MEDIUM)
}

The default import is the browser build. For inference in Node, import the /native subpath. The SDK ships /native prebuilt for linux-x64, linux-arm64 and darwin-arm64.

TypeScript
import { Emo } from "@desert-ant-labs/emo";           // browser
// import { Emo } from "@desert-ant-labs/emo/native"; // server-side Node

const emo = await Emo.load();                                // downloads and caches on first use
const suggestions = await emo.suggestions("Pay my bills");   // [{ emoji, confidence }, ...]
emo.dispose();

Loading the model

The SDK downloads the weights from Hugging Face on first use and caches them. To download the weights earlier, for example during onboarding, or to ship them yourself, see model downloads and caching.

Swift
let emo = Emo()
if !emo.isDownloaded() {
    try await emo.download { fraction in print("\(Int(fraction * 100))%") }
}

let offline = Emo(directory: myModelDirectory)   // uses the files as they are, downloads nothing

Files

FileFormatSizeContents
emo.tfliteLiteRT / TFLite (int8)10.2MBRuns on Android, Linux, Windows, Node, and the web (downloaded on demand by the Kotlin and JavaScript SDKs)
emo.mlmodelcCompiled Core ML4.6MBReady to load on Apple platforms (used by the Swift SDK)
emo_tokenizer.binUnigram tokenizer0.75MBTokenizer the runtime needs
emo_meta.jsonJSONtinyEmoji labels and runtime config

Older SDK versions load Emo.mlmodelc and emo.safetensors. Those files stay on Hugging Face in revisions v0.6.0 and earlier.

Inputs and outputs

Pass a plain text string. Emo works best on short text that states an intent, like "Pay my bills". Emo gives each of the 800 emoji in its vocabulary a probability. Show the top suggestion, or the top few.

Languages

English, Spanish, Portuguese, French, German, Italian, Dutch, Russian, Polish, Turkish, Arabic, Chinese (Simplified and Traditional), Japanese, Korean, Hindi, Indonesian, Thai, Vietnamese, Ukrainian, Swedish, Danish, Czech.

Limits

  • Emo is tuned for short text that states an intent. Longer text gets noisier suggestions.
  • Emoji meanings are imprecise. Expect near-ties between the top suggestions.
  • Quality varies by language. Emo is somewhat weaker on the lower-resource languages in the set.