Speech REST API Reference
This document is a work in progress. Meanwhile, see gRPC transcoding and consult the gRPC API reference.
Authorization
Calls to the Tiro speech-to-text service need to be authorized with an API key
or a JWT token signed with the client's private key. The key or token is either
supplied in an HTTP header Authorization: Bearer ACCESS_TOKEN
or as a
query parameter token=ACCESS_TOKEN
.
An API key or client private key can be generated in the API console. Contact tiro@tiro.is to gain access or request an access token.
Server host
https://speech.talgreinir.is
Objects
RecognitionConfig
{
"encoding": "LINEAR16",
"sampleRateHertz": 8000-48000,
"enableWordTimeOffsets: boolean,
"maxAlternatives: 1-10,
"languageCode": "is-IS" | "en-US",
}
WordInfo
{
"startTime": "<float>s",
"endTime": "<float>s",
"word": string
}
Recognize ─ Speech-to-Text of Short Segments
Synchronous recognition of short segments (less than 30s) of audio.
POST /v2beta1/speech:recognize
Body
{
"config": RecognitionConfig,
"audio": {
"content": base64 encoded PCM LINEAR 16 audio
}
}
Response
{
"results": [
{
"alternatives": [ # Array of length 1 to config.maxAlternatives
{
"transcript": string, # Recognized text
"words": WordInfo[] # Array of WordInfos for each word in the transcript.
# Included if config.enableWordTimeOffset was true
},
{
"transcript": string
}
]
}
Example
Example using curl
:
echo "{\"config\": {\"languageCode\": \"is-IS\",\"encoding\": \"LINEAR16\", \"sampleRateHertz\": 16000, \"enableWordTimeOffsets\": true}, \"audio\" : {\"content\": \"$(sox speech.wav -r16k -t raw - | base64 -w0)\"}}" \
| curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $ACCESS_TOKEN" \
-d@- https://speech.talgreinir.is/v2beta1/speech:recognize | jq
Example response:
{
"results": [
{
"alternatives": [
{
"transcript": "undir þessa rekstrareiningu fellur allur verslunarrekstur á Íslandi með mat og sérvöru auk reksturs í Svíþjóð vegna Bónuss og Hagkaups ",
"words": [
{
"startTime": "0.480s",
"endTime": "0.900s",
"word": "undir"
},
{
"startTime": "0.899s",
"endTime": "1.259s",
"word": "þessa"
},
{
"startTime": "1.260s",
"endTime": "2.159s",
"word": "rekstrareiningu"
},
{
"startTime": "2.310s",
"endTime": "2.730s",
"word": "fellur"
},
{
"startTime": "2.729s",
"endTime": "3.089s",
"word": "allur"
},
{
"startTime": "3.090s",
"endTime": "3.930s",
"word": "verslunarrekstur"
},
{
"startTime": "3.930s",
"endTime": "4.020s",
"word": "á"
},
{
"startTime": "4.019s",
"endTime": "4.679s",
"word": "Íslandi"
},
{
"startTime": "4.709s",
"endTime": "4.978s",
"word": "með"
},
{
"startTime": "4.980s",
"endTime": "5.400s",
"word": "mat"
},
{
"startTime": "5.400s",
"endTime": "5.549s",
"word": "og"
},
{
"startTime": "5.549s",
"endTime": "6.179s",
"word": "sérvöru"
},
{
"startTime": "7.020s",
"endTime": "7.350s",
"word": "auk"
},
{
"startTime": "7.350s",
"endTime": "7.889s",
"word": "reksturs"
},
{
"startTime": "7.889s",
"endTime": "7.979s",
"word": "í"
},
{
"startTime": "7.979s",
"endTime": "8.668s",
"word": "Svíþjóð"
},
{
"startTime": "8.729s",
"endTime": "9.059s",
"word": "vegna"
},
{
"startTime": "9.060s",
"endTime": "9.659s",
"word": "Bónuss"
},
{
"startTime": "9.690s",
"endTime": "9.930s",
"word": "og"
},
{
"startTime": "9.930s",
"endTime": "10.590s",
"word": "Hagkaups"
}
]
}
]
}
]
}
StreamingRecognize ─ Bidirectional Real-Time Speech-to-Text
Bidirectional streaming of requests and responses using WebSockets. Continuously accepts chunks of audio emitting responses as soon as they are ready.
WebSocket endpoint:
/v2beta1/speech:streamingrecognize?token=ACCESS_TOKEN
The access token can also be supplied in the Sec-Websocket-Protocol
field:
Sec-Websocket-Protocol: Bearer, ACCESS_TOKEN
Note: You can not use an Authorization header with WebSockets
The first message sent in a session must be a configuration message:
{
"streamingConfig": {
"config": RecognitionConfig,
"interimResults": boolean, # Whether to enable non-final responses
"singleUtterance": boolean # Whether finalize and close session after first detected endpoint
}
}
Subsequent messages must be in the following format:
{
"audioContent": string # base64 encoded PCM LINEAR 16 or empty string to finalize session
}
The responses have the following format:
{
"result":
{
"results": [
{
"alternatives": [
{
"transcript": string, # Recognize text for a segment
"words": WordInfo[] # Array of WordInfos for each word in the transcript.
# Included if config.enableWordTimeOffset was true.
},
...
],
"isFinal": boolean # True if this is the final response emitted for this segment
# of audio, i.e. from the startTime of the first WordInfo to
# endTime of the last WordInfo.
}
]
}
}
The service will emit multiple responses for each segment if
streamingConfig.interimResults=true
, or everytime the segment hypothesis has
an update. The service will emit a message where isFinal=true
everytime a
speech endpoint is detected, which usually corresponds to a period of silence.
Example message exchange
Acquire an access token and connect to
wss://speech.talgreinir.is/v2beta1/speech:streamingrecognize?token=ACCESS_TOKEN
.
Initial request message:
{
"streamingConfig": {
"config": {
"encoding": "LINEAR16",
"sampleRateHertz": 48000,
"enableWordTimeOffsets: true,
"languageCode": "is-IS",
},
"interimResults": true,
}
}
Responses received while sending a LINEAR 16 PCM stream in 800 sample chunks:
{
"result": {
"results": [
{
"alternatives": [
{
"transcript": "undir ",
"words": [
{
"startTime": "0.496s",
"endTime": "0.856s",
"word": "undir"
}
]
}
]
}
]
}
}
{
"result": {
"results": [
{
"alternatives": [
{
"transcript": "undir þessa rekstrareiningu ",
"words": [
{
"startTime": "0.496s",
"endTime": "0.886s",
"word": "undir"
},
{
"startTime": "0.886s",
"endTime": "1.246s",
"word": "þessa"
},
{
"startTime": "1.246s",
"endTime": "1.906s",
"word": "rekstrareiningu"
}
]
}
]
}
]
}
}
{
"result": {
"results": [
{
"alternatives": [
{
"transcript": "undir þessa rekstrareiningu fellur allur ",
"words": [
{
"startTime": "0.496s",
"endTime": "0.886s",
"word": "undir"
},
{
"startTime": "0.886s",
"endTime": "1.246s",
"word": "þessa"
},
{
"startTime": "1.246s",
"endTime": "2.176s",
"word": "rekstrareiningu"
},
{
"startTime": "2.326s",
"endTime": "2.746s",
"word": "fellur"
},
{
"startTime": "2.745s",
"endTime": "2.955s",
"word": "allur"
}
]
}
]
}
]
}
}
{
"result": {
"results": [
{
"alternatives": [
{
"transcript": "undir þessa rekstrareiningu fellur allur verslunarrekstur á ",
"words": [
{
"startTime": "0.496s",
"endTime": "0.886s",
"word": "undir"
},
{
"startTime": "0.886s",
"endTime": "1.246s",
"word": "þessa"
},
{
"startTime": "1.246s",
"endTime": "2.176s",
"word": "rekstrareiningu"
},
{
"startTime": "2.326s",
"endTime": "2.746s",
"word": "fellur"
},
{
"startTime": "2.745s",
"endTime": "3.075s",
"word": "allur"
},
{
"startTime": "3.106s",
"endTime": "3.946s",
"word": "verslunarrekstur"
},
{
"startTime": "3.946s",
"endTime": "4.006s",
"word": "á"
}
]
}
]
}
]
}
}
{
"result": {
"results": [
{
"alternatives": [
{
"transcript": "undir þessa rekstrareiningu fellur allur verslunarrekstur á Íslandi með ",
"words": [
{
"startTime": "0.496s",
"endTime": "0.886s",
"word": "undir"
},
{
"startTime": "0.886s",
"endTime": "1.246s",
"word": "þessa"
},
{
"startTime": "1.246s",
"endTime": "2.176s",
"word": "rekstrareiningu"
},
{
"startTime": "2.326s",
"endTime": "2.746s",
"word": "fellur"
},
{
"startTime": "2.745s",
"endTime": "3.075s",
"word": "allur"
},
{
"startTime": "3.106s",
"endTime": "3.946s",
"word": "verslunarrekstur"
},
{
"startTime": "3.946s",
"endTime": "4.036s",
"word": "á"
},
{
"startTime": "4.035s",
"endTime": "4.665s",
"word": "Íslandi"
},
{
"startTime": "4.725s",
"endTime": "4.994s",
"word": "með"
}
]
}
]
}
]
}
}
{
"result": {
"results": [
{
"alternatives": [
{
"transcript": "undir þessa rekstrareiningu fellur allur verslunarrekstur á Íslandi með mat og sérvöru ",
"words": [
{
"startTime": "0.496s",
"endTime": "0.886s",
"word": "undir"
},
{
"startTime": "0.886s",
"endTime": "1.246s",
"word": "þessa"
},
{
"startTime": "1.246s",
"endTime": "2.176s",
"word": "rekstrareiningu"
},
{
"startTime": "2.326s",
"endTime": "2.746s",
"word": "fellur"
},
{
"startTime": "2.745s",
"endTime": "3.075s",
"word": "allur"
},
{
"startTime": "3.106s",
"endTime": "3.946s",
"word": "verslunarrekstur"
},
{
"startTime": "3.946s",
"endTime": "4.036s",
"word": "á"
},
{
"startTime": "4.035s",
"endTime": "4.665s",
"word": "Íslandi"
},
{
"startTime": "4.725s",
"endTime": "4.994s",
"word": "með"
},
{
"startTime": "4.996s",
"endTime": "5.416s",
"word": "mat"
},
{
"startTime": "5.416s",
"endTime": "5.565s",
"word": "og"
},
{
"startTime": "5.565s",
"endTime": "5.895s",
"word": "sérvöru"
}
]
}
]
}
]
}
}
{
"result": {
"results": [
{
"alternatives": [
{
"transcript": "undir þessa rekstrareiningu fellur allur verslunarrekstur á Íslandi með mat og sérvöru ",
"words": [
{
"startTime": "0.496s",
"endTime": "0.886s",
"word": "undir"
},
{
"startTime": "0.886s",
"endTime": "1.246s",
"word": "þessa"
},
{
"startTime": "1.246s",
"endTime": "2.176s",
"word": "rekstrareiningu"
},
{
"startTime": "2.326s",
"endTime": "2.746s",
"word": "fellur"
},
{
"startTime": "2.745s",
"endTime": "3.075s",
"word": "allur"
},
{
"startTime": "3.106s",
"endTime": "3.946s",
"word": "verslunarrekstur"
},
{
"startTime": "3.946s",
"endTime": "4.036s",
"word": "á"
},
{
"startTime": "4.035s",
"endTime": "4.665s",
"word": "Íslandi"
},
{
"startTime": "4.725s",
"endTime": "4.994s",
"word": "með"
},
{
"startTime": "4.996s",
"endTime": "5.416s",
"word": "mat"
},
{
"startTime": "5.416s",
"endTime": "5.565s",
"word": "og"
},
{
"startTime": "5.565s",
"endTime": "6.164s",
"word": "sérvöru"
}
]
}
],
"isFinal": true
}
]
}
}
{
"result": {
"results": [
{
"alternatives": [
{
"transcript": "auk rektors ",
"words": [
{
"startTime": "6.957s",
"endTime": "7.287s",
"word": "auk"
},
{
"startTime": "7.287s",
"endTime": "7.527s",
"word": "rektors"
}
]
}
]
}
]
}
}
{
"result": {
"results": [
{
"alternatives": [
{
"transcript": "auk reksturs í ",
"words": [
{
"startTime": "6.957s",
"endTime": "7.287s",
"word": "auk"
},
{
"startTime": "7.287s",
"endTime": "7.857s",
"word": "reksturs"
},
{
"startTime": "7.858s",
"endTime": "7.948s",
"word": "í"
}
]
}
]
}
]
}
}
{
"result": {
"results": [
{
"alternatives": [
{
"transcript": "auk reksturs í Svíþjóð vegna ",
"words": [
{
"startTime": "6.957s",
"endTime": "7.287s",
"word": "auk"
},
{
"startTime": "7.287s",
"endTime": "7.857s",
"word": "reksturs"
},
{
"startTime": "7.858s",
"endTime": "7.948s",
"word": "í"
},
{
"startTime": "7.948s",
"endTime": "8.637s",
"word": "Svíþjóð"
},
{
"startTime": "8.697s",
"endTime": "9.027s",
"word": "vegna"
}
]
}
]
}
]
}
}
{
"result": {
"results": [
{
"alternatives": [
{
"transcript": "auk reksturs í Svíþjóð vegna Bónuss og Hagkaups ",
"words": [
{
"startTime": "6.957s",
"endTime": "7.287s",
"word": "auk"
},
{
"startTime": "7.287s",
"endTime": "7.857s",
"word": "reksturs"
},
{
"startTime": "7.858s",
"endTime": "7.948s",
"word": "í"
},
{
"startTime": "7.948s",
"endTime": "8.637s",
"word": "Svíþjóð"
},
{
"startTime": "8.697s",
"endTime": "9.027s",
"word": "vegna"
},
{
"startTime": "9.028s",
"endTime": "9.627s",
"word": "Bónuss"
},
{
"startTime": "9.657s",
"endTime": "9.867s",
"word": "og"
},
{
"startTime": "9.868s",
"endTime": "10.467s",
"word": "Hagkaups"
}
]
}
]
}
]
}
}
{
"result": {
"results": [
{
"alternatives": [
{
"transcript": "auk reksturs í Svíþjóð vegna Bónuss og Hagkaups ",
"words": [
{
"startTime": "6.957s",
"endTime": "7.287s",
"word": "auk"
},
{
"startTime": "7.287s",
"endTime": "7.857s",
"word": "reksturs"
},
{
"startTime": "7.858s",
"endTime": "7.948s",
"word": "í"
},
{
"startTime": "7.948s",
"endTime": "8.637s",
"word": "Svíþjóð"
},
{
"startTime": "8.697s",
"endTime": "9.027s",
"word": "vegna"
},
{
"startTime": "9.028s",
"endTime": "9.627s",
"word": "Bónuss"
},
{
"startTime": "9.657s",
"endTime": "9.867s",
"word": "og"
},
{
"startTime": "9.868s",
"endTime": "10.557s",
"word": "Hagkaups"
}
]
}
],
"isFinal": true
}
]
}
}