The JavaScript API Speech Recognition enables web developers to incorporate speech recognition into your web page. This API allows fine control and flexibility over the speech recognition capabilities in Chrome version 25 and later. This API is experimental, that means that it's not available on every browser. Even in Chrome, there are some attributes of the API that aren't supported. For more information visit Can I Use Speech Recognition.
In this article you will learn how to use the Speech Recognition API, in its most basic expression.
Implementation
To get started, you will need to know wheter the browser supports the API or not. To do this, you can verify if the window object in the browser has the webkitSpeechRecognition property using any of the following snippets:
if (!('webkitSpeechRecognition' in window)) {
alert("Unable to use the Speech Recognition API");
}
// Or
if (!window.hasOwnProperty("webkitSpeechRecognition")) {
alert("Unable to use the Speech Recognition API");
}
// Or
if(typeof(webkitSpeechRecognition) != "function"){
alert("Unable to use the Speech Recognition API");
}
Once you verify, you can start to work with this API. Create a new instance of the webkitSpeechRecognition
class and set the basic properties:
// Create a new instance of SpeechRecognition
var recognition = new webkitSpeechRecognition();
// Define whether continuous results are returned for each recognition
// or only a single result. Defaults to false
recognition.continuous = true;
// Controls whether interim results should be returned
// Interim results are results that are not yet final
// (e.g. the SpeechRecognitionResult.isFinal property is false.)
recognition.interimResults = true;
// Returns and sets the language of the current SpeechRecognition.
// If not specified, this defaults to the HTML lang attribute value
// or the user agent's language setting if that isn't set either.
// There are a lot of supported languages (go to supported languages at the end of the article)
recognition.lang = "en-US";
Now that the basic options are set, you will need to add some event handlers. In this case we are going add the basic listeners as onerror
, onstart
, onend
and onresult
(event used to retrieve the recognized text).
onerror
// Fired when an error happens with the speech recognition
// With all the following erro codes:
// info-blocked
// info-denied
// no-speech
// aborted
// audio-capture
// network
// not-allowed
// service-not-allowed
// bad-grammar
// language-not-supported
// recognition_overlap
recognition.onerror = function(event) {
console.error(event);
};
onstart
// will run when the speech recognition
// service has began listening to incoming audio
recognition.onstart = function() {
console.log('Speech recognition service has started');
};
onend
// run when the speech recognition service has disconnected
// (automatically or forced with recognition.stop())
recognition.onend = function() {
console.log('Speech recognition service disconnected');
};
onresult
// This event is triggered when the speech recognition service
// returns a result — a word or phrase has been positively
//recognized and this has been communicated back to your app
recognition.onresult = function(event) {
var interim_transcript = '';
var final_transcript = '';
for (var i = event.resultIndex; i < event.results.length; ++i) {
// Verify if the recognized text is the last with the isFinal property
if (event.results[i].isFinal) {
final_transcript += event.results[i][0].transcript;
} else {
interim_transcript += event.results[i][0].transcript;
}
}
// Choose which result may be useful for you
console.log("Interim: ", interim_transcript);
console.log("Final: ",final_transcript);
console.log("Simple: ", event.results[0][0].transcript);
};
The onresult event receives as first parameter a custom even object. The results are stored in the event.results
property (an object of type SpeechRecognitionResultList
that stores the SpeechRecognitionResult
objects, this in turn contains instances of SpeechRecognitionAlternative
with the transcript property that contains the text).
As the final step, you need to start it by executing the start
method of the recognition object or to stop it once it's running executing the stop
method:
// start the speech recognition
recognition.start();
// Stop the speech recognition
recognition.stop();
Now the entire functional snippet to use the speech recognition API should look like:
var recognition = new webkitSpeechRecognition();
recognition.continuous = true;
recognition.interimResults = true;
recognition.lang = "en-US";
recognition.onerror = function(event) {
console.error(event);
};
recognition.onstart = function() {
console.log('Speech recognition service has started');
};
recognition.onend = function() {
console.log('Speech recognition service disconnected');
};
recognition.onresult = function(event) {
var interim_transcript = '';
var final_transcript = '';
for (var i = event.resultIndex; i < event.results.length; ++i) {
// Verify if the recognized text is the last with the isFinal property
if (event.results[i].isFinal) {
final_transcript += event.results[i][0].transcript;
} else {
interim_transcript += event.results[i][0].transcript;
}
}
// Choose which result may be useful for you
console.log("Interim: ", interim_transcript);
console.log("Final: ",final_transcript);
console.log("Simple: ", event.results[0][0].transcript);
};
recognition.start();
Once you execute the start method, the microphone permission dialog will be shown in the Browser.
Go ahead and test it in your web or local server. You can see a live demo of the Speech Recognition API working in the browser in all the available languages from the official Chrome Demos here.
Supported languages
Currently, the API supports 40 languages in Chrome. Some languages have specifical codes according to the region (the identifiers follow the BCP-47 format):
Language | Region | Language code |
---|---|---|
Afrikaans | Default | af-ZA |
Bahasa Indonesia | Default | id-ID |
Bahasa Melayu | Default | ms-MY |
Català | Default | ca-ES |
Äeština | Default | cs-CZ |
Dansk | Default | da-DK |
Deutsch | Default | de-DE |
English | Australia | en-AU |
English | Canada | en-CA |
English | India | en-IN |
English | New Zealand | en-NZ |
English | South Africa | en-ZA |
English | United Kingdom | en-GB |
English | United States | en-US |
Español | Argentina | es-AR |
Español | Bolivia | es-BO |
Español | Chile | es-CL |
Español | Colombia | es-CO |
Español | Costa Rica | es-CR |
Español | Ecuador | es-EC |
Español | El Salvador | es-SV |
Español | España | es-ES |
Español | Estados Unidos | es-US |
Español | Guatemala | es-GT |
Español | Honduras | es-HN |
Español | México | es-MX |
Español | Nicaragua | es-NI |
Español | Panamá | es-PA |
Español | Paraguay | es-PY |
Español | Perú | es-PE |
Español | Puerto Rico | es-PR |
Español | República Dominicana | es-DO |
Español | Uruguay | es-UY |
Español | Venezuela | es-VE |
Euskara | Default | eu-ES |
Filipino | Default | fil-PH |
Français | Default | fr-FR |
Galego | Default | gl-ES |
Hrvatski | Default | hr_HR |
IsiZulu | Default | zu-ZA |
Íslenska | Default | is-IS |
Italiano | Italia | it-IT |
Italiano | Svizzera | it-CH |
Lietuvių | Default | lt-LT |
Magyar | Default | hu-HU |
Nederlands | Default | nl-NL |
Norsk bokmål | Default | nb-NO |
Polski | Default | pl-PL |
Português | Brasil | pt-BR |
Português | Portugal | pt-PT |
RomânÄ | Default | ro-RO |
SlovenšÄina | Default | sl-SI |
SlovenÄina | Default | sk-SK |
Suomi | Default | fi-FI |
Svenska | Default | sv-SE |
Tiếng Viá»t | Default | vi-VN |
Türkçe | Default | tr-TR |
Ελληνικά | Default | el-GR |
бÑлгаÑÑки | Default | bg-BG |
PÑÑÑкий | Default | ru-RU |
СÑпÑки | Default | sr-RS |
УкÑаÑнÑÑка | Default | uk-UA |
íêµì´ | Default | ko-KR |
ä¸æ | æ®éè¯ (ä¸å½å¤§é) | cmn-Hans-CN |
ä¸æ | æ®éè¯ (é¦æ¸¯) | cmn-Hans-HK |
ä¸æ | ä¸æ (å°ç£) | cmn-Hant-TW |
ä¸æ | ç²µèª (é¦æ¸¯) | yue-Hant-HK |
æ¥æ¬èª | Default | ja-JP |
हिनà¥à¤¦à¥ | Default | hi-IN |
ภาษาà¹à¸à¸¢ | Default | th-TH |
You can use the following object if you need the previous table in Javascript and you can iterate it as shown in the example:
var allAvailableLanguages = [
{
"language": "Afrikaans",
"countryCodes": [
{
"langCode": "af-ZA",
"country": "Default"
}
]
},
{
"language": "Bahasa Indonesia",
"countryCodes": [
{
"langCode": "id-ID",
"country": "Default"
}
]
},
{
"language": "Bahasa Melayu",
"countryCodes": [
{
"langCode": "ms-MY",
"country": "Default"
}
]
},
{
"language": "Català",
"countryCodes": [
{
"langCode": "ca-ES",
"country": "Default"
}
]
},
{
"language": "Äeština",
"countryCodes": [
{
"langCode": "cs-CZ",
"country": "Default"
}
]
},
{
"language": "Dansk",
"countryCodes": [
{
"langCode": "da-DK",
"country": "Default"
}
]
},
{
"language": "Deutsch",
"countryCodes": [
{
"langCode": "de-DE",
"country": "Default"
}
]
},
{
"language": "English",
"countryCodes": [
{
"langCode": "en-AU",
"country": "Australia"
},
{
"langCode": "en-CA",
"country": "Canada"
},
{
"langCode": "en-IN",
"country": "India"
},
{
"langCode": "en-NZ",
"country": "New Zealand"
},
{
"langCode": "en-ZA",
"country": "South Africa"
},
{
"langCode": "en-GB",
"country": "United Kingdom"
},
{
"langCode": "en-US",
"country": "United States"
}
]
},
{
"language": "Español",
"countryCodes": [
{
"langCode": "es-AR",
"country": "Argentina"
},
{
"langCode": "es-BO",
"country": "Bolivia"
},
{
"langCode": "es-CL",
"country": "Chile"
},
{
"langCode": "es-CO",
"country": "Colombia"
},
{
"langCode": "es-CR",
"country": "Costa Rica"
},
{
"langCode": "es-EC",
"country": "Ecuador"
},
{
"langCode": "es-SV",
"country": "El Salvador"
},
{
"langCode": "es-ES",
"country": "España"
},
{
"langCode": "es-US",
"country": "Estados Unidos"
},
{
"langCode": "es-GT",
"country": "Guatemala"
},
{
"langCode": "es-HN",
"country": "Honduras"
},
{
"langCode": "es-MX",
"country": "México"
},
{
"langCode": "es-NI",
"country": "Nicaragua"
},
{
"langCode": "es-PA",
"country": "Panamá"
},
{
"langCode": "es-PY",
"country": "Paraguay"
},
{
"langCode": "es-PE",
"country": "Perú"
},
{
"langCode": "es-PR",
"country": "Puerto Rico"
},
{
"langCode": "es-DO",
"country": "República Dominicana"
},
{
"langCode": "es-UY",
"country": "Uruguay"
},
{
"langCode": "es-VE",
"country": "Venezuela"
}
]
},
{
"language": "Euskara",
"countryCodes": [
{
"langCode": "eu-ES",
"country": "Default"
}
]
},
{
"language": "Filipino",
"countryCodes": [
{
"langCode": "fil-PH",
"country": "Default"
}
]
},
{
"language": "Français",
"countryCodes": [
{
"langCode": "fr-FR",
"country": "Default"
}
]
},
{
"language": "Galego",
"countryCodes": [
{
"langCode": "gl-ES",
"country": "Default"
}
]
},
{
"language": "Hrvatski",
"countryCodes": [
{
"langCode": "hr_HR",
"country": "Default"
}
]
},
{
"language": "IsiZulu",
"countryCodes": [
{
"langCode": "zu-ZA",
"country": "Default"
}
]
},
{
"language": "Íslenska",
"countryCodes": [
{
"langCode": "is-IS",
"country": "Default"
}
]
},
{
"language": "Italiano",
"countryCodes": [
{
"langCode": "it-IT",
"country": "Italia"
},
{
"langCode": "it-CH",
"country": "Svizzera"
}
]
},
{
"language": "Lietuvių",
"countryCodes": [
{
"langCode": "lt-LT",
"country": "Default"
}
]
},
{
"language": "Magyar",
"countryCodes": [
{
"langCode": "hu-HU",
"country": "Default"
}
]
},
{
"language": "Nederlands",
"countryCodes": [
{
"langCode": "nl-NL",
"country": "Default"
}
]
},
{
"language": "Norsk bokmål",
"countryCodes": [
{
"langCode": "nb-NO",
"country": "Default"
}
]
},
{
"language": "Polski",
"countryCodes": [
{
"langCode": "pl-PL",
"country": "Default"
}
]
},
{
"language": "Português",
"countryCodes": [
{
"langCode": "pt-BR",
"country": "Brasil"
},
{
"langCode": "pt-PT",
"country": "Portugal"
}
]
},
{
"language": "RomânÄ",
"countryCodes": [
{
"langCode": "ro-RO",
"country": "Default"
}
]
},
{
"language": "SlovenšÄina",
"countryCodes": [
{
"langCode": "sl-SI",
"country": "Default"
}
]
},
{
"language": "SlovenÄina",
"countryCodes": [
{
"langCode": "sk-SK",
"country": "Default"
}
]
},
{
"language": "Suomi",
"countryCodes": [
{
"langCode": "fi-FI",
"country": "Default"
}
]
},
{
"language": "Svenska",
"countryCodes": [
{
"langCode": "sv-SE",
"country": "Default"
}
]
},
{
"language": "Tiếng Viá»t",
"countryCodes": [
{
"langCode": "vi-VN",
"country": "Default"
}
]
},
{
"language": "Türkçe",
"countryCodes": [
{
"langCode": "tr-TR",
"country": "Default"
}
]
},
{
"language": "Ελληνικά",
"countryCodes": [
{
"langCode": "el-GR",
"country": "Default"
}
]
},
{
"language": "бÑлгаÑÑки",
"countryCodes": [
{
"langCode": "bg-BG",
"country": "Default"
}
]
},
{
"language": "PÑÑÑкий",
"countryCodes": [
{
"langCode": "ru-RU",
"country": "Default"
}
]
},
{
"language": "СÑпÑки",
"countryCodes": [
{
"langCode": "sr-RS",
"country": "Default"
}
]
},
{
"language": "УкÑаÑнÑÑка",
"countryCodes": [
{
"langCode": "uk-UA",
"country": "Default"
}
]
},
{
"language": "íêµì´",
"countryCodes": [
{
"langCode": "ko-KR",
"country": "Default"
}
]
},
{
"language": "ä¸æ",
"countryCodes": [
{
"langCode": "cmn-Hans-CN",
"country": "æ®éè¯ (ä¸å½å¤§é)"
},
{
"langCode": "cmn-Hans-HK",
"country": "æ®éè¯ (é¦æ¸¯)"
},
{
"langCode": "cmn-Hant-TW",
"country": "ä¸æ (å°ç£)"
},
{
"langCode": "yue-Hant-HK",
"country": "ç²µèª (é¦æ¸¯)"
}
]
},
{
"language": "æ¥æ¬èª",
"countryCodes": [
{
"langCode": "ja-JP",
"country": "Default"
}
]
},
{
"language": "हिनà¥à¤¦à¥",
"countryCodes": [
{
"langCode": "hi-IN",
"country": "Default"
}
]
},
{
"language": "ภาษาà¹à¸à¸¢",
"countryCodes": [
{
"langCode": "th-TH",
"country": "Default"
}
]
}
];
allAvailableLanguages.forEach(function(item){
if(item.countryCodes.length > 1){
var allCountries = "";
console.log(item.language + " ("+item.countryCodes.length+" country(s)) ");
item.countryCodes.forEach(function(countryItem){
console.log(" "+countryItem.country + " | "+ countryItem.langCode);
});
}else{
console.log(item.language + " ["+item.countryCodes[0].langCode+"]");
}
});
Whose output in the console will be:
// Afrikaans [af-ZA]
// Bahasa Indonesia [id-ID]
// Bahasa Melayu [ms-MY]
// Català [ca-ES]
// Äeština [cs-CZ]
// Dansk [da-DK]
// Deutsch [de-DE]
// English (7 country(s))
// Australia | en-AU
// Canada | en-CA
// India | en-IN
// New Zealand | en-NZ
// South Africa | en-ZA
// United Kingdom | en-GB
// United States | en-US
// Español (20 country(s))
// Argentina | es-AR
// Bolivia | es-BO
// Chile | es-CL
// Colombia | es-CO
// Costa Rica | es-CR
// Ecuador | es-EC
// El Salvador | es-SV
// España | es-ES
// Estados Unidos | es-US
// Guatemala | es-GT
// Honduras | es-HN
// México | es-MX
// Nicaragua | es-NI
// Panamá | es-PA
// Paraguay | es-PY
// Perú | es-PE
// Puerto Rico | es-PR
// República Dominicana | es-DO
// Uruguay | es-UY
// Venezuela | es-VE
// Euskara [eu-ES]
// Filipino [fil-PH]
// Français [fr-FR]
// Galego [gl-ES]
// Hrvatski [hr_HR]
// IsiZulu [zu-ZA]
// Íslenska [is-IS]
// Italiano (2 country(s))
// Italia | it-IT
// Svizzera | it-CH
// Lietuvių [lt-LT]
// Magyar [hu-HU]
// Nederlands [nl-NL]
// Norsk bokmål [nb-NO]
// Polski [pl-PL]
// Português (2 country(s))
// Brasil | pt-BR
// Portugal | pt-PT
// RomânÄ [ro-RO]
// SlovenšÄina [sl-SI]
// SlovenÄina [sk-SK]
// Suomi [fi-FI]
// Svenska [sv-SE]
// Tiếng Viá»t [vi-VN]
// Türkçe [tr-TR]
// Ελληνικά [el-GR]
// бÑлгаÑÑки [bg-BG]
// PÑÑÑкий [ru-RU]
// СÑпÑки [sr-RS]
// УкÑаÑнÑÑка [uk-UA]
// íêµì´ [ko-KR]
// ä¸æ (4 country(s))
// æ®éè¯ (ä¸å½å¤§é) | cmn-Hans-CN
// æ®éè¯ (é¦æ¸¯) | cmn-Hans-HK
// ä¸æ (å°ç£) | cmn-Hant-TW
// ç²µèª (é¦æ¸¯) | yue-Hant-HK
// æ¥æ¬èª [ja-JP]
// हिनà¥à¤¦à¥ [hi-IN]
// ภาษาà¹à¸à¸¢ [th-TH]
Happy coding !