mirror of https://github.com/doccano/doccano.git
pythonannotation-tooldatasetsactive-learningtext-annotationdatasetnatural-language-processingdata-labelingmachine-learning
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
2.8 KiB
120 lines
2.8 KiB
<template lang="pug">
|
|
extends ./annotation.pug
|
|
|
|
block annotation-area
|
|
div.card.has-text-weight-bold.has-text-white.has-background-royalblue
|
|
div.card-content
|
|
div.content
|
|
audio(
|
|
ref="player"
|
|
controls
|
|
v-bind:src="audioFile"
|
|
v-shortkey="{ playOrPauseAudio: ['alt', 'p'] }"
|
|
v-on:shortkey="playOrPauseAudio"
|
|
)
|
|
|
|
section
|
|
header.header
|
|
textarea.textarea(
|
|
v-model="transcription"
|
|
v-debounce="syncTranscription"
|
|
type="text"
|
|
placeholder="Transcribe audio here..."
|
|
autofocus
|
|
)
|
|
</template>
|
|
|
|
<style scoped>
|
|
audio {
|
|
height: 3em;
|
|
width: 100%;
|
|
display: block;
|
|
margin: 0 auto;
|
|
}
|
|
</style>
|
|
|
|
<script>
|
|
import annotationMixin from './annotationMixin';
|
|
import HTTP from './http';
|
|
|
|
export default {
|
|
mixins: [annotationMixin],
|
|
|
|
data: () => ({
|
|
transcription: '',
|
|
isAudioPlaying: false,
|
|
}),
|
|
|
|
computed: {
|
|
annotation() {
|
|
const annotations = this.annotations[this.pageNumber];
|
|
return annotations && annotations[0];
|
|
},
|
|
|
|
audioFile() {
|
|
const docs = this.docs[this.pageNumber];
|
|
return docs && docs.text;
|
|
},
|
|
},
|
|
|
|
watch: {
|
|
annotations() {
|
|
this.updateTranscription();
|
|
},
|
|
|
|
pageNumber() {
|
|
this.updateTranscription();
|
|
},
|
|
},
|
|
|
|
methods: {
|
|
async playOrPauseAudio() {
|
|
const player = this.$refs.player;
|
|
if (this.isAudioPlaying) {
|
|
player.pause();
|
|
this.isAudioPlaying = false;
|
|
} else {
|
|
await player.play();
|
|
this.isAudioPlaying = true;
|
|
}
|
|
},
|
|
|
|
updateTranscription() {
|
|
const text = this.annotation && this.annotation.text;
|
|
this.transcription = text || '';
|
|
},
|
|
|
|
async syncTranscription(text) {
|
|
const docId = this.docs[this.pageNumber].id;
|
|
const annotations = this.annotations[this.pageNumber];
|
|
const hasTranscription = text.trim().length > 0;
|
|
|
|
if (!hasTranscription && !this.annotation) {
|
|
return;
|
|
}
|
|
|
|
if (!hasTranscription && this.annotation) {
|
|
await HTTP.delete(`docs/${docId}/annotations/${this.annotation.id}`);
|
|
annotations.splice(0, annotations.length);
|
|
return;
|
|
}
|
|
|
|
if (this.annotation) {
|
|
const annotation = { ...this.annotation, text };
|
|
await HTTP.put(`docs/${docId}/annotations/${this.annotation.id}`, annotation);
|
|
} else {
|
|
const annotation = { text };
|
|
const response = await HTTP.post(`docs/${docId}/annotations`, annotation);
|
|
annotations.unshift({ ...response.data, text });
|
|
}
|
|
},
|
|
|
|
async submit() {
|
|
const state = this.getState();
|
|
this.url = `docs?q=${this.searchQuery}&speech2text_annotations__isnull=${state}&offset=${this.offset}&ordering=${this.ordering}`;
|
|
await this.search();
|
|
this.pageNumber = 0;
|
|
},
|
|
},
|
|
};
|
|
</script>
|