JSFiddle - React, Tailwind, and code Playground
by Adrian Mejias
HTML
<div id="app">
<v-app id="inspire">
<v-container fluid>
<v-layout row wrap justify-center class="mt-4">
<v-flex xs12 sm10 text-xs-center>
<v-text-field
label="The text"
v-model="text"
textarea
></v-text-field>
</v-flex>
<v-flex xs12 sm8 md4 text-xs-center>
<speech-to-text :text.sync="text" @speechend="speechEnd"></speech-to-text>
</v-flex>
<v-flex xs12 text-xs-center class="mt-4">
{{sentences}}
</v-flex>
</v-layout>
</v-container>
</v-app>
</div>
Babel + JSX
let SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition
let recognition = SpeechRecognition? new SpeechRecognition() : false
Vue.component('speech-to-text', {
template: `
<v-card>
<v-card-text>
<v-layout row wrap justify-space-around>
<v-flex xs8 sm9 text-xs-center>
<p v-if="error" class="grey--text">{{error}}</p>
<p v-else class="mb-0">
<span v-if="sentences.length > 0" v-for="sentence in sentences">{{sentence}}. </span>
<span>{{runtimeTranscription}}</span>
</p>
</v-flex>
<v-flex xs2 sm1 text-xs-center>
<v-btn
dark
@click.stop="toggle ? endSpeechRecognition() : startSpeechRecognition()"
icon
:color="!toggle ? 'grey' : (speaking ? 'red' : 'red darken-3')"
:class="{'animated infinite pulse': toggle}"
>
<v-icon>{{toggle ? 'mic_off' : 'mic'}}</v-icon>
</v-btn>
</v-flex>
</v-layout>
</v-card-text>
</v-card>
`,
props: {
lang: {
type: String,
default: 'en-US'
},
text: {
type: [String, null],
required: true
}
},
data () {
return {
error: false,
speaking: false,
toggle: false,
runtimeTranscription: '',
sentences: []
}
},
methods: {
checkCompatibility () {
if (!recognition) {
this.error = 'Speech Recognition is not available on this browser. Please use Chrome or Firefox'
}
},
endSpeechRecognition () {
recognition.stop()
this.toggle = false
this.$emit('speechend', {
sentences: this.sentences,
text: this.sentences.join('. ')
})
},
startSpeechRecognition () {
if (!recognition) {
this.error = 'Speech Recognition is not available on this browser. Please use Chrome or Firefox'
return false
}
this.toggle = true
recognition.lang =...