# 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 |
{ | |||||
"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" | |||||
}, | |||||
] | |||||
} |
{ | |||||
"workbench.settings.openDefaultKeybindings": true | |||||
} |
<!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> |
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; | |||||
} |
// 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); |
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 |
{ | |||||
"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" | |||||
} |
{ | |||||
"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" | |||||
} | |||||
} |
// 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(); | |||||
}; |