#javascript #api #google-chrome #speech-recognition #reserved-words
#javascript #API #google-chrome #распознавание речи #зарезервированные слова
Вопрос:
Я работаю над простой страницей распознавания речи с использованием HTML и JavaScript. Существуют определенные зарезервированные слова и фразы, которые, по-видимому, не определены в документации API для реализации распознавания речи Google Chrome.
Вот несколько распространенных примеров:
- «новый абзац» — отлично работает и не является двусмысленным
- «точка» — безоговорочно возвращает символ «.» даже если вы произносите буквы в микрофоне «p e r i o d», он все равно выводит «.».
- «запятая» — безоговорочно возвращает символ «, » даже если вы произносите буквы в микрофон «c o m m a», он все равно выводит «,».
Их может быть больше, и я хотел бы получить их полный список.
Кто-нибудь знает, как или что сказать, чтобы избежать «.», чтобы произнести слово «точка» по буквам?
Вот мой тестовый код для chrome-speech-to-text.php
<?php
simple_speech();
?>
<?php
function simple_speech(){
?>
<!DOCTYPE html>
<meta charset="utf-8">
<title>Simple Speech to Text</title>
<?php
$browser="";
if(strpos(strtolower($_SERVER["HTTP_USER_AGENT"]),strtolower("MSIE"))){?>
<p id="info_upgrade" style="text-align:center;">Simple Speech to Text is not supported by this browser.
Upgrade to <a href="//www.google.com/chrome">Chrome</a>
version 25 or later.</p>
<?php }
else if(strpos(strtolower($_SERVER["HTTP_USER_AGENT"]),strtolower("Presto")))
{
//$browser="opera";
}
else if(strpos(strtolower($_SERVER["HTTP_USER_AGENT"]),strtolower("CHROME")))
{?>
<?php
}
else if(strpos(strtolower($_SERVER["HTTP_USER_AGENT"]),strtolower("SAFARI")))
{ ?>
<p id="info_upgrade" style="text-align:center;">Simple Speech to Text is not supported by this browser.
Upgrade to <a href="//www.google.com/chrome">Chrome</a>
version 25 or later.</p>
<?php }
else if(strpos(strtolower($_SERVER["HTTP_USER_AGENT"]),strtolower("FIREFOX")))
{ ?>
<p id="info_upgrade" style="text-align:center;">Simple Speech to Text is not supported by this browser.
Upgrade to <a href="//www.google.com/chrome">Chrome</a>
version 25 or later.</p>
<?php }
else
{
//$browser="other";
}
echo $browser;
?>
<div style="margin-bottom:50px">
<div style="width:100%">
<textarea name="q" id="transcript" rows="15" style="width:100% !important;"></textarea>
</div>
<div style="margin-top: 20px;margin-left: 10px;float:left;">
<a id="copy_dictation" onclick="speakcopy();" style="padding: 6px 11px;background-color:#2111c4;cursor:pointer;color:#fff;margin-top:10px;border-radius:5px;"> Copy</a>
</div>
<div style="margin-top: 20px;margin-left: 10px;float:left;">
<a id="clear_dictation" onclick="speakclear()" style="padding: 6px 11px;background-color:#e5225c;cursor:pointer;color:#fff;margin-top:10px;border-radius:5px;"> Clear</a>
</div>
</div>
<!-- HTML5 Speech Recognition API -->
<script>
startDictation()
function startDictation() {
var recognition = new webkitSpeechRecognition();
console.log(recognition);
recognition.continuous = true;
recognition.interimResults = true;
recognition.lang = "en";
recognition.onend = function(e) {
console.log('ended');
var textarea = document.getElementById('transcript');
if (textarea.value != '') {
textarea.value = textarea.value.trim();
textarea.value = ' ';
}
recognition.start();
}
recognition.onresult = function(e) {
var textarea = document.getElementById('transcript');
for (var i = e.resultIndex; i < e.results.length; i) {
if (e.results[i].isFinal) {
textarea.value = e.results[i][0].transcript;
}
}
}
// start listening
recognition.start();
}
function speakcopy() {
var recognition = new webkitSpeechRecognition();
recognition.stop();
copyToClipboard(document.getElementById("transcript"));
}
function speakclear() {
var recognition = new webkitSpeechRecognition();
recognition.stop();
document.getElementById("transcript").value = "";
}
function copyToClipboard(elem) {
// create hidden text element, if it doesn't already exist
var targetId = "_hiddenCopyText_";
var isInput = elem.tagName === "INPUT" || elem.tagName === "TEXTAREA";
var origSelectionStart, origSelectionEnd;
if (isInput) {
// can just use the original source element for the selection and copy
target = elem;
origSelectionStart = elem.selectionStart;
origSelectionEnd = elem.selectionEnd;
} else {
// must use a temporary form element for the selection and copy
target = document.getElementById(targetId);
if (!target) {
var target = document.createElement("textarea");
target.style.position = "absolute";
target.style.left = "-9999px";
target.style.top = "0";
target.id = targetId;
document.body.appendChild(target);
}
target.textContent = elem.textContent;
}
// select the content
var currentFocus = document.activeElement;
target.focus();
target.setSelectionRange(0, target.value.length);
// copy the selection
var succeed;
try {
succeed = document.execCommand("copy");
} catch (e) {
succeed = false;
}
// restore original focus
if (currentFocus amp;amp; typeof currentFocus.focus === "function") {
currentFocus.focus();
}
if (isInput) {
// restore prior selection
elem.setSelectionRange(origSelectionStart, origSelectionEnd);
} else {
// clear temporary content
target.textContent = "";
}
return succeed;
}
</script>
<?php
}
?>
Ответ №1:
Извините, что отвечаю на мой собственный вопрос, но у меня серьезный срок, который нужно уложиться. Вот пример предложения, которое нужно произносить в микрофон. «Это был отличный период времени, точка» Решение состояло из двух частей:
- Скажите «точка» для символа точки.
- Выполните итерацию по альтернативным конечным результатам, чтобы найти слово «точка» и использовать эту альтернативу. (возвращает «это был отличный период времени».)
Вот очищенный код с альтернативной итерацией конечных результатов (ПРИМЕЧАНИЕ: файл должен иметь расширение «.PHP»! Это не будет работать с расширением HTML») Я использовал имя файла chrome-speech-to-text.php
<html>
<head>
<meta charset="utf-8">
<title>Simple Speech to Text</title>
</head>
<body>
<div style="margin-bottom:50px">
<div style="width:100%">
<textarea name="q" id="transcript" rows="15" style="width:100% !important;"></textarea>
</div>
<div style="margin-top: 20px;margin-left: 10px;float:left;">
<a id="copy_dictation" onclick="speakcopy();" style="padding: 6px 11px;background-color:#2111c4;cursor:pointer;color:#fff;margin-top:10px;border-radius:5px;"> Copy</a>
</div>
<div style="margin-top: 20px;margin-left: 10px;float:left;">
<a id="clear_dictation" onclick="speakclear()" style="padding: 6px 11px;background-color:#e5225c;cursor:pointer;color:#fff;margin-top:10px;border-radius:5px;"> Clear</a>
</div>
</div>
<script>
startDictation()
function startDictation() {
var recognition = new webkitSpeechRecognition();
console.log(recognition);
recognition.continuous = true;
recognition.interimResults = true;
recognition.lang = "en";
recognition.maxAlternatives = 10;
recognition.onend = function(e) {
//console.log('ended');
var textarea = document.getElementById('transcript');
if (textarea.value != '') {
textarea.value = textarea.value.trim();
textarea.value = ' ';
}
recognition.start();
}
recognition.onresult = function(e) {
//console.log(e); // DO NOT UNCOMMENT ELSE ENDLESS LOOP
//e.results[0][0].forEach(iterate);
var textarea = document.getElementById('transcript');
var finalText = '';
for (var i = e.resultIndex; i < e.results.length; i) {
if (e.results[i].isFinal) {
var alternatePeriod = searchForAlternative(e.results[i], 'period');
if (alternatePeriod != '') {
textarea.value = alternatePeriod;
} else {
textarea.value = e.results[i][0].transcript;
}
}
}
}
// start listening
recognition.start();
}
function searchForAlternative(resultItem, searchString) {
for (var i = 0; i < resultItem.length; i) {
//console.log(resultItem[i].transcript);
if (resultItem[i].transcript.includes(searchString)) {
//console.log(resultItem[i].transcript);
return (resultItem[i].transcript);;
}
}
return ('');
}
function speakcopy() {
var recognition = new webkitSpeechRecognition();
recognition.stop();
copyToClipboard(document.getElementById("transcript"));
}
function speakclear() {
var recognition = new webkitSpeechRecognition();
recognition.stop();
document.getElementById("transcript").value = "";
}
function copyToClipboard(elem) {
// create hidden text element, if it doesn't already exist
var targetId = "_hiddenCopyText_";
var isInput = elem.tagName === "INPUT" || elem.tagName === "TEXTAREA";
var origSelectionStart, origSelectionEnd;
if (isInput) {
// can just use the original source element for the selection and copy
target = elem;
origSelectionStart = elem.selectionStart;
origSelectionEnd = elem.selectionEnd;
} else {
// must use a temporary form element for the selection and copy
target = document.getElementById(targetId);
if (!target) {
var target = document.createElement("textarea");
target.style.position = "absolute";
target.style.left = "-9999px";
target.style.top = "0";
target.id = targetId;
document.body.appendChild(target);
}
target.textContent = elem.textContent;
}
// select the content
var currentFocus = document.activeElement;
target.focus();
target.setSelectionRange(0, target.value.length);
// copy the selection
var succeed;
try {
succeed = document.execCommand("copy");
} catch (e) {
succeed = false;
}
// restore original focus
if (currentFocus amp;amp; typeof currentFocus.focus === "function") {
currentFocus.focus();
}
if (isInput) {
// restore prior selection
elem.setSelectionRange(origSelectionStart, origSelectionEnd);
} else {
// clear temporary content
target.textContent = "";
}
return succeed;
}
</script>
</body>
</html>