Make decisions at the speed of sound

Transcribe any audio, from any source, and get real-time DVR-style playback, real-time transcription and search, and proactive monitoring.

Overview Guides

Quick Start Guide

Learn how to get audio transcribed live in just minutes.


Register a webhook

Provide webhook details using a simple REST API. The only required field is callback_url, but you can provide auth details and more, if needed.

import requests
requests.post(
    "null/api/speech-v1/webhooks/create",
    headers={"X-API-Key": "xxx"},
    data={
        "callback_url": CALLBACK_URL,
        "include_lives": true,
        "username": USERNAME,
        "password": PASSWORD
    }
)

Output

{
  "webhook_id": 12345
}

Once registered, you will be able to see it in your webhook registry:

[
  {
    "webhook_id": 12345,
    "relevance": "user",
    "callback_url": "CALLBACK_URL",
    "include_partials": false,
    "include_lives": true,
    "include_edits": false,
    "include_extras": false,
    "auth": true
  }
]

Register a transcription

Now that you’ve registered a webhook, you can easily create a new event for transcription. The only required field for this API is title, but you also must provide either a webcast_url or a phone_number to get things moving.

You can pass almost any URL as a webcast, so long as there is audio/video to capture; and, if you have it enabled it on your account, you can flag any event for human intervention on start-up (an agent will help get the event connected for you, handling forms, captchas, or other issues requiring human assistance) and/or human editing (an editor will perfect ASR output into a publish-quality transcript).

You can also provide an event_date to schedule connection/transcription for the future.

import requests
requests.post(
    "null/api/speech-v1/events/create",
    headers={"X-API-Key": "xxx"},
    data={
        "title": TITLE,
        "webcast_url": WEBCAST_URL
    }
)

Output

{
  "event_id": 12345678
}

Handle incoming webhooks

Now that we have an active event, you will start seeing webhooks arrive at your callback_url as new information is available.

Started

Notice that the transcription has begun

{
  "event_id": 12345678,
  "event_type": "started",
  "webhook_id": 12345,
  "webhook_date": "2022-06-28T11:14:28.893369"
}

Ended

Notice that the transcription has concluded

{
  "event_id": 12345678,
  "event_type": "ended",
  "webhook_id": 12345,
  "webhook_date": "2022-06-28T11:14:28.893369"
}

Partial Transcript

Real-time, frequent transcript chunks that will eventually roll into a completed transcript segment. Partials will always be followed by a transcript type.

{
  "event_id": 12345678,
  "start_timestamp": "2022-06-27T13:43:59.337000",
  "start_ms": 1948743,
  "duration_ms": 25751,
  "transcript": "This is a partial transcript...",
  "event_type": "partial_transcript",
  "webhook_id": 12345,
  "webhook_date": "2022-06-28T11:25:42.372456"
}

Transcript

A finished transcript segment, associated with a unique transcript_item_id

{
  "event_id": 12345678,
  "transcript_item_id": 67891,
  "start_timestamp": "2022-06-27T13:43:59.337000",
  "start_ms": 1948743,
  "duration_ms": 39134,
  "speaker_id": 98765,
  "transcript": "This is a partial transcript that has finished and we ill move to the next segment",
  "event_type": "transcript",
  "webhook_id": 12345,
  "webhook_date": "2022-06-28T11:26:42.372456"
}

Improved Transcript

A more polished live transcript (performed by a larger ASR model) done immediately after live model execution

{
  "event_id": 12345678,
  "transcript_item_id": 67891,
  "start_timestamp": "2022-06-27T13:43:59.337000",
  "start_ms": 1948743,
  "duration_ms": 39134,
  "speaker_id": 98765,
  "transcript": "This is a partial transcript that has finished and we I'll move to the next segment",
  "event_type": "improved_transcript",
  "webhook_id": 12345,
  "webhook_date": "2022-06-28T11:26:42.372456"
}

Edited Transcript

Human-edits made to an existing live transcript, often happening semi-live (or during formal editing)

{
  "event_id": 12345678,
  "transcript_item_id": 67891,
  "start_timestamp": "2022-06-27T13:43:59.337000",
  "start_ms": 1948743,
  "duration_ms": 39134,
  "speaker_id": 98765,
  "transcript": "This is a partial transcript that has finished and we ill move to the next segment",
  "event_type": "edited_transcript",
  "webhook_id": 12345,
  "webhook_date": "2022-06-28T11:26:42.372456"
}

Official Transcript

A human-edited transcript segment corresponding to a transcript_item_id

{
  "event_id": 12345678,
  "transcript_item_id": 67891,
  "start_timestamp": "2022-06-27T13:43:59.337000",
  "start_ms": 1948743,
  "duration_ms": 39134,
  "speaker_id": 98765,
  "transcript": "This is a partial transcript that has finished, and we will move to the next segment.",
  "event_type": "official_transcript",
  "webhook_id": 12345,
  "webhook_date": "2022-06-29T11:26:42.372456"
}

Deleted Transcript

A notice that a transcript segment has been deleted

{
  "event_id": 12345678,
  "transcript_item_id": 67891,
  "event_type": "deleted",
  "webhook_id": 12345,
  "webhook_date": "2022-06-29T11:26:42.372456"
}

Speaker Information

Model-identified speaker information

{
  "event_id": 12345678,
  "transcript_item_id": 67891,
  "event_type": "speaker",
  "speaker_type": "diarization",
  "speaker": "SPEAKER_1",
  "webhook_id": 12345,
  "webhook_date": "2022-06-29T11:26:42.372456"
}

...or, just embed UI components!

Alternatively, you can opt to skip the webhooks altogether and just embed our JavaScript UI component directly into your website:

<script>
  const asrTranscript = new Aiera.Module(
    'https://public.aiera.com/aiera-sdk/0.0.49/modules/ASRTranscript/index.html',
    'YOUR-ID'
  )
  asrTranscript.load().then(() => {
    asrTranscript.authenticate({
      apiKey: 'myPublicApiKeyHash',
    })
    asrTranscript.configure({
      asrOptions: {
        eventId: '12345678',
        darkMode: true,
        showTitleInfo: true,
        showRecordingDetails: true,
        showPriceReaction: true,
        showSearch: true,
        showAudioPlayer: true,
      },
    })
  })
</script>