|
@@ -0,0 +1,707 @@
|
|
|
+<template>
|
|
|
+ <el-dialog
|
|
|
+ title="对话预览"
|
|
|
+ :visible.sync="talkPreviewDialog"
|
|
|
+ :append-to-body="true"
|
|
|
+ width="100%"
|
|
|
+ :before-close="handleClose"
|
|
|
+ class="dialog_diy"
|
|
|
+ >
|
|
|
+ <div class="o_content">
|
|
|
+ <div class="d_box">
|
|
|
+ <div class="dialog">
|
|
|
+ <div class="d_img">
|
|
|
+ <img
|
|
|
+ :src="
|
|
|
+ require('../../../../assets/icon/englishVoice/icon_portal.png')
|
|
|
+ "
|
|
|
+ alt=""
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="d_content_message">
|
|
|
+ <div>Hello,以下是我们这次口语练习的要求:</div>
|
|
|
+ <div class="d_name" v-if="answerArray.time">
|
|
|
+ 练习时长:{{
|
|
|
+ answerArray.time == "all" ? "不限时" : answerArray.time + "min"
|
|
|
+ }}
|
|
|
+ </div>
|
|
|
+ <div class="d_name" v-if="answerArray.difficulty">
|
|
|
+ 设置难度:{{
|
|
|
+ answerArray.difficulty == 0
|
|
|
+ ? "简单"
|
|
|
+ : answerArray.difficulty == 1
|
|
|
+ ? "一般"
|
|
|
+ : "困难"
|
|
|
+ }}
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ class="d_name"
|
|
|
+ v-if="fName && sName"
|
|
|
+ style="
|
|
|
+ display: flex;
|
|
|
+ flex-direction: row;
|
|
|
+ flex-wrap: nowrap;
|
|
|
+ align-items: center;
|
|
|
+ width: 100%;
|
|
|
+ "
|
|
|
+ >
|
|
|
+ <div style="min-width: 60px">对话主题:</div>
|
|
|
+ <div style="width: calc(100% - 80px)">
|
|
|
+ {{ fName - sName }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="gotoTalk">我已了解,开始对话</div>
|
|
|
+ <div class="nowTime">{{ currentTime }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="dialog">
|
|
|
+ <div class="d_img">
|
|
|
+ <img
|
|
|
+ :src="
|
|
|
+ require('../../../../assets/icon/englishVoice/icon_portal.png')
|
|
|
+ "
|
|
|
+ alt=""
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="d_content">
|
|
|
+ <div class="d_voice">
|
|
|
+ <mini-audio
|
|
|
+ :audio-source="voice"
|
|
|
+ class="audio_class"
|
|
|
+ ></mini-audio>
|
|
|
+ </div>
|
|
|
+ <div class="d_log">
|
|
|
+ {{ content }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="nowTime" style="margin: 0 0 0 50px">
|
|
|
+ {{ currentTime }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="dialog dialog_right">
|
|
|
+ <div class="d_img">
|
|
|
+ <img
|
|
|
+ :src="
|
|
|
+ require('../../../../assets/icon/englishVoice/icon_portal.png')
|
|
|
+ "
|
|
|
+ alt=""
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="d_content">
|
|
|
+ <div class="d_voice">
|
|
|
+ <mini-audio
|
|
|
+ :audio-source="voice"
|
|
|
+ class="audio_class"
|
|
|
+ ></mini-audio>
|
|
|
+ </div>
|
|
|
+ <div class="d_log2">
|
|
|
+ {{ content }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <report v-if="lookReport"></report>
|
|
|
+ <div @click="lookReport = true" class="reportButton" :style="{bottom:lookReport ? '-360px' : '-35px'}">查看报告</div>
|
|
|
+ <div class="nowTime" style="margin: 0 50px 0 0; bottom: -60px" :style="{bottom:lookReport ? '-390px' : '-60px'}">
|
|
|
+ {{ currentTime }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="o_bottom" v-loading="isloading">
|
|
|
+ <div class="audio" v-if="!LuAudioUrl">
|
|
|
+ <img
|
|
|
+ v-if="!isRecord"
|
|
|
+ src="../../../../assets/icon/englishVoice/start_aduio.png"
|
|
|
+ alt=""
|
|
|
+ @click="startRecorder"
|
|
|
+ />
|
|
|
+ <img
|
|
|
+ v-else
|
|
|
+ src="../../../../assets/icon/englishVoice/stop_audio.png"
|
|
|
+ alt=""
|
|
|
+ @click="startRecorder"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="audio_word" v-if="!LuAudioUrl">
|
|
|
+ <span v-if="!isRecord">点击话筒开始录音</span>
|
|
|
+ <span v-else>点击话筒结束录音</span>
|
|
|
+ </div>
|
|
|
+ <div v-if="LuAudioUrl" class="audio_b">
|
|
|
+ <mini-audio :audio-source="LuAudioUrl" class="audio_class"></mini-audio>
|
|
|
+ </div>
|
|
|
+ <div v-if="LuAudioUrl" class="audio_rerecord" @click="restart()">
|
|
|
+ <span>录音</span>
|
|
|
+ </div>
|
|
|
+ <!-- <div v-else class="audio_ing">
|
|
|
+ <span>正在录音...</span>
|
|
|
+ </div> -->
|
|
|
+ <div class="checkFooter">
|
|
|
+ <div>上一步</div>
|
|
|
+ <div style="background: #3681fc; color: #fff; border: none">
|
|
|
+ 确认创建
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <iframe
|
|
|
+ allow="camera *; microphone *;display-capture;midi;encrypted-media;"
|
|
|
+ src="https://beta.cloud.cocorobo.cn/browser/public/index.html"
|
|
|
+ ref="iiframe"
|
|
|
+ v-show="false"
|
|
|
+ ></iframe>
|
|
|
+ </el-dialog>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import Recorder from "js-audio-recorder";
|
|
|
+const lamejs = require("lamejs");
|
|
|
+
|
|
|
+const recorder = new Recorder({
|
|
|
+ sampleBits: 16, // 采样位数,支持 8 或 16,默认是16
|
|
|
+ sampleRate: 48000, // 采样率,支持 11025、16000、22050、24000、44100、48000,根据浏览器默认值,我的chrome是48000
|
|
|
+ numChannels: 1, // 声道,支持 1 或 2, 默认是1
|
|
|
+ // compiling: false,(0.x版本中生效,1.x增加中) // 是否边录边转换,默认是false
|
|
|
+});
|
|
|
+
|
|
|
+// 绑定事件-打印的是当前录音数据
|
|
|
+recorder.onprogress = function (params) {
|
|
|
+ // console.log('--------------START---------------')
|
|
|
+ // console.log('录音时长(秒)', params.duration);
|
|
|
+ // console.log('录音大小(字节)', params.fileSize);
|
|
|
+ // console.log('录音音量百分比(%)', params.vol);
|
|
|
+ // console.log('当前录音的总数据([DataView, DataView...])', params.data);
|
|
|
+ // console.log('--------------END---------------')
|
|
|
+};
|
|
|
+import report from "./component/report.vue";
|
|
|
+export default {
|
|
|
+ components: {
|
|
|
+ report,
|
|
|
+ },
|
|
|
+ props: {
|
|
|
+ talkPreviewDialog: {
|
|
|
+ type: Boolean,
|
|
|
+ default: false,
|
|
|
+ },
|
|
|
+ oid: {
|
|
|
+ type: String,
|
|
|
+ },
|
|
|
+ org: {
|
|
|
+ type: String,
|
|
|
+ },
|
|
|
+ checkJson: {
|
|
|
+ type: Object,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ answerArray: [],
|
|
|
+ fName: "",
|
|
|
+ sName: "",
|
|
|
+ currentTime: "",
|
|
|
+ isloading: false,
|
|
|
+ LuAudioUrl: "",
|
|
|
+ isRecord: false,
|
|
|
+ calcTimer: null,
|
|
|
+ totalSeconds: 0,
|
|
|
+ voice: "",
|
|
|
+ lookReport: false,
|
|
|
+ content:
|
|
|
+ "Read the following text aloud.A Car Accident I saw a car accident this morning. A boy wanted to cross the road but he did not look carefully. He just ran out into the road. A car was coming and the driver stopped at once. Luckily, the boy was not hurt. However, there was a bus behind the car. It could not stop and hit the back of the car. Someone called the police and they arrived quickly.",
|
|
|
+ };
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ handleClose(done) {
|
|
|
+ this.close();
|
|
|
+ done();
|
|
|
+ },
|
|
|
+ close() {
|
|
|
+ this.$emit("update:talkPreviewDialog", false);
|
|
|
+ },
|
|
|
+ setVoiceJson(val) {
|
|
|
+ let a = JSON.parse(JSON.stringify(val));
|
|
|
+ for (var i = 0; i < a.allfType.length; i++) {
|
|
|
+ for (var j = 0; j < a.englishJson[a.allfType[i].id].length; j++) {
|
|
|
+ if (a.englishJson[a.allfType[i].id][j].id == a.topic) {
|
|
|
+ this.fName = a.allfType[i].name;
|
|
|
+ this.sName = a.englishJson[a.allfType[i].id][j].name;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.answerArray = a;
|
|
|
+ this.$forceUpdate();
|
|
|
+ },
|
|
|
+ formatDate(date) {
|
|
|
+ const year = date.getFullYear();
|
|
|
+ const month = (date.getMonth() + 1).toString().padStart(2, "0");
|
|
|
+ const day = date.getDate().toString().padStart(2, "0");
|
|
|
+ const hours = date.getHours().toString().padStart(2, "0");
|
|
|
+ const minutes = date.getMinutes().toString().padStart(2, "0");
|
|
|
+ const seconds = date.getSeconds().toString().padStart(2, "0");
|
|
|
+
|
|
|
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
|
+ },
|
|
|
+ restart() {
|
|
|
+ let _this = this;
|
|
|
+ _this
|
|
|
+ .$confirm("确定重新录音么?", "提示", {
|
|
|
+ confirmButtonText: "确定",
|
|
|
+ cancelButtonText: "取消",
|
|
|
+ type: "warning",
|
|
|
+ })
|
|
|
+ .then(() => {
|
|
|
+ _this.LuAudioUrl = "";
|
|
|
+ setTimeout(() => {
|
|
|
+ _this.startRecorder();
|
|
|
+ }, 500);
|
|
|
+ })
|
|
|
+ .catch(() => {});
|
|
|
+ },
|
|
|
+ // 开始录音
|
|
|
+ startRecorder() {
|
|
|
+ let _this = this;
|
|
|
+ if (!_this.isRecord) {
|
|
|
+ recorder.destroy(); // 销毁录音
|
|
|
+ _this.isRecord = true;
|
|
|
+ recorder.start().then(
|
|
|
+ () => {},
|
|
|
+ (error) => {
|
|
|
+ _this.isRecord = false;
|
|
|
+ // _this.$message.error(`${error.name} : ${error.message}`);
|
|
|
+ _this.$message.error(
|
|
|
+ `没有找到可使用的麦克风,或者您没有允许此网页使用麦克风`
|
|
|
+ );
|
|
|
+ // 出错了
|
|
|
+ console.log(`${error.name} : ${error.message}`);
|
|
|
+ if (_this.calcTimer) {
|
|
|
+ clearInterval(_this.calcTimer);
|
|
|
+ _this.calcTimer = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ );
|
|
|
+ } else {
|
|
|
+ if (_this.calcTimer) {
|
|
|
+ clearInterval(_this.calcTimer);
|
|
|
+ _this.calcTimer = null;
|
|
|
+ }
|
|
|
+ _this.isRecord = false;
|
|
|
+ recorder.stop(); // 结束录音
|
|
|
+ this.getMp3Data();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ getMp3Data() {
|
|
|
+ if (!recorder.fileSize) {
|
|
|
+ this.$message.error("请录音后在上传语音");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const mp3Blob = recorder.getWAVBlob();
|
|
|
+ // const mp3Blob = this.convertToMp3(recorder.getWAV());
|
|
|
+ let audioFile = this.dataURLtoAudio(mp3Blob, "wav");
|
|
|
+ console.log(audioFile);
|
|
|
+ let iiframe = this.$refs["iiframe"];
|
|
|
+
|
|
|
+ // this.isloading = true
|
|
|
+ // this.beforeUpload1(audioFile, 3);
|
|
|
+ // return;
|
|
|
+ // if (this.cjson.type == 'theme' || this.cjson.type == 'QA') {
|
|
|
+ // this.isloading = true
|
|
|
+ // let _this = this
|
|
|
+ // iiframe.contentWindow.onRecognizedResult = function (e) {
|
|
|
+ // console.log('onRecognizedResult', e);
|
|
|
+ // let privText = e.privText
|
|
|
+ // _this.beforeUpload1(audioFile, 3, privText);
|
|
|
+ // }
|
|
|
+
|
|
|
+ // iiframe.contentWindow.doContinuousPronunciationAssessment('', { files: [audioFile] })
|
|
|
+ // } else if (this.cjson.type == 'createRole') {
|
|
|
+ // // this.isloading = true
|
|
|
+ // // this.beforeUpload1(audioFile, 3);
|
|
|
+ // this.isloading = true
|
|
|
+ // let _this = this
|
|
|
+ // iiframe.contentWindow.onRecognizedResult = function (e) {
|
|
|
+ // console.log('onRecognizedResult', e);
|
|
|
+ // let privText = e.privText
|
|
|
+ // _this.beforeUpload1(audioFile, 3, privText);
|
|
|
+ // }
|
|
|
+
|
|
|
+ // iiframe.contentWindow.doContinuousPronunciationAssessment('', { files: [audioFile] })
|
|
|
+ // } else {
|
|
|
+ this.isloading = true;
|
|
|
+ let _this = this;
|
|
|
+ iiframe.contentWindow.onRecognizedResult = function (e) {
|
|
|
+ console.log("onRecognizedResult", e);
|
|
|
+ let privText = e.privText;
|
|
|
+ let star = JSON.parse(e.privJson).NBest[0].PronunciationAssessment;
|
|
|
+ console.log("star", star);
|
|
|
+ // e.privText
|
|
|
+ // JSON.parse(e.privJson).NBest[0].PronunciationAssessment
|
|
|
+
|
|
|
+ // _this.beforeUpload1(audioFile, 3, privText, star);
|
|
|
+ };
|
|
|
+ iiframe.contentWindow.doContinuousPronunciationAssessment("", {
|
|
|
+ files: [audioFile],
|
|
|
+ });
|
|
|
+ // }
|
|
|
+
|
|
|
+ // recorder.download(mp3Blob, "recorder", "mp3");
|
|
|
+ },
|
|
|
+ },
|
|
|
+ watch: {
|
|
|
+ talkPreviewDialog: {
|
|
|
+ handler: function (newVal, oldVal) {
|
|
|
+ if (newVal) {
|
|
|
+ this.setVoiceJson(this.checkJson);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ deep: true,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ created() {
|
|
|
+ this.currentTime = this.formatDate(new Date());
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ this.setVoiceJson(this.checkJson);
|
|
|
+ },
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.dialog_diy >>> .el-dialog {
|
|
|
+ height: 100%;
|
|
|
+ margin: 0vh auto !important;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog_diy >>> .el-dialog__header {
|
|
|
+ background: #454545 !important;
|
|
|
+ padding: 15px 20px;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog_diy >>> .el-dialog__body {
|
|
|
+ height: calc(100% - 124px);
|
|
|
+ box-sizing: border-box;
|
|
|
+ padding: 0px;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog_diy >>> .el-dialog__title {
|
|
|
+ color: #fff;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog_diy >>> .el-dialog__headerbtn {
|
|
|
+ top: 19px;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close {
|
|
|
+ color: #fff;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close:hover {
|
|
|
+ color: #fff;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog_diy >>> .el-dialog__body,
|
|
|
+.dialog_diy >>> .el-dialog__footer {
|
|
|
+ background: rgb(rgb(240, 242, 245));
|
|
|
+ overflow: hidden;
|
|
|
+}
|
|
|
+
|
|
|
+.o_content {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ flex-direction: column;
|
|
|
+ height: calc(100% - 210px);
|
|
|
+ overflow: hidden;
|
|
|
+}
|
|
|
+
|
|
|
+.d_box {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ padding: 25px 50px;
|
|
|
+ -webkit-box-sizing: border-box;
|
|
|
+ box-sizing: border-box;
|
|
|
+ overflow: auto;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog {
|
|
|
+ display: flex;
|
|
|
+ position: relative;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog + .dialog {
|
|
|
+ margin-top: 40px;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog_right {
|
|
|
+ flex-direction: row-reverse;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog > .d_img {
|
|
|
+ width: 40px;
|
|
|
+ height: 40px;
|
|
|
+ min-width: 40px;
|
|
|
+ overflow: hidden;
|
|
|
+ border-radius: 50%;
|
|
|
+ margin-right: 5px;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog > .d_img > img {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ object-fit: cover;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog_right > .d_img {
|
|
|
+ margin-right: 0;
|
|
|
+ margin-left: 5px;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog > .d_content,
|
|
|
+.dialog > .d_content_message {
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+.dialog > .d_content_message {
|
|
|
+ display: flex;
|
|
|
+ width: 300px;
|
|
|
+ background: #f6f9ff;
|
|
|
+ flex-direction: column;
|
|
|
+ flex-wrap: nowrap;
|
|
|
+ align-items: flex-start;
|
|
|
+ border-radius: 10px;
|
|
|
+ margin: 0 0 0 10px;
|
|
|
+ position: relative;
|
|
|
+}
|
|
|
+.dialog > .d_content_message > div {
|
|
|
+ padding: 5px;
|
|
|
+}
|
|
|
+.nowTime {
|
|
|
+ position: absolute;
|
|
|
+ bottom: -30px;
|
|
|
+ color: #9c9d9f;
|
|
|
+ font-size: 12px;
|
|
|
+}
|
|
|
+.dialog_right > .d_content,
|
|
|
+.dialog_right > .d_content_message {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: flex-end;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog > .d_content > .d_name,
|
|
|
+.dialog > .d_content_message > .d_name {
|
|
|
+ color: #7c7c7c;
|
|
|
+ font-size: 12px;
|
|
|
+ margin-bottom: 5px;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog_right > .d_content > .d_name,
|
|
|
+.dialog_right > .d_content_message > .d_name {
|
|
|
+ text-align: right;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog > .d_content > .d_log,
|
|
|
+.dialog > .d_content_message > .d_log {
|
|
|
+ color: #000;
|
|
|
+ font-size: 16px;
|
|
|
+ background: #fff;
|
|
|
+ width: 100%;
|
|
|
+ max-width: 800px;
|
|
|
+ border: 2px solid #e05d63;
|
|
|
+ border-radius: 40px;
|
|
|
+ line-height: 26px;
|
|
|
+ padding: 20px 35px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ position: relative;
|
|
|
+ margin: 10px 0 0 0;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog > .d_content > .d_log::before,
|
|
|
+.dialog > .d_content_message > .d_log::before {
|
|
|
+ content: "";
|
|
|
+ width: calc(100% - 20px);
|
|
|
+ height: calc(100% - 20px);
|
|
|
+ position: absolute;
|
|
|
+ border: 1px dashed #e05d63;
|
|
|
+ box-sizing: border-box;
|
|
|
+ top: 50%;
|
|
|
+ left: 50%;
|
|
|
+ border-radius: 30px;
|
|
|
+ transform: translate(-50%, -50%);
|
|
|
+}
|
|
|
+
|
|
|
+.dialog > .d_content > .d_log2,
|
|
|
+.dialog > .d_content_message > .d_log2 {
|
|
|
+ color: #000;
|
|
|
+ font-size: 14px;
|
|
|
+ background: #fff;
|
|
|
+ width: 100%;
|
|
|
+ max-width: 800px;
|
|
|
+ border: 1px dashed #0f94ce;
|
|
|
+ border-radius: 5px;
|
|
|
+ line-height: 26px;
|
|
|
+ padding: 10px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ position: relative;
|
|
|
+ margin-top: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog > .d_content > .d_voice,
|
|
|
+.dialog > .d_content_message > .d_voice {
|
|
|
+ width: 100%;
|
|
|
+ max-width: 600px;
|
|
|
+}
|
|
|
+
|
|
|
+.audio_class {
|
|
|
+ background: #3680fb !important;
|
|
|
+ margin: 0 !important;
|
|
|
+ width: 100% !important;
|
|
|
+ box-sizing: border-box !important;
|
|
|
+}
|
|
|
+
|
|
|
+.d_voice >>> .vueAudioBetter span:before {
|
|
|
+ color: #fff;
|
|
|
+}
|
|
|
+
|
|
|
+.audio_class >>> .slider .process {
|
|
|
+ background: #000;
|
|
|
+}
|
|
|
+
|
|
|
+.d_voice >>> .vueAudioBetter .iconfont:active {
|
|
|
+ position: unset !important;
|
|
|
+}
|
|
|
+
|
|
|
+.o_bottom {
|
|
|
+ height: 210px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+}
|
|
|
+
|
|
|
+.o_bottom .audio {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+}
|
|
|
+
|
|
|
+.o_bottom .audio > img {
|
|
|
+ width: 75px;
|
|
|
+ height: 75px;
|
|
|
+ cursor: pointer;
|
|
|
+}
|
|
|
+
|
|
|
+.o_bottom .audio_word {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ color: #00000099;
|
|
|
+ font-size: 16px;
|
|
|
+ margin: 10px 0 8px;
|
|
|
+}
|
|
|
+
|
|
|
+.audio_b {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ margin-bottom: 15px;
|
|
|
+}
|
|
|
+
|
|
|
+.audio_rerecord {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ margin-bottom: 15px;
|
|
|
+}
|
|
|
+
|
|
|
+.audio_rerecord > span {
|
|
|
+ display: flex;
|
|
|
+ border: 1px solid #3981fa;
|
|
|
+ align-items: center;
|
|
|
+ color: #3981fa;
|
|
|
+ padding: 5px 10px;
|
|
|
+ border-radius: 5px;
|
|
|
+ cursor: pointer;
|
|
|
+}
|
|
|
+
|
|
|
+.audio_rerecord > span::before {
|
|
|
+ content: "";
|
|
|
+ width: 15px;
|
|
|
+ height: 15px;
|
|
|
+ background: url("../../../../assets/icon/englishVoice/restart.png");
|
|
|
+ display: block;
|
|
|
+ background-size: 100% 100%;
|
|
|
+ margin-right: 5px;
|
|
|
+}
|
|
|
+
|
|
|
+.audio_class {
|
|
|
+ background: #3680fb !important;
|
|
|
+ margin: 0 !important;
|
|
|
+}
|
|
|
+
|
|
|
+.audio_b >>> .vueAudioBetter span:before {
|
|
|
+ color: #fff;
|
|
|
+}
|
|
|
+
|
|
|
+.audio_class >>> .slider .process {
|
|
|
+ background: #000;
|
|
|
+}
|
|
|
+
|
|
|
+.audio_b >>> .vueAudioBetter .iconfont:active {
|
|
|
+ position: unset !important;
|
|
|
+}
|
|
|
+
|
|
|
+.audio_ing {
|
|
|
+ color: #ee3e3e;
|
|
|
+ margin-top: 25px;
|
|
|
+ font-size: 12px;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+}
|
|
|
+
|
|
|
+.gotoTalk {
|
|
|
+ margin: 0 5px 10px 5px;
|
|
|
+ background: #3681fc;
|
|
|
+ color: #fff;
|
|
|
+ text-align: center;
|
|
|
+ width: calc(100% - 20px);
|
|
|
+ height: 30px;
|
|
|
+ line-height: 30px;
|
|
|
+ padding: 0 !important;
|
|
|
+ border-radius: 5px;
|
|
|
+ cursor: pointer;
|
|
|
+}
|
|
|
+
|
|
|
+.checkFooter {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: row;
|
|
|
+ flex-wrap: nowrap;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: flex-end;
|
|
|
+}
|
|
|
+.checkFooter > div {
|
|
|
+ min-width: 100px;
|
|
|
+ width: 100px;
|
|
|
+ text-align: center;
|
|
|
+ border-radius: 5px;
|
|
|
+ background: #ffffff;
|
|
|
+ color: #3681fc;
|
|
|
+ border: 1px solid #3681fc;
|
|
|
+ height: 35px;
|
|
|
+ line-height: 35px;
|
|
|
+ margin-right: 10px;
|
|
|
+ font-size: 12px;
|
|
|
+ cursor: pointer;
|
|
|
+}
|
|
|
+
|
|
|
+.reportButton {
|
|
|
+ position: absolute;
|
|
|
+ bottom: -35px;
|
|
|
+ right: 50px;
|
|
|
+ background: #16c267;
|
|
|
+ color: #fff;
|
|
|
+ width: 70px;
|
|
|
+ height: 25px;
|
|
|
+ text-align: center;
|
|
|
+ line-height: 25px;
|
|
|
+ cursor: pointer;
|
|
|
+ border-radius: 5px;
|
|
|
+}
|
|
|
+</style>
|