no message
This commit is contained in:
commit
e959a4e94b
61
.gitignore
vendored
Normal file
61
.gitignore
vendored
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
*.pid.lock
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
|
||||||
|
# nyc test coverage
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
||||||
|
.grunt
|
||||||
|
|
||||||
|
# Bower dependency directory (https://bower.io/)
|
||||||
|
bower_components
|
||||||
|
|
||||||
|
# node-waf configuration
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
node_modules/
|
||||||
|
jspm_packages/
|
||||||
|
|
||||||
|
# TypeScript v1 declaration files
|
||||||
|
typings/
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional eslint cache
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
# Output of 'npm pack'
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Yarn Integrity file
|
||||||
|
.yarn-integrity
|
||||||
|
|
||||||
|
# dotenv environment variables file
|
||||||
|
.env
|
||||||
|
|
||||||
|
# next.js build output
|
||||||
|
.next
|
25
.vscode/launch.json
vendored
Normal file
25
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"version": "0.1.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"type": "chrome",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Launch Chrome",
|
||||||
|
"url": "http://localhost:8000",
|
||||||
|
"webRoot": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"type": "node",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Launch Server",
|
||||||
|
"program": "${workspaceFolder}/server/ws-server.js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Launch index.html",
|
||||||
|
"type": "chrome",
|
||||||
|
"request": "launch",
|
||||||
|
"file": "${workspaceFolder}/client/index.html"
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"workbench.settings.openDefaultKeybindings": true
|
||||||
|
}
|
32
client/index.html
Normal file
32
client/index.html
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||||
|
<meta name="viewport" content="width=device-width">
|
||||||
|
|
||||||
|
<title>Wort matcher</title>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="style.css">
|
||||||
|
<!--[if lt IE 9]>
|
||||||
|
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
||||||
|
<![endif]-->
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<h1>Speech Recognition</h1>
|
||||||
|
<p id=info>Press the button to activate microphone.</p>
|
||||||
|
<p id=query hidden>query</p>
|
||||||
|
|
||||||
|
<button>Start new test</button>
|
||||||
|
<button id="speechBtn">Speech</button>
|
||||||
|
<button onclick="getElementById('query').innerHTML = 'changed'">Change query</button>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<p class="server">Server offline</p>
|
||||||
|
<p class="output" style="font-style: italic;">... erkannte worte ...</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="ws-client.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
54
client/style.css
Normal file
54
client/style.css
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
body, html {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
height: 100%;
|
||||||
|
background-color: teal;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
height: inherit;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, p {
|
||||||
|
font-family: sans-serif;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
div p {
|
||||||
|
padding: 20px;
|
||||||
|
background-color: rgba(0,0,0,0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
div {
|
||||||
|
overflow: auto;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
right: 0;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
margin: 0 auto;
|
||||||
|
display: block;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
width: 170px;
|
||||||
|
line-height: 2;
|
||||||
|
margin-top: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media all and (max-height: 410px) {
|
||||||
|
div {
|
||||||
|
position: static;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.phrase {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.output {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
509
client/ws-client.js
Normal file
509
client/ws-client.js
Normal file
@ -0,0 +1,509 @@
|
|||||||
|
// web speech recognition api
|
||||||
|
var SpeechRecognition = SpeechRecognition || webkitSpeechRecognition;
|
||||||
|
var SpeechGrammarList = SpeechGrammarList || webkitSpeechGrammarList;
|
||||||
|
var SpeechRecognitionEvent = SpeechRecognitionEvent || webkitSpeechRecognitionEvent;
|
||||||
|
|
||||||
|
// state management
|
||||||
|
var state = '';
|
||||||
|
var question = 0;
|
||||||
|
var rePrompt = false;
|
||||||
|
var partTwo = false;
|
||||||
|
var count = 0;
|
||||||
|
var strike = 0;
|
||||||
|
|
||||||
|
// Questions
|
||||||
|
const QUESTION_ONE = 'Ich werde Ihnen jetzt langsam eine Liste mit Worten vorlesen. Danach wiederholen Sie bitte möglichst viele dieser Worte. Auf die Reihenfolge kommt es nicht an.';
|
||||||
|
const QUESTION_ONE_PT2 = 'Vielen Dank. Nun nenne ich Ihnen die gleichen 10 Worte ein zweites mal. Auch danach sollen Sie wieder möglichst viele Worte wiederholen';
|
||||||
|
const QUESTION_TWO = 'Nennen Sie mir bitte so viel Dinge wie möglich, die man im Supermarkt kaufen kann. Sie haben dafür eine Minute Zeit.';
|
||||||
|
const QUESTION_THREE = 'Ich werde Ihnen jetzt eine Zahlenreihe nennen, die Sie mir dann bitte in umgekehrter Reihenfolge wiederholen sollen. Wenn ich beispielsweise, vier - fünf sage, dann sagen Sie bitte, fünf - vier.';
|
||||||
|
|
||||||
|
// intents
|
||||||
|
const WELCOME_INTENT = 'Default Welcome Intent';
|
||||||
|
const WELCOME_FOLLOWUP_YES = 'Default Welcome Intent - yes';
|
||||||
|
const WELCOME_FOLLOWUP_NO = 'Default Welcome Intent - no';
|
||||||
|
const MORE_TIME = 'Add Time Intent';
|
||||||
|
const MORE_TIME_YES = 'Add Time Intent - yes';
|
||||||
|
const MORE_TIME_NO = 'Add Time Intent - no';
|
||||||
|
const QUIT_INTENT = 'Quit Intent';
|
||||||
|
const FALLBACK_INTENT = 'Default Fallback Intent';
|
||||||
|
const HELP_INTENT = 'Help Intent';
|
||||||
|
const CHOOSE_QUESTION = 'Frage_Starten';
|
||||||
|
const NEXT_QUESTION = 'Nächste Frage';
|
||||||
|
|
||||||
|
// question one results
|
||||||
|
const QUESTION_ONE_ANSWERS = ['teller', 'hund', 'lampe', 'brief', 'apfel', 'apfelwiese', 'apfelwiese', 'apfelbaum', 'apfelbaum', 'und', 'hose', 'tisch', 'wiese', 'glas', 'baum'];
|
||||||
|
const QUESTION_ONE_QUESTIONS = ['teller', 'hund', 'lampe', 'brief', 'apfel', 'hose', 'tisch', 'wiese', 'glas', 'baum'];
|
||||||
|
const QUESTION_TWO_ANSWERS = [''];
|
||||||
|
const QUESTION_TWO_QUESTIONS = [''];
|
||||||
|
const QUESTION_THREE_QUESTIONS_PT1 = ['7, 2', '4, 7, 9', '5, 4, 9, 6', '2, 7, 5, 3, 6', '8, 1, 3, 5, 4, 2'];
|
||||||
|
const QUESTION_THREE_QUESTIONS_PT2 = ['8, 6', '3, 1, 5', '1, 9, 7, 4', '1, 3, 5, 4, 8', '4, 1, 2, 7, 9, 5'];
|
||||||
|
const QUESTION_THREE_ANSWERS_PT1 = ['27', '974', '6945', '63572', '245318'];
|
||||||
|
const QUESTION_THREE_ANSWERS_PT2 = ['68', '513', '4791', '84531', '597214'];
|
||||||
|
|
||||||
|
// points
|
||||||
|
var questionOnePoints = 0;
|
||||||
|
var questionTwoPoints = 0;
|
||||||
|
var questionThreePoints = 0;
|
||||||
|
var questionFourPoints = 0;
|
||||||
|
var questionFivePoints = 0;
|
||||||
|
var questionSixPoints = 0;
|
||||||
|
|
||||||
|
// tokenization
|
||||||
|
const separators = [' ', '\\\+', '-', '\\\(', '\\\)', '\\*', '/', ':', '\\\?'];
|
||||||
|
|
||||||
|
// Timers
|
||||||
|
var timerId;
|
||||||
|
|
||||||
|
// html elements
|
||||||
|
var serverPara = document.querySelector('.server');
|
||||||
|
var diagnosticPara = document.querySelector('.output');
|
||||||
|
var testBtn = document.querySelector('button');
|
||||||
|
var testBtn2 = document.getElementById('speechBtn');
|
||||||
|
var infoPara = document.getElementById('info');
|
||||||
|
var userPrompt = document.getElementById('query');
|
||||||
|
|
||||||
|
console.log(window.location.host + window.location.pathname);
|
||||||
|
|
||||||
|
// websocket to communicate with the server
|
||||||
|
var ws = new WebSocket('ws://localhost:8000/ws');
|
||||||
|
|
||||||
|
// speech recognition
|
||||||
|
var recognition = new SpeechRecognition();
|
||||||
|
recognition.lang = 'de-DE';
|
||||||
|
// recognition.interimResults = false;
|
||||||
|
recognition.maxAlternatives = 1;
|
||||||
|
recognition.continuous = true;
|
||||||
|
var answerQuery = '';
|
||||||
|
var skipRecording = false;
|
||||||
|
|
||||||
|
// speech synthesis
|
||||||
|
var speechsynth = new SpeechSynthesisUtterance();
|
||||||
|
var listSpeechsynth = new SpeechSynthesisUtterance();
|
||||||
|
var voices;
|
||||||
|
|
||||||
|
window.speechSynthesis.onvoiceschanged = function () {
|
||||||
|
voices = window.speechSynthesis.getVoices();
|
||||||
|
voices.forEach(element => {
|
||||||
|
if (element.name === 'Google Deutsch') {
|
||||||
|
speechsynth.voice = element;
|
||||||
|
listSpeechsynth.voice = element;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
listSpeechsynth.rate = 0.7;
|
||||||
|
};
|
||||||
|
|
||||||
|
function startDemenzScreening () {
|
||||||
|
console.log('button clicked');
|
||||||
|
ws.send('starte demenz test');
|
||||||
|
//
|
||||||
|
// state = 'answer'
|
||||||
|
// recognizeSpeech()
|
||||||
|
|
||||||
|
//
|
||||||
|
testBtn.disabled = true;
|
||||||
|
testBtn.textContent = 'Test in progress';
|
||||||
|
infoPara.textContent = 'wait...';
|
||||||
|
}
|
||||||
|
|
||||||
|
function speak (sentence) {
|
||||||
|
speechsynth.text = sentence;
|
||||||
|
window.speechSynthesis.speak(speechsynth);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testSpeechOut () {
|
||||||
|
console.log('click');
|
||||||
|
// skipRecording = true
|
||||||
|
// let utterance = new SpeechSynthesisUtterance()
|
||||||
|
// utterance.voice = voices[2]
|
||||||
|
// // utterance.rate = 0.75
|
||||||
|
// utterance.text = QUESTION_THREE
|
||||||
|
// window.speechSynthesis.speak(utterance)
|
||||||
|
//
|
||||||
|
// question = 3;
|
||||||
|
// startQuestion(question);
|
||||||
|
// state = 'answer';
|
||||||
|
speechsynth.text = 'test 123';
|
||||||
|
speechsynth.volume = 1;
|
||||||
|
speechsynth.rate = 1;
|
||||||
|
console.log(speechsynth);
|
||||||
|
window.speechSynthesis.speak(speechsynth);
|
||||||
|
console.log(window.speechSynthesis);
|
||||||
|
// speak('Niko ist der größte hurn eu west');
|
||||||
|
}
|
||||||
|
|
||||||
|
// websocket events
|
||||||
|
ws.onopen = function () {
|
||||||
|
serverPara.style.background = 'green';
|
||||||
|
serverPara.innerHTML = 'Server online';
|
||||||
|
};
|
||||||
|
|
||||||
|
ws.onmessage = function (payload) {
|
||||||
|
var dialogflowResult = JSON.parse(payload.data);
|
||||||
|
checkIntent(dialogflowResult);
|
||||||
|
document.querySelector('h1').innerHTML = dialogflowResult.intent.displayName;
|
||||||
|
};
|
||||||
|
|
||||||
|
// INTENT HANDLING
|
||||||
|
function checkIntent (result) {
|
||||||
|
switch (result.intent.displayName) {
|
||||||
|
case QUIT_INTENT:
|
||||||
|
state = 'quit';
|
||||||
|
skipRecording = true;
|
||||||
|
speak('Okay, Danke fürs Benutzen.');
|
||||||
|
break;
|
||||||
|
case WELCOME_INTENT:
|
||||||
|
state = 'detect';
|
||||||
|
// speak(result.fulfillmentText)
|
||||||
|
speak('go?');
|
||||||
|
break;
|
||||||
|
case WELCOME_FOLLOWUP_YES:
|
||||||
|
startQuestion(1);
|
||||||
|
break;
|
||||||
|
case WELCOME_FOLLOWUP_NO:
|
||||||
|
skipRecording = true;
|
||||||
|
speak('Okay, Danke fürs Benutzen.');
|
||||||
|
break;
|
||||||
|
case MORE_TIME:
|
||||||
|
state = 'detect';
|
||||||
|
speak('Brauchen Sie noch etwas Zeit?');
|
||||||
|
break;
|
||||||
|
case MORE_TIME_YES:
|
||||||
|
rePrompt = true;
|
||||||
|
state = 'answer';
|
||||||
|
speak('Alles klar');
|
||||||
|
break;
|
||||||
|
case MORE_TIME_NO:
|
||||||
|
skipRecording = true;
|
||||||
|
state = 'answer';
|
||||||
|
speak('Verstanden');
|
||||||
|
recognition.stop();
|
||||||
|
ws.send(answerQuery);
|
||||||
|
break;
|
||||||
|
case CHOOSE_QUESTION:
|
||||||
|
question = result.parameters.fields.num.numberValue;
|
||||||
|
state = 'answer';
|
||||||
|
handleQuestion();
|
||||||
|
break;
|
||||||
|
case FALLBACK_INTENT:
|
||||||
|
// if (state === 'answer') {
|
||||||
|
// handleAnswer(result.queryText)
|
||||||
|
// }
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function startQuestion (number) {
|
||||||
|
question = number;
|
||||||
|
state = 'answer';
|
||||||
|
handleQuestion();
|
||||||
|
}
|
||||||
|
|
||||||
|
// QUESTION HANDLING
|
||||||
|
function handleQuestion () {
|
||||||
|
switch (question) {
|
||||||
|
case 1:
|
||||||
|
readQuestionOne(QUESTION_ONE);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
readQuestionTwo(QUESTION_TWO);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
// skipRecording = true;
|
||||||
|
// speak(QUESTION_THREE);
|
||||||
|
speak(QUESTION_THREE_QUESTIONS_PT1[0]);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleAnswer (query) {
|
||||||
|
switch (question) {
|
||||||
|
case 1:
|
||||||
|
handleAnswerToFirstQuestion(query);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
handleAnswerToSecondQuestion(query);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
handleAnswerToThirdQuestion(query);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleAnswerToFirstQuestion (answer) {
|
||||||
|
var tokens = answer.split(new RegExp(separators.join('|'), 'g'));
|
||||||
|
questionOnePoints = calculatePoints(tokens, QUESTION_ONE_ANSWERS);
|
||||||
|
if (partTwo) {
|
||||||
|
partTwo = false;
|
||||||
|
startQuestion(2);
|
||||||
|
// state = 'detect'
|
||||||
|
} else {
|
||||||
|
rePrompt = false;
|
||||||
|
speak(QUESTION_ONE_PT2);
|
||||||
|
partTwo = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleAnswerToSecondQuestion (answer) {
|
||||||
|
var tokens = answer.split(new RegExp(separators.join('|'), 'g'));
|
||||||
|
questionTwoPoints = calculatePoints(tokens, QUESTION_TWO_ANSWERS);
|
||||||
|
skipRecording = true;
|
||||||
|
speak('Sie haben ' + questionOnePoints + 'Punkte');
|
||||||
|
startQuestion(3);
|
||||||
|
// state = 'detect'
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleAnswerToThirdQuestion (query) {
|
||||||
|
speechsynth.rate = 0.87;
|
||||||
|
query = query.replace(' ', '');
|
||||||
|
|
||||||
|
let answerArray;
|
||||||
|
let questionArray;
|
||||||
|
if (!partTwo) {
|
||||||
|
answerArray = QUESTION_THREE_ANSWERS_PT1;
|
||||||
|
} else {
|
||||||
|
answerArray = QUESTION_THREE_ANSWERS_PT2;
|
||||||
|
}
|
||||||
|
if (query === answerArray[count]) {
|
||||||
|
strike = 0;
|
||||||
|
partTwo = false;
|
||||||
|
count++;
|
||||||
|
questionThreePoints = count + 1;
|
||||||
|
questionArray = QUESTION_THREE_QUESTIONS_PT1;
|
||||||
|
} else {
|
||||||
|
strike++;
|
||||||
|
partTwo = true;
|
||||||
|
questionArray = QUESTION_THREE_QUESTIONS_PT2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strike === 2 || count === 5) {
|
||||||
|
speechsynth.rate = 1;
|
||||||
|
skipRecording = true;
|
||||||
|
speak('weiter geht es mit der Nächsten Frage');
|
||||||
|
startQuestion(4);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
speak(questionArray[count]);
|
||||||
|
|
||||||
|
console.log('count: ' + count + ', strike: ' + strike + ', points: ' + questionThreePoints);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Question specific functions
|
||||||
|
function readQuestionOne (text) {
|
||||||
|
skipRecording = true;
|
||||||
|
speak(text);
|
||||||
|
for (let i = 0; i < QUESTION_ONE_QUESTIONS.length; i++) {
|
||||||
|
let utterance = new SpeechSynthesisUtterance();
|
||||||
|
utterance.voice = voices[2];
|
||||||
|
utterance.rate = 0.75;
|
||||||
|
utterance.text = QUESTION_ONE_QUESTIONS[i];
|
||||||
|
window.speechSynthesis.speak(utterance);
|
||||||
|
if (i === 9) {
|
||||||
|
utterance.onend = function (event) {
|
||||||
|
console.log('end of aufzählung' + i);
|
||||||
|
recognizeSpeech();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function readQuestionTwo (text) {
|
||||||
|
let utterance = new SpeechSynthesisUtterance();
|
||||||
|
utterance.voice = voices[2];
|
||||||
|
utterance.text = text;
|
||||||
|
window.speechSynthesis.speak(utterance);
|
||||||
|
console.log('q 2 started');
|
||||||
|
utterance.onend = function (event) {
|
||||||
|
window.setTimeout(
|
||||||
|
function () {
|
||||||
|
recognition.stop();
|
||||||
|
handleAnswer(answerQuery);
|
||||||
|
}, 60000);
|
||||||
|
console.log('q 2 recognition started');
|
||||||
|
recognizeSpeech();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function calculatePoints (tokens, array) {
|
||||||
|
let points = 0;
|
||||||
|
for (let i of array) {
|
||||||
|
for (let j of tokens) {
|
||||||
|
if (i === j) {
|
||||||
|
points++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return points;
|
||||||
|
}
|
||||||
|
|
||||||
|
speechsynth.onend = function (event) {
|
||||||
|
switch (question) {
|
||||||
|
case 1:
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!skipRecording) {
|
||||||
|
recognizeSpeech();
|
||||||
|
}
|
||||||
|
skipRecording = false;
|
||||||
|
console.log('global speech end');
|
||||||
|
};
|
||||||
|
|
||||||
|
function recognizeSpeech () {
|
||||||
|
if (state === 'answer') {
|
||||||
|
var arr;
|
||||||
|
switch (question) {
|
||||||
|
case 1:
|
||||||
|
arr = QUESTION_ONE_QUESTIONS;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
return;
|
||||||
|
case 3:
|
||||||
|
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
var grammar = '#JSGF V1.0; grammar colors; public <color> = ' + arr.join(' | ') + ' ;';
|
||||||
|
var speechRecognitionList = new SpeechGrammarList();
|
||||||
|
speechRecognitionList.addFromString(grammar, 1);
|
||||||
|
recognition.grammars = speechRecognitionList;
|
||||||
|
}
|
||||||
|
recognition.start();
|
||||||
|
console.log('reocgnition started');
|
||||||
|
|
||||||
|
recognition.onresult = function (event) {
|
||||||
|
var last = event.results.length - 1;
|
||||||
|
var speechResult = event.results[last][0].transcript.toLowerCase();
|
||||||
|
|
||||||
|
diagnosticPara.textContent += speechResult + ' ';
|
||||||
|
|
||||||
|
// console.log('Confidence: ' + event.results[0][0].confidence)
|
||||||
|
|
||||||
|
processSpeech(speechResult);
|
||||||
|
// testBtn.disabled = false
|
||||||
|
// testBtn.textContent = 'record...'
|
||||||
|
};
|
||||||
|
|
||||||
|
function processSpeech (speechResult) {
|
||||||
|
console.log('To dialogflow: ' + speechResult);
|
||||||
|
ws.send(speechResult);
|
||||||
|
|
||||||
|
let timeOut;
|
||||||
|
switch (question) {
|
||||||
|
case 1:
|
||||||
|
timeOut = 6500;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
answerQuery += speechResult;
|
||||||
|
return;
|
||||||
|
case 3:
|
||||||
|
if (speechResult.includes('uhr')) {
|
||||||
|
speechResult = speechResult.replace('uhr', '');
|
||||||
|
}
|
||||||
|
timeOut = 6500;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state === 'answer') {
|
||||||
|
if (timerId != undefined) {
|
||||||
|
clearTimeout(timerId);
|
||||||
|
}
|
||||||
|
answerQuery += speechResult;
|
||||||
|
timerId = window.setTimeout(
|
||||||
|
function () {
|
||||||
|
// if (!rePrompt) {
|
||||||
|
// ws.send('ich brauche noch etwas Zeit')
|
||||||
|
// } else {
|
||||||
|
console.log('recording end. Evaluate: ' + answerQuery);
|
||||||
|
handleAnswer(answerQuery);
|
||||||
|
answerQuery = '';
|
||||||
|
diagnosticPara.textContent = '';
|
||||||
|
// }
|
||||||
|
recognition.stop();
|
||||||
|
console.log('timer fallback');
|
||||||
|
}, timeOut);
|
||||||
|
} else {
|
||||||
|
console.log('recording end.');
|
||||||
|
recognition.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
recognition.onspeechend = function () {
|
||||||
|
// recognition.stop();
|
||||||
|
// testBtn.disabled = false;
|
||||||
|
// testBtn.textContent = 'Start new test';
|
||||||
|
};
|
||||||
|
|
||||||
|
recognition.onerror = function (event) {
|
||||||
|
testBtn.disabled = false;
|
||||||
|
testBtn.textContent = 'Start new test';
|
||||||
|
diagnosticPara.textContent = 'Error occurred in recognition: ' + event.error;
|
||||||
|
};
|
||||||
|
|
||||||
|
recognition.onaudiostart = function (event) {
|
||||||
|
// Fired when the user agent has started to capture audio.
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
recognition.onaudioend = function (event) {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
recognition.onend = function (event) {
|
||||||
|
// Fired when the speech recognition service has disconnected.
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
recognition.onnomatch = function (event) {
|
||||||
|
// Fired when the speech recognition service returns a final result with no significant recognition. This may involve some degree of recognition, which doesn't meet or exceed the confidence threshold.
|
||||||
|
// console.log('SpeechRecognition.onnomatch')
|
||||||
|
};
|
||||||
|
|
||||||
|
recognition.onsoundstart = function (event) {
|
||||||
|
// Fired when any sound — recognisable speech or not — has been detected.
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
recognition.onsoundend = function (event) {
|
||||||
|
// Fired when any sound — recognisable speech or not — has stopped being detected.
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
recognition.onspeechstart = function (event) {
|
||||||
|
// Fired when sound that is recognised by the speech recognition service as speech has been detected.
|
||||||
|
|
||||||
|
};
|
||||||
|
recognition.onstart = function (event) {
|
||||||
|
// Fired when the speech recognition service has begun listening to incoming audio with intent to recognize grammars associated with the current SpeechRecognition.
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
testBtn.addEventListener('click', startDemenzScreening);
|
||||||
|
testBtn2.addEventListener('click', testSpeechOut);
|
596
lebensmittel.txt
Normal file
596
lebensmittel.txt
Normal file
@ -0,0 +1,596 @@
|
|||||||
|
Aalsuppe
|
||||||
|
Agavendicksaft
|
||||||
|
Ahornsirup
|
||||||
|
Ajvar
|
||||||
|
Ananas
|
||||||
|
Anis
|
||||||
|
Anona
|
||||||
|
Apfel
|
||||||
|
Apfelkompott
|
||||||
|
Apfelkraut
|
||||||
|
Apfelsine
|
||||||
|
Aprikose
|
||||||
|
Artischocke
|
||||||
|
Artischockenherz
|
||||||
|
Aubergine
|
||||||
|
Auflauf
|
||||||
|
Austernpilz
|
||||||
|
Avocado
|
||||||
|
Backaroma
|
||||||
|
Backfett
|
||||||
|
Backware
|
||||||
|
Backwerk
|
||||||
|
Baiser
|
||||||
|
Balsamessig
|
||||||
|
Balsamico
|
||||||
|
Banane
|
||||||
|
Basilikum
|
||||||
|
Bauernbrot
|
||||||
|
Bergkäse
|
||||||
|
Bienenstich
|
||||||
|
Birne
|
||||||
|
Biskuitteig
|
||||||
|
Bitterschokolade
|
||||||
|
Blattsalat
|
||||||
|
Blattspinat
|
||||||
|
Blaubeere
|
||||||
|
Blaukohl
|
||||||
|
Blaukraut
|
||||||
|
Blauschimmelkäse
|
||||||
|
Blätterteig
|
||||||
|
Blumenkohl
|
||||||
|
Blutorange
|
||||||
|
Blutwurst
|
||||||
|
Blütenhonig
|
||||||
|
Bockwurst
|
||||||
|
Bohne
|
||||||
|
Bohnenkraut
|
||||||
|
Bohnensuppe
|
||||||
|
Borschtsch
|
||||||
|
Boskop
|
||||||
|
Bouillon
|
||||||
|
Bouillonwürfel
|
||||||
|
Bratapfel
|
||||||
|
Bratwurst
|
||||||
|
Broccoli
|
||||||
|
Brokkoli
|
||||||
|
Brombeere
|
||||||
|
Brot
|
||||||
|
Brotaufstrich
|
||||||
|
Brotsuppe
|
||||||
|
Brotteig
|
||||||
|
Brunnenkresse
|
||||||
|
Brühwürfel
|
||||||
|
Buchweizen
|
||||||
|
Butter
|
||||||
|
Buttercreme
|
||||||
|
Buttergebäck
|
||||||
|
Butterkäse
|
||||||
|
Butterkeks
|
||||||
|
Butterpilz
|
||||||
|
Büchsenmilch
|
||||||
|
Béchamelsauce
|
||||||
|
Béchamelsoße
|
||||||
|
Calzone
|
||||||
|
Camembert
|
||||||
|
Cannelloni
|
||||||
|
Cashew
|
||||||
|
Cashewnuss
|
||||||
|
Cayennepfeffer
|
||||||
|
Champignon
|
||||||
|
Cheddarkäse
|
||||||
|
Chester
|
||||||
|
Chesterkäse
|
||||||
|
Chicorée
|
||||||
|
Chili
|
||||||
|
Chilisauce
|
||||||
|
Chilisoße
|
||||||
|
Chinakohl
|
||||||
|
Chorizo
|
||||||
|
Christstollen
|
||||||
|
Ciabatta
|
||||||
|
Citrusfrucht
|
||||||
|
Clementine
|
||||||
|
Consommé
|
||||||
|
Cookie
|
||||||
|
Corned beef
|
||||||
|
Cornflakes
|
||||||
|
Couscous
|
||||||
|
Cranberry
|
||||||
|
Croissant
|
||||||
|
Crème fraîche
|
||||||
|
Curry
|
||||||
|
Currypulver
|
||||||
|
Currysauce
|
||||||
|
Currysoße
|
||||||
|
Currywurst
|
||||||
|
Dattel
|
||||||
|
Dattelpflaume
|
||||||
|
Datteltraube
|
||||||
|
Dauerwurst
|
||||||
|
Delikatesse
|
||||||
|
Delikatessgurke
|
||||||
|
Delikatesssenf
|
||||||
|
Dessert
|
||||||
|
Diätzucker
|
||||||
|
Dickmilch
|
||||||
|
Dill
|
||||||
|
Dinkel
|
||||||
|
Dinkelmehl
|
||||||
|
Distelöl
|
||||||
|
Dominostein
|
||||||
|
Dosenfleisch
|
||||||
|
Dosenmilch
|
||||||
|
Dosensuppe
|
||||||
|
Dosenwurst
|
||||||
|
Döner
|
||||||
|
Dörrfleisch
|
||||||
|
Dörrgemüse
|
||||||
|
Dörrobst
|
||||||
|
Dörrpflaume
|
||||||
|
Dressing
|
||||||
|
Drops
|
||||||
|
Edamer
|
||||||
|
Edamer Käse
|
||||||
|
Edelpilzkäse
|
||||||
|
Ei
|
||||||
|
Eierkuchen
|
||||||
|
Eigelb
|
||||||
|
Einbrennsuppe
|
||||||
|
Eingemachtes
|
||||||
|
Eingetropftes
|
||||||
|
Eintopf
|
||||||
|
Eisbergsalat
|
||||||
|
Emmentaler
|
||||||
|
Ente
|
||||||
|
Entenklein
|
||||||
|
Erbse
|
||||||
|
Erbsensuppe
|
||||||
|
Erdbeere
|
||||||
|
Erdnuss
|
||||||
|
Erdnussbutter
|
||||||
|
Erdnussflip
|
||||||
|
Erdnussmus
|
||||||
|
Erdnussöl
|
||||||
|
Esrom
|
||||||
|
Essen
|
||||||
|
Essig
|
||||||
|
Essiggurke
|
||||||
|
Esskastanie
|
||||||
|
Esswaren
|
||||||
|
Estragon
|
||||||
|
Feige
|
||||||
|
Feinbackwaren
|
||||||
|
Feingebäck
|
||||||
|
Feinkost
|
||||||
|
Felchen
|
||||||
|
Feldbohne
|
||||||
|
Feldfrucht
|
||||||
|
Feldsalat
|
||||||
|
Fenchel
|
||||||
|
Feta
|
||||||
|
Fett
|
||||||
|
Fettuccine
|
||||||
|
Filet
|
||||||
|
Fisch
|
||||||
|
Fischfilet
|
||||||
|
Fischkonserve
|
||||||
|
Fischrogen
|
||||||
|
Fischstäbchen
|
||||||
|
Fischsuppe
|
||||||
|
Fladenbrot
|
||||||
|
Flammkuchen
|
||||||
|
Flädlesuppe
|
||||||
|
Flädlisuppe
|
||||||
|
Fleckerlsuppe
|
||||||
|
Fleischbrühe
|
||||||
|
Fleischkonserve
|
||||||
|
Fleischsuppe
|
||||||
|
Fliederbeere
|
||||||
|
Fliederbeersuppe
|
||||||
|
Florentiner
|
||||||
|
Foie gras
|
||||||
|
Frankfurter
|
||||||
|
Frischkäse
|
||||||
|
Frittatensuppe
|
||||||
|
Frozen Yoghurt
|
||||||
|
Frucht
|
||||||
|
Fruchtbonbon
|
||||||
|
Fruchteis
|
||||||
|
Fruchtjoghurt
|
||||||
|
Fruchtjogurt
|
||||||
|
Früchtebrot
|
||||||
|
Früchtequark
|
||||||
|
Frühlingsrolle
|
||||||
|
Frühlingssuppe
|
||||||
|
Frühlingszwiebel
|
||||||
|
Frühstücksbrot
|
||||||
|
Fufu
|
||||||
|
Garnele
|
||||||
|
Gebäck
|
||||||
|
Gehacktes
|
||||||
|
Gelee
|
||||||
|
Gemüsesuppe
|
||||||
|
Gemüsezwiebel
|
||||||
|
Gerste
|
||||||
|
Gerstensuppe
|
||||||
|
Gerstlsuppe
|
||||||
|
Getreide
|
||||||
|
Gewürz
|
||||||
|
Gewürzgurke
|
||||||
|
Gorgonzola
|
||||||
|
Gouda
|
||||||
|
Graupe
|
||||||
|
Graupensuppe
|
||||||
|
Greyerzer
|
||||||
|
Grieß
|
||||||
|
Grießbrei
|
||||||
|
Grießkloß
|
||||||
|
Grießklößchen
|
||||||
|
Grießknödel
|
||||||
|
Grießmehl
|
||||||
|
Grießnockerl
|
||||||
|
Grießpudding
|
||||||
|
Grießschmarren
|
||||||
|
Grießsuppe
|
||||||
|
Grünkohl
|
||||||
|
Gulasch
|
||||||
|
Gulaschsuppe
|
||||||
|
Gurke
|
||||||
|
Gyros
|
||||||
|
Hackepeter
|
||||||
|
Hackfleisch
|
||||||
|
Hafer
|
||||||
|
Haferflocken
|
||||||
|
Hagebutte
|
||||||
|
Haifischflossensuppe
|
||||||
|
Hartkäse
|
||||||
|
Harzer
|
||||||
|
Haselnuss
|
||||||
|
Hefe
|
||||||
|
Hefezopf
|
||||||
|
Heidelbeere
|
||||||
|
Hering
|
||||||
|
Heringssalat
|
||||||
|
Hibiskustee
|
||||||
|
Himbeere
|
||||||
|
Himbeereis
|
||||||
|
Hirse
|
||||||
|
Holunderblütensirup
|
||||||
|
Honig
|
||||||
|
Honigkuchen
|
||||||
|
Honigmelone
|
||||||
|
Hummer
|
||||||
|
Hummersuppe
|
||||||
|
Hummus
|
||||||
|
Hühnerfleisch
|
||||||
|
Igel
|
||||||
|
Ingwer
|
||||||
|
Instantsuppe
|
||||||
|
Jagdwurst
|
||||||
|
Jasmintee
|
||||||
|
Jägersuppe
|
||||||
|
Joghurt
|
||||||
|
Johannisbeere
|
||||||
|
Johannisbrot
|
||||||
|
Julienne
|
||||||
|
Juliennesuppe
|
||||||
|
Kakaopulver
|
||||||
|
Kaki
|
||||||
|
Kaltschale
|
||||||
|
Kandis
|
||||||
|
Kandiszucker
|
||||||
|
Karamell
|
||||||
|
Karamellbonbon
|
||||||
|
Kardamom
|
||||||
|
Karotte
|
||||||
|
Kartoffel
|
||||||
|
Kartoffelchip
|
||||||
|
Kartoffeln
|
||||||
|
Kartoffelsuppe
|
||||||
|
Käse
|
||||||
|
Käsebrötchen
|
||||||
|
Käsekuchen
|
||||||
|
Keks
|
||||||
|
Kirsche
|
||||||
|
Kiwi
|
||||||
|
Knoblauch
|
||||||
|
Knoblauchbutter
|
||||||
|
Knoblauchöl
|
||||||
|
Knoblauchpulver
|
||||||
|
Knoblauchsalz
|
||||||
|
Knoblauchsoße
|
||||||
|
Knoblauchwurst
|
||||||
|
Kohl
|
||||||
|
Kohlroulade
|
||||||
|
Koriander
|
||||||
|
Krakauer
|
||||||
|
Krankensuppe
|
||||||
|
Krapfen
|
||||||
|
Kraut
|
||||||
|
Kräuterbutter
|
||||||
|
Kräuterkäse
|
||||||
|
Krebsfleisch
|
||||||
|
Krebssuppe
|
||||||
|
Kreplach
|
||||||
|
Kreuzkümmel
|
||||||
|
Kuchen
|
||||||
|
Kurkuma
|
||||||
|
Kümmel
|
||||||
|
Kürbis
|
||||||
|
Kürbiskern
|
||||||
|
Kürbiskernbrot
|
||||||
|
Kürbissuppe
|
||||||
|
Labskaus
|
||||||
|
Lachs
|
||||||
|
Lammfleisch
|
||||||
|
Languste
|
||||||
|
Lauch
|
||||||
|
Lauchzwiebel
|
||||||
|
Lebensmittel
|
||||||
|
Leberwurst
|
||||||
|
Lebkuchen
|
||||||
|
Lebkuchengewürz
|
||||||
|
Limburger
|
||||||
|
Limette
|
||||||
|
Linguine
|
||||||
|
Linse
|
||||||
|
Linsensuppe
|
||||||
|
Lorbeerblatt
|
||||||
|
Magermilchpulver
|
||||||
|
Mais
|
||||||
|
Maisgrieß
|
||||||
|
Maiskolben
|
||||||
|
Maismehl
|
||||||
|
Majoran
|
||||||
|
Mandarine
|
||||||
|
Mandel
|
||||||
|
Mandelkern
|
||||||
|
Mango
|
||||||
|
Maniok
|
||||||
|
Maracuja
|
||||||
|
Margarine
|
||||||
|
Marmelade
|
||||||
|
Marmorkuchen
|
||||||
|
Marzipan
|
||||||
|
Mascarpone
|
||||||
|
Matcha
|
||||||
|
Meerrettich
|
||||||
|
Mehl
|
||||||
|
Melone
|
||||||
|
Mett
|
||||||
|
Mettwurst
|
||||||
|
Milchpulver
|
||||||
|
Milchsuppe
|
||||||
|
Mohn
|
||||||
|
Mohnbrötchen
|
||||||
|
Mozzarella
|
||||||
|
Möhre
|
||||||
|
Mus
|
||||||
|
Müsli
|
||||||
|
Nektarinen
|
||||||
|
Nockerl
|
||||||
|
Nockerlsuppe
|
||||||
|
Noisette
|
||||||
|
Noisetteschokolade
|
||||||
|
Nudeln
|
||||||
|
Nugat
|
||||||
|
Nuss
|
||||||
|
Nusskuchen
|
||||||
|
Nussschinken
|
||||||
|
Nussschokolade
|
||||||
|
Obst
|
||||||
|
Obstkuchen
|
||||||
|
Okroschka
|
||||||
|
Olive
|
||||||
|
Olivenöl
|
||||||
|
Omelett
|
||||||
|
Orange
|
||||||
|
Orangeat
|
||||||
|
Oregano
|
||||||
|
Pampelmuse
|
||||||
|
Panadelsuppe
|
||||||
|
Paprika
|
||||||
|
Paranuss
|
||||||
|
Parmesankäse
|
||||||
|
Pasta
|
||||||
|
Pastete
|
||||||
|
Pastinake
|
||||||
|
Pecannuss
|
||||||
|
Pekannuss
|
||||||
|
Peperoni
|
||||||
|
Persillade
|
||||||
|
Pesto
|
||||||
|
Petersilie
|
||||||
|
Pfannkuchen
|
||||||
|
Pfeffer
|
||||||
|
Pfefferkuchen
|
||||||
|
Pferdefleisch
|
||||||
|
Pfifferling
|
||||||
|
Pfirsich
|
||||||
|
Pflaume
|
||||||
|
Pilz
|
||||||
|
Pilzsuppe
|
||||||
|
Piment
|
||||||
|
Pinienkerne
|
||||||
|
Pistazie
|
||||||
|
Pita
|
||||||
|
Pitabrot
|
||||||
|
Pizza
|
||||||
|
Plätzchen
|
||||||
|
Polenta
|
||||||
|
Pommes frites
|
||||||
|
Porridge
|
||||||
|
Posaunensuppe
|
||||||
|
Potage
|
||||||
|
Preiselbeere
|
||||||
|
Puderzucker
|
||||||
|
Puffreis
|
||||||
|
Pumpernickel
|
||||||
|
Putenfleisch
|
||||||
|
Quark
|
||||||
|
Quarkbällchen
|
||||||
|
Quarktasche
|
||||||
|
Quiche
|
||||||
|
Quitte
|
||||||
|
Radicchio
|
||||||
|
Radieschen
|
||||||
|
Rahm
|
||||||
|
Rahmsuppe
|
||||||
|
Ramen
|
||||||
|
Ravioli
|
||||||
|
Räucherlachs
|
||||||
|
Reis
|
||||||
|
Reissuppe
|
||||||
|
Remoulade
|
||||||
|
Rettich
|
||||||
|
Rhabarber
|
||||||
|
Ricotta
|
||||||
|
Rindfleisch
|
||||||
|
Rindfleischsuppe
|
||||||
|
Roggen
|
||||||
|
Roggenbrot
|
||||||
|
Rohkost
|
||||||
|
Rohrzucker
|
||||||
|
Rollmops
|
||||||
|
Romadur
|
||||||
|
Rosenkohl
|
||||||
|
Rosine
|
||||||
|
Rosinenkuchen
|
||||||
|
Rosinenschnecke
|
||||||
|
Rosmarin
|
||||||
|
Rote Beete
|
||||||
|
Rotkohl
|
||||||
|
Rotkraut
|
||||||
|
Rotschimmelkäse
|
||||||
|
Rucola
|
||||||
|
Rumfordsuppe
|
||||||
|
Rumkugel
|
||||||
|
Rübe
|
||||||
|
Rübenkraut
|
||||||
|
Rübenzucker
|
||||||
|
Salami
|
||||||
|
Salatgurke
|
||||||
|
Salbei
|
||||||
|
Salz
|
||||||
|
Salzbrezel
|
||||||
|
Salzgurke
|
||||||
|
Salzstange
|
||||||
|
Sauerkraut
|
||||||
|
Sauermilch
|
||||||
|
Sauermilchquark
|
||||||
|
Sauerrahm
|
||||||
|
Schafskäse
|
||||||
|
Schalotte
|
||||||
|
Schildkrötensuppe
|
||||||
|
Schinken
|
||||||
|
Schleimsuppe
|
||||||
|
Schmorbraten
|
||||||
|
Schnittlauch
|
||||||
|
Schokolade
|
||||||
|
Schwalbennestersuppe
|
||||||
|
Schwarzbrot
|
||||||
|
Schwarzkümmel
|
||||||
|
Schwarzwurzel
|
||||||
|
Schweinefleisch
|
||||||
|
Seitan
|
||||||
|
Sellerie
|
||||||
|
Senf
|
||||||
|
Senfgurke
|
||||||
|
Sesam
|
||||||
|
Sesambrötchen
|
||||||
|
Sesamsauce
|
||||||
|
Soja
|
||||||
|
Sojasprossen
|
||||||
|
Soljanka
|
||||||
|
Sonnenblumenkern
|
||||||
|
Spaghetti
|
||||||
|
Spargel
|
||||||
|
Spargelsuppe
|
||||||
|
Spätzle
|
||||||
|
Spekulatius
|
||||||
|
Spinat
|
||||||
|
Spreewaldgurke
|
||||||
|
Spritzgebäck
|
||||||
|
Steinpilz
|
||||||
|
Sternanis
|
||||||
|
Stollen
|
||||||
|
Stracciatella
|
||||||
|
Stutenmilch
|
||||||
|
Suppenextrakt
|
||||||
|
Suppenfleisch
|
||||||
|
Suppengrün
|
||||||
|
Suppenhuhn
|
||||||
|
Suppenknochen
|
||||||
|
Suppenspargel
|
||||||
|
Suppenwürfel
|
||||||
|
Sushi
|
||||||
|
Süßkartoffel
|
||||||
|
Süßrahm
|
||||||
|
Süßrahmbutter
|
||||||
|
Tagessuppe
|
||||||
|
Tagliatelle
|
||||||
|
Tahin
|
||||||
|
Tamarinde
|
||||||
|
Tapioka
|
||||||
|
Teewurst
|
||||||
|
Tellerfleisch
|
||||||
|
Tempeh
|
||||||
|
Terrine
|
||||||
|
Tiefkühlkost
|
||||||
|
Tiefkühlpizza
|
||||||
|
Tilsiter
|
||||||
|
Tiramisu
|
||||||
|
Toast
|
||||||
|
Tofu
|
||||||
|
Tomate
|
||||||
|
Tomatenmark
|
||||||
|
Tomatensoße
|
||||||
|
Tomatensuppe
|
||||||
|
Topinambur
|
||||||
|
Tortellini
|
||||||
|
Traube
|
||||||
|
Traubenkernöl
|
||||||
|
Urbrot
|
||||||
|
Vanille
|
||||||
|
Vanillerostbraten
|
||||||
|
Vanillezucker
|
||||||
|
Vanillinzucker
|
||||||
|
Vollkornbrot
|
||||||
|
Vollkornmehl
|
||||||
|
Vollmilchpulver
|
||||||
|
Vollmilchschokolade
|
||||||
|
Vollrohrzucker
|
||||||
|
Walnuss
|
||||||
|
Wasabi
|
||||||
|
Wassersuppe
|
||||||
|
Weichkäse
|
||||||
|
Weihnachtsgebäck
|
||||||
|
Weintraube
|
||||||
|
Weißbrot
|
||||||
|
Weißkohl
|
||||||
|
Weißkraut
|
||||||
|
Weizen
|
||||||
|
Weizengrieß
|
||||||
|
Weizenmehl
|
||||||
|
Wirsing
|
||||||
|
Wurst
|
||||||
|
Wurstbrühe
|
||||||
|
Wurstsuppe
|
||||||
|
Zaziki
|
||||||
|
Ziegenkäse
|
||||||
|
Ziegenmilch
|
||||||
|
Zimt
|
||||||
|
Zimtstange
|
||||||
|
Zitronat
|
||||||
|
Zitrone
|
||||||
|
Zitronensaft
|
||||||
|
Zucker
|
||||||
|
Zuckerguss
|
||||||
|
Zuckerrübensirup
|
||||||
|
Zwiebel
|
||||||
|
Zwiebelkuchen
|
||||||
|
Zwiebelring
|
||||||
|
Zwiebelsuppe
|
||||||
|
Äpfel
|
||||||
|
Öl
|
12
server/dialogflow_cred_dem.json
Normal file
12
server/dialogflow_cred_dem.json
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"type": "service_account",
|
||||||
|
"project_id": "digitalerdemenztest",
|
||||||
|
"private_key_id": "1cb9f88917f63afddde619107e1ce106077c936e",
|
||||||
|
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCtI/uoe6Q48Ak3\nWyVqueUJAed4trmb2Bm6UeSrYU+5IGY6zO86JyOIUDwo3CxYq38q9N3xJdI91z36\nqDtPdf2j7bSfUPo1VMgVH4ZXLb06+ddJBFxxEXLlJrGbWsKareZC2+Zoat0oOhSv\n8XQIdTBwzwC/VJs5KFmb2eh6uNsMVPhFivpQc4dkMGslreLvgQdJMDje7prRB6su\nOnAvKl1cFPpMg++e6vfeKZmoGUSv81ytV8Iu5QbTRabJvmeEba1QgTSqDdZw7EcM\nxB38Jv7TCnALmCi0pBSKiyJk/7m07b2Vj4huIYPAWsAe6cPs6m+CZEGnvCXqgU+v\nfbmX3eZbAgMBAAECggEABobZOUAz8BuIVWhfsDbCvgSu25uTwp6yVZY5twYrkbB5\nehT4naoVClHv+qBWIZ+RYyao6SrCUqd3BChsV/H8Nj5DNVBBploEUtuF3mpwfDUn\n2u5Jp89/E8lSH6ebt2X/zJxqgpwoqxgJaJqDA8CbK116Szwev9hYDGp5+4pVY5EO\njDeZBJaY97hoDFjK4EKepLr0NPHWjfkxDBGzmm1kzfqYiVXw36tEyFIeuwJR9g1A\nQyLuyRfxWZ7o6sYNvSRciwGG+uzGcQpXoFfiOgzU0dzLeje+aQHdKmQLFsJ2Wnux\n45fe+IkePWtSWpr+zd0DEw8v2RGR2tEgONresylycQKBgQDXtm+9BSX9vEaOjxaI\ne8UTtoZ3t189E7bZ3xT2k5yRNPCMfnvR5RklFIv+zsbj1ilWIUTuMufdZWEy6sca\nyeifOL/Qqz2mokFa2gBO1zVl8kawWlxoeiPEAhpDw7XGwTCXgNDQsEaItdlosZUN\n4AHXjNmfzWQFZOhX9Fwgn6O3iwKBgQDNehuT50uC4zLjTCef+jypL/PMqssoFRxH\nXDqYoRkYHx8xwzSZsvc8eTboz8iC53IEbz8IAA7wYNxdun5sKGa56b1ZyyF+HQdj\ngCuHPKrWGVSuipxq68V3AJ8jqcfWxbmwzVJs4kUCjMCts1f8D+7D/c3knH1wbT+J\nh7mN+3nmcQKBgG+kpXo/8uS7EA1ycygaXuqP+lJ1np4e2PE0K0ZfKZZhvuoIAI+m\nsffmBXrQjFGZIvXH7EQYJrcIZGEU8A2mWHYnyeb26caXjZm24JftfF6SIRHfApq0\nNFSa/fr6jNccX8jZy7lmsmrJK4eq+UkgGfP0myHBDLZZ/oKfHxtnZDV3AoGABrDR\nMRG4/bwULh6Os8DcNM4g7CsrjlSRpSk1pz6nqIdq5p3qmo6fSlLQHOiXKNwMdGSC\n8um9kso0osCt2Su/nJIl3kSlBIxBb1X/FNo+3dXZUg2lZj3jIirdA7ZFkZLCpyUo\nZ+8+PAUFSSKr3MNQDQW4rJcD5qNIDFxlCGCF6aECgYEArXlfVjBTQVZGt30hRhoC\n21CFcy++vYsDSZK8ah1cfuMXnz8rAU7qQSPXSpbQC5/Jr1+FOszeHAuvIQRVF4ZZ\neP6QVicxxurN7v+oBzWpqFnpsyxHcTUxsokATg9VXSAYLHvG1bICLem/giC56Twa\ncRvr50JjmWe2XZX8Um94WU4=\n-----END PRIVATE KEY-----\n",
|
||||||
|
"client_email": "demenz-dialogflow@digitalerdemenztest.iam.gserviceaccount.com",
|
||||||
|
"client_id": "114624321748994791485",
|
||||||
|
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
||||||
|
"token_uri": "https://oauth2.googleapis.com/token",
|
||||||
|
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
|
||||||
|
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/demenz-dialogflow%40digitalerdemenztest.iam.gserviceaccount.com"
|
||||||
|
}
|
2984
server/package-lock.json
generated
Normal file
2984
server/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
24
server/package.json
Normal file
24
server/package.json
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"name": "websocket_example",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "ws-client.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1",
|
||||||
|
"tunnel": "ngrok http 8000"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"dialogflow": "^0.10.0",
|
||||||
|
"express": "^4.17.1",
|
||||||
|
"ngrok": "^3.1.1",
|
||||||
|
"path": "^0.12.7",
|
||||||
|
"websocket": "^1.0.28",
|
||||||
|
"ws": "^7.0.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"standard": "^12.0.1"
|
||||||
|
}
|
||||||
|
}
|
93
server/ws-server.js
Normal file
93
server/ws-server.js
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
// dialogflow
|
||||||
|
const dialogflow = require('dialogflow');
|
||||||
|
|
||||||
|
// server and websocket
|
||||||
|
const WebSocket = require('ws');
|
||||||
|
const http = require('http');
|
||||||
|
const path = require('path');
|
||||||
|
const express = require('express');
|
||||||
|
|
||||||
|
const webSocketsServerPort = 8000;
|
||||||
|
const serverpath = '/ws';
|
||||||
|
const app = express();
|
||||||
|
const router = express.Router();
|
||||||
|
|
||||||
|
router.get('/', function (req, res) {
|
||||||
|
res.sendFile(path.join(__dirname + '/index.html'));
|
||||||
|
});
|
||||||
|
|
||||||
|
app.use(express.static(__dirname + '/../client'));
|
||||||
|
|
||||||
|
app.use('/', router);
|
||||||
|
|
||||||
|
var server = http.createServer(app);
|
||||||
|
|
||||||
|
server.listen(process.env.port || webSocketsServerPort, function () {
|
||||||
|
console.log((new Date()) + ' Server is listening on port ' +
|
||||||
|
webSocketsServerPort);
|
||||||
|
});
|
||||||
|
|
||||||
|
const wss = new WebSocket.Server({ server: server, path: serverpath });
|
||||||
|
|
||||||
|
wss.on('connection', function connection (ws) {
|
||||||
|
ws.id = wss.getUniqueID();
|
||||||
|
|
||||||
|
console.log(ws.id + ' connected');
|
||||||
|
|
||||||
|
ws.on('message', function incoming (message) {
|
||||||
|
promptQuery(message, ws);
|
||||||
|
});
|
||||||
|
|
||||||
|
ws.on('close', function (connection) {
|
||||||
|
// close user connection
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const projectId = 'digitalerdemenztest';
|
||||||
|
|
||||||
|
const sessionClient = new dialogflow.SessionsClient({
|
||||||
|
keyFilename: 'dialogflow_cred_dem.json'
|
||||||
|
});
|
||||||
|
|
||||||
|
// Send request and log result
|
||||||
|
function promptQuery (prompt, wsock) {
|
||||||
|
let sessionId = wsock.id;
|
||||||
|
let sessionPath = sessionClient.sessionPath(projectId, sessionId);
|
||||||
|
|
||||||
|
const request = {
|
||||||
|
session: sessionPath,
|
||||||
|
queryInput: {
|
||||||
|
text: {
|
||||||
|
text: prompt,
|
||||||
|
languageCode: 'de-DE'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
sessionClient
|
||||||
|
.detectIntent(request)
|
||||||
|
.then(responses => {
|
||||||
|
const result = responses[0].queryResult;
|
||||||
|
console.log(` Query: ${result.queryText}`);
|
||||||
|
console.log(` Response: ${result.fulfillmentText}`);
|
||||||
|
if (result.intent) {
|
||||||
|
console.log(` Intent: ${result.intent.displayName}`);
|
||||||
|
} else {
|
||||||
|
console.log(` No intent matched.`);
|
||||||
|
}
|
||||||
|
wsock.send(JSON.stringify(result));
|
||||||
|
|
||||||
|
// checkIntent(result)
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
console.error('ERROR:', err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// create unique id
|
||||||
|
wss.getUniqueID = function () {
|
||||||
|
function s4 () {
|
||||||
|
return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
|
||||||
|
}
|
||||||
|
return s4() + s4() + '-' + s4();
|
||||||
|
};
|
Loading…
x
Reference in New Issue
Block a user