在快节奏的现代生活中,听写技能仍然是学习语言和提升认知能力的重要环节。然而,传统的听写练习往往枯燥乏味,且效率不高。现在,随着人工智能技术的发展,大模型听写工具的问世,为传统听写带来了革命性的变革。
大模型听写利用先进的语音识别技术,能够实时准确地将口语转换为文字,不仅提高了听写的准确率,还极大地提升了效率。与传统听写相比,大模型听写具有以下显著优势:
-
高效率:传统听写需要手动记录每一个单词,而大模型听写可以自动完成这一过程,节省了大量时间。
-
高准确性:人工智能算法能够准确识别不同的口音和语速,减少了人为错误。
-
个性化学习:大模型听写可以根据用户的学习进度和需求,提供个性化的听写材料和反馈。
-
互动性强:许多大模型听写工具配备了互动功能,如语音评估、即时反馈等,使学习过程更加生动有趣。
-
随时随地学习:只需一部智能手机或电脑,就可以随时随地进行听写练习,突破了时间和空间的限制。
-
数据追踪与分析:大模型听写工具可以记录用户的学习数据,帮助用户了解自己的学习进度和薄弱环节,从而更有针对性地进行复习。
-
多语言支持:对于多语言学习者来说,大模型听写支持多种语言的听写练习,是提升外语听力和写作能力的理想选择。
-
环境友好:数字化的听写练习减少了纸张的使用,更加环保。
-
易于分享与合作:用户可以将自己的听写结果轻松分享给他人,或者与他人在线合作完成听写任务。
-
持续更新与优化:随着技术的不断进步,大模型听写工具会持续更新和优化,为用户提供更好的学习体验。
总之,大模型听写以其高效、准确、便捷的特点,正在逐渐取代传统听写,成为现代人提升语言能力和认知水平的新选择。无论你是学生、教师还是终身学习者,都可以从大模型听写中受益,让学习变得更加轻松愉快。
<template><div class="Mult-container" style="padding: 10px;margin-bottom:50px; "><!--聊天窗口开始 --><div style="height: 150px;"><textarea v-model="text"style="height: 460px;width: 100%;padding: 20px; border: none;border-top: 1px solid #ccc;border-bottom: 1px solid #ccc;outline: none"></textarea></div><div style="text-align: left;padding-right: 10px;margin-top: 340px;"><el-button type="primary" size="medium" @click="voiceSend"><i class="el-icon-microphone"></i>多语转文字</el-button><el-button type="danger" size="medium" @click="stopVoice">停止朗读</el-button></div></div>
</template><script>// 初始化录音工具,注意目录
let recorder = new Recorder("../../recorder")
recorder.onStart = () => {console.log("开始录音了")
}
recorder.onStop = () => {console.log("结束录音了")
}
// 发送中间帧和最后一帧
recorder.onFrameRecorded = ({isLastFrame, frameBuffer}) => {if (!isLastFrame && wsFlag) { // 发送中间帧const params = {"header": {"status": 1,"app_id": ""},"payload": {"audio": {"audio": toBase64(frameBuffer),"sample_rate": 16000,"encoding": "raw"}}}wsTask.send(JSON.stringify(params)) // 执行发送} else {if (wsFlag) {const params = {"header": {"status": 2,"app_id": ""},"payload": {"audio": {"audio": "","sample_rate": 16000,"encoding": "raw"}}}console.log("发送最后一帧", params, wsFlag)wsTask.send(JSON.stringify(params)) // 执行发送}}
}function toBase64(buffer) {let binary = "";let bytes = new Uint8Array(buffer);let len = bytes.byteLength;for (let i = 0; i < len; i++) {binary += String.fromCharCode(bytes[i]);}return window.btoa(binary);
};let wsFlag = false;
let wsTask = {};
export default {name: "Mult",data() {return {user: localStorage.getItem("user") ? JSON.parse(localStorage.getItem("user")) : {}, // 获取本地存储用户text: "",URL: 'wss://iat.cn-huabei-1.xf-yun.com/v1', // 听写地址resultText: "",resultTextTemp: "",}},methods: {async stopVoice() {if (await this.consumeBalance(this.user, "停止朗读")) {// 执行具体能力recorder.stop();this.$message.success("录音朗读停止!")}},async voiceSend() { // 开始语音识别要做的动作if (await this.consumeBalance(this.user, "多语转文字")) {// 执行具体能力this.resultText = "";this.resultTextTemp = "";await this.wsInit();}},
// 建立ws连接async wsInit() {// this.iat = "";this.$message.success("请您说出语音内容~")let _this = this;if (typeof (WebSocket) == 'undefined') {console.log('您的浏览器不支持ws...')} else {console.log('您的浏览器支持ws!!!')let reqeustUrl = await _this.getWebSocketUrl()wsTask = new WebSocket(reqeustUrl);// ws的几个事件,在vue中定义wsTask.onopen = function () {console.log('ws已经打开...')wsFlag = truelet params = {"header": {"status": 0,"app_id": atob(_this.user.appid),},"parameter": {"iat": {"domain": "slm","language": "mul_cn","accent": "mandarin","result": {"encoding": "utf8","compress": "raw","format": "json"}}},"payload": {"audio": {"audio": "","sample_rate": 16000,"encoding": "raw"}}}console.log("发送第一帧数据...")wsTask.send(JSON.stringify(params)) // 执行发送// 下面就可以循环发送中间帧了// 开始录音console.log("开始录音")recorder.start({sampleRate: 16000,frameSize: 1280,});}wsTask.onmessage = function (message) { // 调用第二个API 自动把语音转成文本console.log('收到数据===' + JSON.stringify(message.data))let parsedMessage = JSON.parse(message.data);let code = parsedMessage.header.code;let status = parsedMessage.header.status;if (code !== 0) {console.log(`请求错误:${code}`);recorder.stop();wsTask.close();wsFlag = false} else {let payload = parsedMessage.payload;if (payload) {let text = payload.result.text;let decodedString = atob(text);let bytes = new Uint8Array(decodedString.length);for (let i = 0; i < decodedString.length; i++) {bytes[i] = decodedString.charCodeAt(i);}let decoder = new TextDecoder('utf-8');let utf8String = decoder.decode(bytes);console.log(utf8String)let utf8JsonObject = JSON.parse(utf8String)let textWs = utf8JsonObject.ws;textWs.forEach(i => {i.cw.forEach(j => {_this.resultTextTemp = j.w;_this.resultText += _this.resultTextTemp;});});console.log(_this.resultText);_this.text = _this.resultText || "";}if (status === 2) {recorder.stop();wsTask.close();wsFlag = false}}}// 关闭事件wsTask.onclose = function () {console.log('ws已关闭...')}wsTask.onerror = function () {console.log('发生错误...')}}},
// 获取鉴权地址与参数getWebSocketUrl() {return new Promise((resolve, reject) => {// 请求地址根据语种不同变化var url = this.URL;var host = this.URL.host;var apiKeyName = "api_key";var date = new Date().toGMTString();var algorithm = "hmac-sha256";var headers = "host date request-line";var signatureOrigin = `host: ${host}\ndate: ${date}\nGET /v1 HTTP/1.1`;var signatureSha = CryptoJS.HmacSHA256(signatureOrigin, atob(this.user.apisecret));var signature = CryptoJS.enc.Base64.stringify(signatureSha);var authorizationOrigin =`${apiKeyName}="${atob(this.user.apikey)}", algorithm="${algorithm}", headers="${headers}", signature="${signature}"`;var authorization = base64.encode(authorizationOrigin);url = `${url}?authorization=${authorization}&date=${encodeURI(date)}&host=${host}`;console.log(url)resolve(url); // 主要是返回地址});}}
}
</script><!--scoped 不能加-->
<style>
</style>