From 73bb7e08481d5f0ed9bb522b107034c7f61cd4e0 Mon Sep 17 00:00:00 2001 From: Sushant Hiray Date: Wed, 17 Apr 2019 15:54:04 +0530 Subject: [PATCH 1/7] Initializing custom docs --- docs/concepts.md | 2 +- docs/speaker-diarization-api.md | 2 +- website/sidebars.json | 1 + website/siteConfig.js | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/concepts.md b/docs/concepts.md index d94e9ad..7094c9f 100644 --- a/docs/concepts.md +++ b/docs/concepts.md @@ -18,7 +18,7 @@ To link up your requests to webhooks you can pass a `webhook` parameter when mak If you return anything other than a HTTP 200 status to the webhook POST then we’ll try to deliver the response to the webhook for up to 5 times with an exponential backoff. If we don't receive a 200 response from your server, we stop delivering the response. -For testing you can create a temporary webhook using https://beeceptor.com/ +For testing you can create a temporary webhook using https://webhook.site/ To know more about webhooks visit https://simonfredsted.com/1583 diff --git a/docs/speaker-diarization-api.md b/docs/speaker-diarization-api.md index da1a2e1..b433176 100644 --- a/docs/speaker-diarization-api.md +++ b/docs/speaker-diarization-api.md @@ -175,6 +175,6 @@ audioType: can have the following values: | Parameter | Type | Description | Notes | | ---------- | ------ | -------------------------------------------------- | ----- | -| speaker_id | Number | The speaker id for the corresponding audio segment | | +| speaker_id | String | The speaker id for the corresponding audio segment | | | start | Number | Start time of the audio segment in seconds | | | end | Number | End time of the audio segment in seconds | | diff --git a/website/sidebars.json b/website/sidebars.json index 9b521f8..6628575 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -9,6 +9,7 @@ ], "Generic Audio Analysis": [ "speaker-diarization-api", + "speech-to-text-api", "speaker-enrollment-api", "speaker-identification-api", "realtime-speaker-identification-api", diff --git a/website/siteConfig.js b/website/siteConfig.js index ead27be..8f0469e 100755 --- a/website/siteConfig.js +++ b/website/siteConfig.js @@ -21,7 +21,7 @@ const users = [ ]; const siteConfig = { - title: "DeepAffects Developer Docs" /* title for your website */, + title: "" /* title for your website */, tagline: "The new standard for speech analysis APIs for developers", url: "https://docs.deepaffects.com" /* your website url */, baseUrl: "/" /* base url for your project */, From 26c1f199dec3b02f3fe19ecf8be77808c70de15c Mon Sep 17 00:00:00 2001 From: Sushant Hiray Date: Wed, 17 Apr 2019 15:54:33 +0530 Subject: [PATCH 2/7] Added asr api --- docs/asr-api.md | 217 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 docs/asr-api.md diff --git a/docs/asr-api.md b/docs/asr-api.md new file mode 100644 index 0000000..7673394 --- /dev/null +++ b/docs/asr-api.md @@ -0,0 +1,217 @@ +--- +id: speech-to-text-api +title: Speech-to-Text API +sidebar_label: Automatic Speech Recognition API +--- + +Automatic Speech Recognition API provides high-quality speech-to-text conversion powered by machine learning. The api also supports speaker diarization and smart punctuation to further enhance the utility of the transcribed output. + +### POST Request + +`POST https://proxy.api.deepaffects.com/audio/generic/api/v1/async/asr` + +### Sample Code + +### Shell + +```shell +curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v1/async/asr?apikey=&webhook=&request_id=" -H 'content-type: application/json' -d @data.json + +# contents of data.json with content +{"content": "bytesEncodedAudioString", "sampleRate": 8000, "encoding": "FLAC", "languageCode": "en-US", "audioType": "callcenter", "enableSpeakerDiarization": true} + +# contents of data.json with url +{"url": "https://publicly-facing-url.flac", "sampleRate": 8000, "encoding": "FLAC", "languageCode": "en-US", "audioType": "callcenter", "enableSpeakerDiarization": true} +``` + +### Javascript + +```javascript +var request = require("request"); + +var options = { method: 'POST', + url: 'https://proxy.api.deepaffects.com/audio/generic/api/v1/async/asr', + qs: + { apikey: '', + webhook: '', + request_id: '' }, + headers: + { 'Content-Type': 'application/json' }, + body: + { encoding: 'FLAC', + languageCode: 'en-US', + url: 'https://publicly-facing-url.flac', + sampleRate: 8000, + enableSpeakerDiarization: true, + audioType: "callcenter" }, + json: true }; + +request(options, function (error, response, body) { + if (error) throw new Error(error); + + console.log(body); +}); + +``` + +### Python + +```python +import requests +import base64 + +url = "https://proxy.api.deepaffects.com/audio/generic/api/v1/async/asr" + +querystring = {"apikey":"", "webhook":"", "request_id":""} + +payload = { + "encoding": "FLAC", + "languageCode": "en-US", + "sampleRate": 8000 + "audioType": "callcenter", + "enableSpeakerDiarization": true +} + +# The api accepts data either as a url or as base64 encoded content +# passing payload as url: +payload["url"] = "https://publicly-facing-url.flac" +# alternatively, passing payload as content: +with open(audio_file_name, 'rb') as fin: + audio_content = fin.read() +payload["content"] = base64.b64encode(audio_content).decode('utf-8') + +headers = { + 'Content-Type': "application/json", +} + +response = requests.post(url, json=payload, headers=headers, params=querystring) + +print(response.text) +``` + +### Output + +```shell + +# Async: + +{ +"request_id": "8bdd983a-c6bd-4159-982d-6a2471406d62", +"api": "requested_api_name" +} + +# Webhook: + +{ +"request_id": "8bdd983a-c6bd-4159-982d-6a2471406d62", +"response": { + "num_speakers": 2, + "words":[ + { + "speaker_id": "1", + "start": 0, + "end": 1, + "word": "Hi", + "confidence": 0.97 + }, + { + "speaker_id": "2", + "start": 1.2, + "end": 2, + "word": "Hello", + "confidence": 0.97 + }, + { + "speaker_id": "2", + "start": 2, + "end": 2.6, + "word": "this", + "confidence": 0.97 + }, + { + "speaker_id": "2", + "start": 2.6, + "end": 3, + "word": "is", + "confidence": 0.97 + }, + { + "speaker_id": "2", + "start": 3, + "end": 4, + "word": "Susan", + "confidence": 0.97 + }, + ], + "transcript": "Hi! Hello, this is Susan." + } +} +``` + +### Body Parameters + +| Parameter | Type | Description | Notes | +| ------------ | ------ | -------------------------------------------------------- | ---------------------------- | +| encoding | String | Encoding of audio file like MP3, WAV etc. | | +| sampleRate | Number | Sample rate of the audio file. | | +| languageCode | String | Language spoken in the audio file. | [default to 'en-US'] | +| audioType | String | Type of the audio based on number of speakers | [default to callcenter] | +| content | String | base64 encoding of the audio file. | Optional | +| url | String | Publicly facing url | Optional | +| source | String | The source for the audio file: webex, zoom, gotomeeting, phone | Optional | +| enableSpeakerDiarization | Boolean | Tags each word corresponding to the speaker | [default to false] | + +audioType: can have the following values: + 1) callcenter + 2) meeting + 3) earningscalls + 4) interview + 5) media-broadcast + +> We recommend using callcenter when there are upto 6 speakers expected to be identified and meeting when more than 6 speakers are expected. + +> Exactly one of url and content should be passed. In case both values are passed, error is thrown + +> source: Adding source information enables an enhanced model which is built specifically for those audio sources. + +### Query Parameters + +| Parameter | Type | Description | Notes | +| ---------- | ------ | ---------------------------------------------------------------------- | ----------------------------------------------- | +| apikey | String | The apikey | Required for authentication inside all requests | +| webhook | String | The webhook url at which the responses will be sent | Required for async requests | +| request_id | Number | An optional unique id to link async response with the original request | Optional | + +### Output Parameters (Async) + +| Parameter | Type | Description | Notes | +| ---------- | ------ | ------------------------------- | ------------------------------------------------------------------ | +| request_id | String | The request id | This defaults to the originally sent id or is generated by the api | +| api | String | The api method which was called | | + +### Output Parameters (Webhook) + +| Parameter | Type | Description | Notes | +| ---------- | ------ | ------------------------------------ | ------------------------------------------------------------------ | +| request_id | String | The request id | This defaults to the originally sent id or is generated by the api | +| response | Object | The actual output of the transcription | The Transcribed object is defined below | + +#### Transcribed Object + +| Parameter | Type | Description | Notes | +| ------------ | ------ | ------------------------------- | ------------------------------------------------------------------------------- | +| num_speakers | Number | The number of speakers detected | Field is set only when `enableSpeakerDiarization` is `true` | +| words | List | List of word segments | The Word Segment is defined below | +| transcript | String | The entire transcript along with the punctuations powered by the Smart Punctuations API | | +| confidence | Number | Overall transcription confidence | | + + +#### Word Segment + +| Parameter | Type | Description | Notes | +| ---------- | ------ | -------------------------------------------------- | ----- | +| speaker_id | String | The speaker id for the corresponding audio segment | Field is set only when `enableSpeakerDiarization` is `true` | +| start | Number | Start time of the audio segment in seconds | | +| end | Number | End time of the audio segment in seconds | | +| word | String | The word corresponding to the audio segment | | +| confidence | Number | Confidence score for the word | | From 48d1ed8a2c6e64737804b97fac7363a81fe9c98f Mon Sep 17 00:00:00 2001 From: Sushant Hiray Date: Wed, 17 Apr 2019 16:19:51 +0530 Subject: [PATCH 3/7] make api to API --- docs/asr-api.md | 2 +- docs/audio-denoising-api.md | 4 ++-- docs/depression-prediction-api.md | 4 ++-- docs/emotion-recognition-api.md | 4 ++-- docs/interaction-analytics-api.md | 4 ++-- docs/paralinguistic-feature-extraction-api.md | 4 ++-- docs/realtime-emotion-recognition-api.md | 4 ++-- docs/realtime-speaker-identification-api.md | 4 ++-- docs/speaker-diarization-api.md | 4 ++-- docs/speaker-enrollment-api.md | 4 ++-- docs/speaker-identification-api.md | 4 ++-- docs/text-emotion-recognition-api.md | 4 ++-- docs/text-punctuation-api.md | 4 ++-- docs/voice-activity-detection-api.md | 4 ++-- 14 files changed, 27 insertions(+), 27 deletions(-) diff --git a/docs/asr-api.md b/docs/asr-api.md index 7673394..d91004f 100644 --- a/docs/asr-api.md +++ b/docs/asr-api.md @@ -51,7 +51,6 @@ request(options, function (error, response, body) { console.log(body); }); - ``` ### Python @@ -106,6 +105,7 @@ print(response.text) "request_id": "8bdd983a-c6bd-4159-982d-6a2471406d62", "response": { "num_speakers": 2, + "confidence": 0.97, "words":[ { "speaker_id": "1", diff --git a/docs/audio-denoising-api.md b/docs/audio-denoising-api.md index 14de10e..d951520 100644 --- a/docs/audio-denoising-api.md +++ b/docs/audio-denoising-api.md @@ -1,7 +1,7 @@ --- id: audio-denoising-api -title: Audio Denoising Api -sidebar_label: Audio Denoising Api +title: Audio Denoising API +sidebar_label: Audio Denoising API --- Audio denoising api removes noise from your audio signals and returns the denoised audio clip diff --git a/docs/depression-prediction-api.md b/docs/depression-prediction-api.md index e1d49de..80b762b 100644 --- a/docs/depression-prediction-api.md +++ b/docs/depression-prediction-api.md @@ -1,7 +1,7 @@ --- id: depression-prediction-api -title: Depression Prediction Api -sidebar_label: Depression Prediction Api +title: Depression Prediction API +sidebar_label: Depression Prediction API --- Depression prediction api predicts whether the audio clip contains a depressed person diff --git a/docs/emotion-recognition-api.md b/docs/emotion-recognition-api.md index 8ad3dc6..ea8b2fe 100644 --- a/docs/emotion-recognition-api.md +++ b/docs/emotion-recognition-api.md @@ -1,7 +1,7 @@ --- id: emotion-recognition-api -title: Emotion Recognition Api -sidebar_label: Emotion Recognition Api +title: Emotion Recognition API +sidebar_label: Emotion Recognition API --- Emotion recognition api extract basic emotions from the audio file diff --git a/docs/interaction-analytics-api.md b/docs/interaction-analytics-api.md index d14ece0..370ca11 100644 --- a/docs/interaction-analytics-api.md +++ b/docs/interaction-analytics-api.md @@ -1,7 +1,7 @@ --- id: interaction-analytics-api -title: Interaction Analytics Api -sidebar_label: Interaction Analytics Api +title: Interaction Analytics API +sidebar_label: Interaction Analytics API --- DeepAffects Interaction Analytics API extracts comprehensive interaction based metrics from your audio data diff --git a/docs/paralinguistic-feature-extraction-api.md b/docs/paralinguistic-feature-extraction-api.md index a71557f..dbd07da 100644 --- a/docs/paralinguistic-feature-extraction-api.md +++ b/docs/paralinguistic-feature-extraction-api.md @@ -1,7 +1,7 @@ --- id: paralinguistic-feature-extraction-api -title: Paralinguistic Feature Extraction Api -sidebar_label: Paralinguistic Feature Extraction Api +title: Paralinguistic Feature Extraction API +sidebar_label: Paralinguistic Feature Extraction API --- Paralingustic feature extraction api extracts features from audio file as explained in the next section diff --git a/docs/realtime-emotion-recognition-api.md b/docs/realtime-emotion-recognition-api.md index dcc9787..fa2af56 100644 --- a/docs/realtime-emotion-recognition-api.md +++ b/docs/realtime-emotion-recognition-api.md @@ -1,7 +1,7 @@ --- id: realtime-emotion-recognition-api -title: Realtime Emotion Recognition Api -sidebar_label: Realtime Emotion Recognition Api +title: Realtime Emotion Recognition API +sidebar_label: Realtime Emotion Recognition API --- Realtime emotion recognition api Extracts basic emotions from the audio file in realtime diff --git a/docs/realtime-speaker-identification-api.md b/docs/realtime-speaker-identification-api.md index 8ca35c5..deb3bb4 100644 --- a/docs/realtime-speaker-identification-api.md +++ b/docs/realtime-speaker-identification-api.md @@ -1,7 +1,7 @@ --- id: realtime-speaker-identification-api -title: Realtime Speaker Identification Api -sidebar_label: Realtime Speaker Identification Api +title: Realtime Speaker Identification API +sidebar_label: Realtime Speaker Identification API --- Realtime speaker identification api identifies speakers from the audio file in realtime diff --git a/docs/speaker-diarization-api.md b/docs/speaker-diarization-api.md index b433176..88091a8 100644 --- a/docs/speaker-diarization-api.md +++ b/docs/speaker-diarization-api.md @@ -1,7 +1,7 @@ --- id: speaker-diarization-api -title: Speaker Diarization Api -sidebar_label: Speaker Diarization Api +title: Speaker Diarization API +sidebar_label: Speaker Diarization API --- Speaker diarization api tries to figure out "Who Speaks When". diff --git a/docs/speaker-enrollment-api.md b/docs/speaker-enrollment-api.md index 7282984..ae0d3a6 100644 --- a/docs/speaker-enrollment-api.md +++ b/docs/speaker-enrollment-api.md @@ -1,7 +1,7 @@ --- id: speaker-enrollment-api -title: Speaker Enrollment Api -sidebar_label: Speaker Enrollment Api +title: Speaker Enrollment API +sidebar_label: Speaker Enrollment API ---

Speaker Enrollment API for Identification (REST Api)

diff --git a/docs/speaker-identification-api.md b/docs/speaker-identification-api.md index 7386934..99c4bcb 100644 --- a/docs/speaker-identification-api.md +++ b/docs/speaker-identification-api.md @@ -1,7 +1,7 @@ --- id: speaker-identification-api -title: Speaker Identification Api -sidebar_label: Speaker Identification Api +title: Speaker Identification API +sidebar_label: Speaker Identification API --- Speaker identification api tries to figure out "Who Speaks When" for already enrolled speakers. diff --git a/docs/text-emotion-recognition-api.md b/docs/text-emotion-recognition-api.md index 697452f..63b4bd7 100644 --- a/docs/text-emotion-recognition-api.md +++ b/docs/text-emotion-recognition-api.md @@ -1,7 +1,7 @@ --- id: text-emotion-recognition-api -title: Text Emotion Recognition Api -sidebar_label: Text Emotion Recognition Api +title: Text Emotion Recognition API +sidebar_label: Text Emotion Recognition API --- Text emotion api extracts basic emotions from the text input diff --git a/docs/text-punctuation-api.md b/docs/text-punctuation-api.md index 1945cf2..f602cd8 100644 --- a/docs/text-punctuation-api.md +++ b/docs/text-punctuation-api.md @@ -1,7 +1,7 @@ --- id: text-punctuation-api -title: Smart Punctuation Api -sidebar_label: Smart Punctuation Api +title: Smart Punctuation API +sidebar_label: Smart Punctuation API --- Do you've incorrectly formatted or unformatted text? The DeepAffects Smart Punctuation takes a text blob and adds relevant punctuations to the text. The Punctuation API is specifically trained to accurately punctuate noisy asr output. diff --git a/docs/voice-activity-detection-api.md b/docs/voice-activity-detection-api.md index 7228528..c8bd868 100644 --- a/docs/voice-activity-detection-api.md +++ b/docs/voice-activity-detection-api.md @@ -1,7 +1,7 @@ --- id: voice-activity-detection-api -title: Voice Activity Detection Api -sidebar_label: Voice Activity Detection Api +title: Voice Activity Detection API +sidebar_label: Voice Activity Detection API --- Voice activity detection (VAD) is a technique used in speech processing to detect the presence (or absence) of human speech. The DeepAffects Voice activity detection API analyzes the audio input and returns specific segments where human speech is detected. From a1858f5b9c4bf58b0d065afc94042a43c5e42796 Mon Sep 17 00:00:00 2001 From: Sushant Hiray Date: Wed, 17 Apr 2019 16:48:08 +0530 Subject: [PATCH 4/7] request_id is string --- docs/asr-api.md | 9 ++++----- docs/audio-denoising-api.md | 2 +- docs/depression-prediction-api.md | 2 +- docs/emotion-recognition-api.md | 2 +- docs/interaction-analytics-api.md | 2 +- docs/paralinguistic-feature-extraction-api.md | 2 +- docs/speaker-diarization-api.md | 2 +- docs/speaker-identification-api.md | 2 +- docs/text-punctuation-api.md | 2 +- docs/voice-activity-detection-api.md | 2 +- 10 files changed, 13 insertions(+), 14 deletions(-) diff --git a/docs/asr-api.md b/docs/asr-api.md index d91004f..cf86b61 100644 --- a/docs/asr-api.md +++ b/docs/asr-api.md @@ -15,7 +15,7 @@ Automatic Speech Recognition API provides high-quality speech-to-text conversion ### Shell ```shell -curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v1/async/asr?apikey=&webhook=&request_id=" -H 'content-type: application/json' -d @data.json +curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v1/async/asr?apikey=&webhook=" -H 'content-type: application/json' -d @data.json # contents of data.json with content {"content": "bytesEncodedAudioString", "sampleRate": 8000, "encoding": "FLAC", "languageCode": "en-US", "audioType": "callcenter", "enableSpeakerDiarization": true} @@ -33,8 +33,7 @@ var options = { method: 'POST', url: 'https://proxy.api.deepaffects.com/audio/generic/api/v1/async/asr', qs: { apikey: '', - webhook: '', - request_id: '' }, + webhook: ''}, headers: { 'Content-Type': 'application/json' }, body: @@ -61,7 +60,7 @@ import base64 url = "https://proxy.api.deepaffects.com/audio/generic/api/v1/async/asr" -querystring = {"apikey":"", "webhook":"", "request_id":""} +querystring = {"apikey":"", "webhook":""} payload = { "encoding": "FLAC", @@ -180,7 +179,7 @@ audioType: can have the following values: | ---------- | ------ | ---------------------------------------------------------------------- | ----------------------------------------------- | | apikey | String | The apikey | Required for authentication inside all requests | | webhook | String | The webhook url at which the responses will be sent | Required for async requests | -| request_id | Number | An optional unique id to link async response with the original request | Optional | +| request_id | String | An optional unique id to link async response with the original request | Optional | ### Output Parameters (Async) diff --git a/docs/audio-denoising-api.md b/docs/audio-denoising-api.md index d951520..07e875d 100644 --- a/docs/audio-denoising-api.md +++ b/docs/audio-denoising-api.md @@ -125,7 +125,7 @@ print(response.text) | ---------- | ------ | ---------------------------------------------------------------------- | ----------------------------------------------- | | apikey | String | The apikey | Required for authentication inside all requests | | webhook | String | The webhook url at which the responses will be sent | Required for async requests | -| request_id | Number | An optional unique id to link async response with the original request | Optional | +| request_id | String | An optional unique id to link async response with the original request | Optional | ### Output Parameters (Async) diff --git a/docs/depression-prediction-api.md b/docs/depression-prediction-api.md index 80b762b..caae3b6 100644 --- a/docs/depression-prediction-api.md +++ b/docs/depression-prediction-api.md @@ -124,7 +124,7 @@ True | ---------- | ------ | ---------------------------------------------------------------------- | ----------------------------------------------- | | apikey | String | The apikey | Required for authentication inside all requests | | webhook | String | The webhook url at which the responses will be sent | Required for async requests | -| request_id | Number | An optional unique id to link async response with the original request | Optional | +| request_id | String | An optional unique id to link async response with the original request | Optional | ### Output Parameters (Sync) diff --git a/docs/emotion-recognition-api.md b/docs/emotion-recognition-api.md index ea8b2fe..dac36fc 100644 --- a/docs/emotion-recognition-api.md +++ b/docs/emotion-recognition-api.md @@ -80,7 +80,7 @@ curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v2/async/recog | ---------- | ------ | ---------------------------------------------------------------------- | ----------------------------------------------- | | apikey | String | The apikey | Required for authentication inside all requests | | webhook | String | The webhook url at which the responses will be sent | Required for async requests | -| request_id | Number | An optional unique id to link async response with the original request | Optional | +| request_id | String | An optional unique id to link async response with the original request | Optional | ### Output Parameters diff --git a/docs/interaction-analytics-api.md b/docs/interaction-analytics-api.md index 370ca11..c7e985c 100644 --- a/docs/interaction-analytics-api.md +++ b/docs/interaction-analytics-api.md @@ -209,7 +209,7 @@ print(response.text) | ---------- | ------ | ---------------------------------------------------------------------- | ----------------------------------------------- | | apikey | String | The apikey | Required for authentication inside all requests | | webhook | String | The webhook url at which the responses will be sent | Required for async requests | -| request_id | Number | An optional unique id to link async response with the original request | Optional | +| request_id | String | An optional unique id to link async response with the original request | Optional | ### Output Parameters (Async) diff --git a/docs/paralinguistic-feature-extraction-api.md b/docs/paralinguistic-feature-extraction-api.md index dbd07da..ecffca0 100644 --- a/docs/paralinguistic-feature-extraction-api.md +++ b/docs/paralinguistic-feature-extraction-api.md @@ -133,7 +133,7 @@ apiInstance.asyncFeaturizeAudio(body, webhook, callback); | ---------- | ------ | ---------------------------------------------------------------------- | ----------------------------------------------- | | apikey | String | The apikey | Required for authentication inside all requests | | webhook | String | The webhook url at which the responses will be sent | Required for async requests | -| request_id | Number | An optional unique id to link async response with the original request | Optional | +| request_id | String | An optional unique id to link async response with the original request | Optional | ### Output Parameters diff --git a/docs/speaker-diarization-api.md b/docs/speaker-diarization-api.md index 88091a8..d75c1c6 100644 --- a/docs/speaker-diarization-api.md +++ b/docs/speaker-diarization-api.md @@ -148,7 +148,7 @@ audioType: can have the following values: | ---------- | ------ | ---------------------------------------------------------------------- | ----------------------------------------------- | | apikey | String | The apikey | Required for authentication inside all requests | | webhook | String | The webhook url at which the responses will be sent | Required for async requests | -| request_id | Number | An optional unique id to link async response with the original request | Optional | +| request_id | String | An optional unique id to link async response with the original request | Optional | ### Output Parameters (Async) diff --git a/docs/speaker-identification-api.md b/docs/speaker-identification-api.md index 99c4bcb..9123176 100644 --- a/docs/speaker-identification-api.md +++ b/docs/speaker-identification-api.md @@ -89,7 +89,7 @@ curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v2/sync/diariz | ---------- | ------ | ---------------------------------------------------------------------- | ----------------------------------------------- | | apikey | String | The apikey | Required for authentication inside all requests | | webhook | String | The webhook url at which the responses will be sent | Required for async requests | -| request_id | Number | An optional unique id to link async response with the original request | Optional | +| request_id | String | An optional unique id to link async response with the original request | Optional | ### Output Parameters (Async) diff --git a/docs/text-punctuation-api.md b/docs/text-punctuation-api.md index f602cd8..c01275d 100644 --- a/docs/text-punctuation-api.md +++ b/docs/text-punctuation-api.md @@ -112,7 +112,7 @@ print(response.text) | ---------- | ------ | ---------------------------------------------------------------------- | ----------------------------------------------- | | apikey | String | The apikey | Required for authentication inside all requests | | webhook | String | The webhook url at which the responses will be sent | Required for async requests | -| request_id | Number | An optional unique id to link async response with the original request | Optional | +| request_id | String | An optional unique id to link async response with the original request | Optional | ### Output Parameters (Async) diff --git a/docs/voice-activity-detection-api.md b/docs/voice-activity-detection-api.md index c8bd868..c0032d6 100644 --- a/docs/voice-activity-detection-api.md +++ b/docs/voice-activity-detection-api.md @@ -128,7 +128,7 @@ print(response.text) | ---------- | ------ | ---------------------------------------------------------------------- | ----------------------------------------------- | | apikey | String | The apikey | Required for authentication inside all requests | | webhook | String | The webhook url at which the responses will be sent | Required for async requests | -| request_id | Number | An optional unique id to link async response with the original request | Optional | +| request_id | String | An optional unique id to link async response with the original request | Optional | ### Output Parameters (Async) From 03f3177fdb8b077edada03fa4a44ef8db9d3903e Mon Sep 17 00:00:00 2001 From: Sushant Hiray Date: Wed, 17 Apr 2019 16:54:24 +0530 Subject: [PATCH 5/7] Remove request_id from the sample code, only keep it in docs. --- docs/audio-denoising-api.md | 4 ++-- docs/depression-prediction-api.md | 2 +- docs/emotion-recognition-api.md | 2 +- docs/interaction-analytics-api.md | 4 ++-- docs/paralinguistic-feature-extraction-api.md | 2 +- docs/speaker-diarization-api.md | 6 +++--- docs/speaker-identification-api.md | 2 +- docs/text-punctuation-api.md | 5 ++--- docs/voice-activity-detection-api.md | 5 ++--- 9 files changed, 15 insertions(+), 17 deletions(-) diff --git a/docs/audio-denoising-api.md b/docs/audio-denoising-api.md index 07e875d..69c1d50 100644 --- a/docs/audio-denoising-api.md +++ b/docs/audio-denoising-api.md @@ -44,7 +44,7 @@ apiInstance.asyncDenoiseAudio(body, webhook, callback); ```shell # async request -curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v2/async/denoise?apikey=>&webhook=&request_id=abcd-1234" -H 'content-type: application/json' -d @data.json +curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v2/async/denoise?apikey=>&webhook=" -H 'content-type: application/json' -d @data.json # contents of data.json {"content": "bytesEncodedAudioString", "sampleRate": 8000, "encoding": "FLAC", "languageCode": "en-US"} @@ -58,7 +58,7 @@ import base64 url = "https://proxy.api.deepaffects.com/audio/generic/api/v2/async/denoise" -querystring = {"apikey":"", "webhook":"", "request_id":""} +querystring = {"apikey":"", "webhook":""} payload = { "encoding": "Wave", diff --git a/docs/depression-prediction-api.md b/docs/depression-prediction-api.md index caae3b6..7a3d277 100644 --- a/docs/depression-prediction-api.md +++ b/docs/depression-prediction-api.md @@ -27,7 +27,7 @@ Depression prediction api predicts whether the audio clip contains a depressed p ```shell curl -X POST "https://proxy.api.deepaffects.com/audio/custom/ellipsis/api/v1/sync/is_depressed?apikey=" -H 'content-type: application/json' -d @data.json -curl -X POST "https://proxy.api.deepaffects.com/audio/custom/ellipsis/api/v1/async/is_depressed?apikey=&webhook=&request_id=abcd-1234" -H 'content-type: application/json' -d @data.json +curl -X POST "https://proxy.api.deepaffects.com/audio/custom/ellipsis/api/v1/async/is_depressed?apikey=&webhook=" -H 'content-type: application/json' -d @data.json # contents of data.json {"content": "bytesEncodedAudioString", "sampleRate": 8000, "encoding": "FLAC", "languageCode": "en-US"} diff --git a/docs/emotion-recognition-api.md b/docs/emotion-recognition-api.md index dac36fc..fa514a7 100644 --- a/docs/emotion-recognition-api.md +++ b/docs/emotion-recognition-api.md @@ -19,7 +19,7 @@ Emotion recognition api extract basic emotions from the audio file ```shell curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v2/sync/recognise_emotion?apikey=" -H 'content-type: application/json' -d @data.json -curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v2/async/recognise_emotion?apikey=&webhook=&request_id=abcd-1234" -H 'content-type: application/json' -d @data.json +curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v2/async/recognise_emotion?apikey=&webhook=" -H 'content-type: application/json' -d @data.json # contents of data.json {"content": "bytesEncodedAudioString", "sampleRate": 8000, "encoding": "FLAC", "languageCode": "en-US"} diff --git a/docs/interaction-analytics-api.md b/docs/interaction-analytics-api.md index c7e985c..f72ec3b 100644 --- a/docs/interaction-analytics-api.md +++ b/docs/interaction-analytics-api.md @@ -15,7 +15,7 @@ DeepAffects Interaction Analytics API extracts comprehensive interaction based m ### Shell ```shell -curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v1/async/analytics/interaction?apikey=&webhook=&request_id=" -H 'content-type: application/json' -d @data.json +curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v1/async/analytics/interaction?apikey=&webhook=" -H 'content-type: application/json' -d @data.json # contents of data.json {"content": "bytesEncodedAudioString", "sampleRate": 8000, "encoding": "FLAC", "languageCode": "en-US"} @@ -60,7 +60,7 @@ import base64 url = "https://proxy.api.deepaffects.com/audio/generic/api/v1/async/analytics/interaction" -querystring = {"apikey":"", "webhook":"", "request_id":""} +querystring = {"apikey":"", "webhook":""} payload = { "encoding": "FLAC", diff --git a/docs/paralinguistic-feature-extraction-api.md b/docs/paralinguistic-feature-extraction-api.md index ecffca0..4bfd8bf 100644 --- a/docs/paralinguistic-feature-extraction-api.md +++ b/docs/paralinguistic-feature-extraction-api.md @@ -24,7 +24,7 @@ There are two stages in the audio feature extraction methodology: ```shell curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v1/sync/featurize?apikey=" -H 'content-type: application/json' -d @data.json -curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v1/async/featurize?apikey=&webhook=&request_id=abcd-1234" -H 'content-type: application/json' -d @data.json +curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v1/async/featurize?apikey=&webhook=" -H 'content-type: application/json' -d @data.json # contents of data.json {"content": "bytesEncodedAudioString", "sampleRate": 8000, "encoding": "FLAC", "languageCode": "en-US"} diff --git a/docs/speaker-diarization-api.md b/docs/speaker-diarization-api.md index d75c1c6..516c0e0 100644 --- a/docs/speaker-diarization-api.md +++ b/docs/speaker-diarization-api.md @@ -16,10 +16,10 @@ Splits audio clip into segments corresponding to a unique speaker ### Shell ```shell -curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v2/async/diarize?apikey=&webhook=&request_id=" -H 'content-type: application/json' -d @data.json +curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v2/async/diarize?apikey=&webhook=" -H 'content-type: application/json' -d @data.json # contents of data.json -{"content": "bytesEncodedAudioString", "sampleRate": 8000, "encoding": "FLAC", "languageCode": "en-US", "speakers": 2, "audioType": "callcenter"} +{"content": "bytesEncodedAudioString", "sampleRate": 8000, "encoding": "FLAC", "languageCode": "en-US", "audioType": "callcenter"} ``` ### Javascript @@ -57,7 +57,7 @@ import base64 url = "https://proxy.api.deepaffects.com/audio/generic/api/v2/async/diarize" -querystring = {"apikey":"", "webhook":"", "request_id":""} +querystring = {"apikey":"", "webhook":""} payload = { "encoding": "Wave", diff --git a/docs/speaker-identification-api.md b/docs/speaker-identification-api.md index 9123176..ef8a014 100644 --- a/docs/speaker-identification-api.md +++ b/docs/speaker-identification-api.md @@ -24,7 +24,7 @@ Splits audio clip into segments corresponding to a unique speaker and returns st ### Shell ```shell -curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v2/async/diarization/identify?apikey=&webhook=&request_id=" -H 'content-type: application/json' -d @data.json +curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v2/async/diarization/identify?apikey=&webhook=" -H 'content-type: application/json' -d @data.json curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v2/sync/diarization/identify?apikey=" -H 'content-type: application/json' -d @data.json diff --git a/docs/text-punctuation-api.md b/docs/text-punctuation-api.md index c01275d..add1198 100644 --- a/docs/text-punctuation-api.md +++ b/docs/text-punctuation-api.md @@ -25,7 +25,7 @@ Currently, the following punctuations are added to the text: ### Shell ```shell -curl -X POST "https://proxy.api.deepaffects.com/text/generic/api/v1/async/punctuate?apikey=&webhook=&request_id=" -H 'content-type: application/json' -d @data.json +curl -X POST "https://proxy.api.deepaffects.com/text/generic/api/v1/async/punctuate?apikey=&webhook=" -H 'content-type: application/json' -d @data.json # contents of data.json {"texts": ["so its more fluid than it is and you know its not the best kind of feedback right"]} @@ -39,7 +39,6 @@ var options = { method: 'POST', url: 'https://proxy.api.deepaffects.com/text/generic/api/v1/async/punctuate', qs: { apikey: '', - request_id: '', webhook: '' }, headers: { 'Content-Type': 'application/json' }, @@ -62,7 +61,7 @@ import base64 url = "https://proxy.api.deepaffects.com/text/generic/api/v1/async/punctuate" -querystring = {"apikey":"", "webhook":"", "request_id":""} +querystring = {"apikey":"", "webhook":""} {"texts": ["so its more fluid than it is and you know its not the best kind of feedback right"]} diff --git a/docs/voice-activity-detection-api.md b/docs/voice-activity-detection-api.md index c0032d6..d3593ad 100644 --- a/docs/voice-activity-detection-api.md +++ b/docs/voice-activity-detection-api.md @@ -18,7 +18,7 @@ Voice activity detection (VAD) is a technique used in speech processing to detec ### Shell ```shell -curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v1/async/vad?apikey=&webhook=&request_id=" -H 'content-type: application/json' -d @data.json +curl -X POST "https://proxy.api.deepaffects.com/audio/generic/api/v1/async/vad?apikey=&webhook=" -H 'content-type: application/json' -d @data.json # contents of data.json {"content": "bytesEncodedAudioString", "sampleRate": 8000, "encoding": "FLAC", "languageCode": "en-US", "minNonSpeechDuration": 1} @@ -32,7 +32,6 @@ var options = { method: 'POST', url: 'https://proxy.api.deepaffects.com/audio/generic/api/v1/async/vad', qs: { apikey: '', - request_id: '', webhook: '' }, headers: { 'Content-Type': 'application/json' }, @@ -58,7 +57,7 @@ import base64 url = "https://proxy.api.deepaffects.com/audio/generic/api/v1/async/vad" -querystring = {"apikey":"", "webhook":"", "request_id":""} +querystring = {"apikey":"", "webhook":""} payload = { "encoding": "Wave", From 783df7278ba4b138ef3a4bcb6c1bd4558733f04e Mon Sep 17 00:00:00 2001 From: Sushant Hiray Date: Wed, 17 Apr 2019 20:31:16 +0530 Subject: [PATCH 6/7] Add job status api --- docs/asr-api.md | 2 +- docs/job-status-api.md | 131 +++++++++++++++++++++++++++++++++++++++++ website/sidebars.json | 3 + 3 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 docs/job-status-api.md diff --git a/docs/asr-api.md b/docs/asr-api.md index cf86b61..99172df 100644 --- a/docs/asr-api.md +++ b/docs/asr-api.md @@ -140,7 +140,7 @@ print(response.text) "end": 4, "word": "Susan", "confidence": 0.97 - }, + } ], "transcript": "Hi! Hello, this is Susan." } diff --git a/docs/job-status-api.md b/docs/job-status-api.md new file mode 100644 index 0000000..58cdc03 --- /dev/null +++ b/docs/job-status-api.md @@ -0,0 +1,131 @@ +--- +id: job-status-api +title: Job Status API +sidebar_label: Job Status API +--- + +Job Status API returns information about the status of the job and its corresponding output. + +### GET Request + +`GET https://proxy.api.deepaffects.com/transaction/generic/api/v1/async/status` + +### Sample Code + +### Shell + +```shell +curl -X GET \ + 'https://proxy.api.deepaffects.com/transaction/generic/api/v1/async/status?apikey=&request_id=' +``` + +### Javascript +```javascript +var request = require("request"); + +var options = { method: 'GET', + url: 'https://proxy.api.deepaffects.com/transaction/generic/api/v1/async/status', + qs: + { apikey: '', + request_id: '' }}; + +request(options, function (error, response, body) { + if (error) throw new Error(error); + + console.log(body); +}); +``` + +### Python +```python +import requests + +url = "https://proxy.api.deepaffects.com/transaction/generic/api/v1/async/status" + +querystring = {"apikey":"","request_id":""} + +payload = "" +headers = { + 'cache-control': "no-cache" + } + +response = requests.get(url, data=payload, headers=headers, params=querystring) + +print(response.text) +``` + +### Output + +```shell +{ + "response": { + "request_id": "", + "response": { + "confidence": 0.97, + "num_speakers": 2, + "transcript": "Hi! Hello, this is Susan.", + "words": [ + { + "confidence": 0.97, + "end": 1, + "speaker_id": "1", + "start": 0, + "word": "Hi" + }, + { + "confidence": 0.97, + "end": 2, + "speaker_id": "2", + "start": 1.2, + "word": "Hello" + }, + { + "confidence": 0.97, + "end": 2.6, + "speaker_id": "2", + "start": 2, + "word": "this" + }, + { + "confidence": 0.97, + "end": 3, + "speaker_id": "2", + "start": 2.6, + "word": "is" + }, + { + "confidence": 0.97, + "end": 4, + "speaker_id": "2", + "start": 3, + "word": "Susan" + } + ] + } + }, + "status": "Completed" +} +``` +### Query Parameters + +| Parameter | Type | Description | Notes | +| ---------- | ------ | ---------------------------------------------------------------------- | ----------------------------------------------- | +| apikey | String | The apikey | Required for authentication inside all requests | +| request_id | String | The request_id corresponding to the request | Required | + +> Note: Polling is NOT recommended in a production server. Rather, use webhooks to asynchronously recieve notifications once the job completes. If you have any further questions, contact us at support@seernet.io + + +### Output Parameters +| Parameter | Type | Description | Notes | +| ---------- | ------ | ---------------------------------------------------------------------- | ----------------------------------------------- | +| status | String | The status of the job: `Completed`, `Failed`, `Running` | | +| response | Object | The response corresponding to the transaction id | The Response Object defined below | + + +### Response Object + +| Parameter | Type | Description | Notes | +| ---------- | ------ | ---------------------------------------------------------------------- | ----------------------------------------------- | +| request_id | String | The request_id corresponding to the request | +| response | Object | The response object as defined in the required API type | | diff --git a/website/sidebars.json b/website/sidebars.json index 6628575..3b1dcec 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -7,6 +7,9 @@ "errors", "concepts" ], + "Jobs": [ + "job-status-api" + ], "Generic Audio Analysis": [ "speaker-diarization-api", "speech-to-text-api", From 774105d440d8ced74f408f26b28723b0816ec2bb Mon Sep 17 00:00:00 2001 From: Sushant Hiray Date: Thu, 18 Apr 2019 17:36:40 +0530 Subject: [PATCH 7/7] updated favicon --- website/static/img/favicon/favicon.ico | Bin 6543 -> 9536 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/website/static/img/favicon/favicon.ico b/website/static/img/favicon/favicon.ico index fae20dcaa3a709b2ebc402dd10407ea7fd0d4854..bae2ad753ddd80096bc9503ffc576fec7f9d4494 100755 GIT binary patch literal 9536 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 Bt1JKj