chat-with-chatgpt icon indicating copy to clipboard operation
chat-with-chatgpt copied to clipboard

代码翻译

Open zhuangdx opened this issue 1 year ago • 5 comments

请用中文注释代码

"use strict"

require('log-timestamp')(`${process.pid}`)
const fs = require("fs")
const Nls = require("alibabacloud-nls")
const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs))
const util = require("util")
const readline = require("readline")
const args = process.argv.slice(2)
//const Memwatch = require("node-memwatch-new")

const URL = "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1"
const APPKEY = "Your Appkey"      //获取Appkey请前往控制台:https://nls-portal.console.aliyun.com/applist
const TOKEN = "Your Token"      //获取Token具体操作,请参见:https://help.aliyun.com/document_detail/450514.html

let b1 = []
let loadIndex = 0
//let hd = new Memwatch.HeapDiff()
let needDump = true

async function runOnce(line) {
  console.log(`speak: ${line}`)
  loadIndex++

  //let dumpFile = fs.createWriteStream(`${process.pid}.wav`, {flags:"w"})
  let tts = new Nls.SpeechSynthesizer({
    url: URL,
    appkey:APPKEY,
    token:TOKEN
  })

  tts.on("meta", (msg)=>{
    console.log("Client recv metainfo:", msg)
  })

  tts.on("data", (msg)=>{
    console.log(`recv size: ${msg.length}`)
    //console.log(dumpFile.write(msg, "binary"))
  })

  tts.on("completed", (msg)=>{
    console.log("Client recv completed:", msg)
  })

  tts.on("closed", () => {
    console.log("Client recv closed")
  })

  tts.on("failed", (msg)=>{
    console.log("Client recv failed:", msg)
  })

  let param = tts.defaultStartParams()
  param.text = line
  param.voice = "aixia"
  try {
    await tts.start(param, true, 6000)
  } catch(error) {
    console.log("error on start:", error)
    return
  } finally {
    //dumpFile.end()
  }
  console.log("synthesis done")
  await sleep(2000)
}

async function test() {
  console.log("load test case:", args[0])
  const fileStream = fs.createReadStream(args[0])
  const rl = readline.createInterface({
    input: fileStream,
    crlfDelay: Infinity
  })

  for await (const line of rl) {
    b1.push(line)
  }

  while (true) {
    for (let text of b1) {
      await runOnce(text)
    }
  }
}

test()

zhuangdx avatar Oct 30 '23 07:10 zhuangdx

"use strict"

// 使用严格模式

require('log-timestamp')(`${process.pid}`)
const fs = require("fs")
const Nls = require("alibabacloud-nls")
const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs))
const util = require("util")
const readline = require("readline")
const args = process.argv.slice(2)
//const Memwatch = require("node-memwatch-new")

// 引入所需模块

const URL = "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1"
const APPKEY = "Your Appkey"      //获取Appkey请前往控制台:https://nls-portal.console.aliyun.com/applist
const TOKEN = "Your Token"      //获取Token具体操作,请参见:https://help.aliyun.com/document_detail/450514.html

// 设置URL, APPKEY和TOKEN

let b1 = []
let loadIndex = 0
//let hd = new Memwatch.HeapDiff()
let needDump = true

// 声明变量

async function runOnce(line) {
  console.log(`speak: ${line}`)
  loadIndex++

  //let dumpFile = fs.createWriteStream(`${process.pid}.wav`, {flags:"w"})
  let tts = new Nls.SpeechSynthesizer({
    url: URL,
    appkey:APPKEY,
    token:TOKEN
  })

  tts.on("meta", (msg)=>{
    console.log("Client recv metainfo:", msg)
  })

  tts.on("data", (msg)=>{
    console.log(`recv size: ${msg.length}`)
    //console.log(dumpFile.write(msg, "binary"))
  })

  tts.on("completed", (msg)=>{
    console.log("Client recv completed:", msg)
  })

  tts.on("closed", () => {
    console.log("Client recv closed")
  })

  tts.on("failed", (msg)=>{
    console.log("Client recv failed:", msg)
  })

  let param = tts.defaultStartParams()
  param.text = line
  param.voice = "aixia"
  
  // 创建Nls.SpeechSynthesizer对象,监听相关事件,设置参数
  
  try {
    await tts.start(param, true, 6000)
  } catch(error) {
    console.log("error on start:", error)
    return
  } finally {
    //dumpFile.end()
  }
  console.log("synthesis done")
  await sleep(2000)
}

async function test() {
  console.log("load test case:", args[0])
  const fileStream = fs.createReadStream(args[0])
  const rl = readline.createInterface({
    input: fileStream,
    crlfDelay: Infinity
  })

  for await (const line of rl) {
    b1.push(line)
  }

  while (true) {
    for (let text of b1) {
      await runOnce(text)
    }
  }
}

test()

这段代码是使用Node.js编写的语音合成程序。具体功能为从文件中读取文本,进行语音合成,并将合成结果打印到控制台。代码中使用阿里云的"Nls.SpeechSynthesizer"类进行语音合成,监听其相关事件,设置参数,并通过调用.start()方法来启动合成过程。代码中还包含一些辅助函数和变量声明。

alabulei1 avatar Oct 30 '23 07:10 alabulei1

继续优化代码

iszmxw avatar Apr 22 '24 09:04 iszmxw

"use strict";

const fs = require("fs");
const Nls = require("alibabacloud-nls");
const readline = require("readline");

const URL = "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1";
const APPKEY = "Your Appkey"; // 请前往控制台获取Appkey:https://nls-portal.console.aliyun.com/applist
const TOKEN = "Your Token"; // 获取Token具体操作,请参见:https://help.aliyun.com/document_detail/450514.html

const args = process.argv.slice(2);
const b1 = [];

async function runOnce(line) {
  console.log(`speak: ${line}`);

  const tts = new Nls.SpeechSynthesizer({
    url: URL,
    appkey: APPKEY,
    token: TOKEN
  });

  tts.on("meta", (msg) => {
    console.log("Client received metainfo:", msg);
  });

  tts.on("data", (msg) => {
    console.log(`Received data size: ${msg.length}`);
  });

  tts.on("completed", (msg) => {
    console.log("Client received completed:", msg);
  });

  tts.on("closed", () => {
    console.log("Client connection closed");
  });

  tts.on("failed", (msg) => {
    console.log("Client connection failed:", msg);
  });

  const param = tts.defaultStartParams();
  param.text = line;
  param.voice = "aixia";

  try {
    await tts.start(param, true, 6000);
  } catch (error) {
    console.log("Error on start:", error);
  }
  console.log("Synthesis done");
  await new Promise(resolve => setTimeout(resolve, 2000));
}

async function loadFile() {
  console.log("Loading test case:", args[0]);
  const fileStream = fs.createReadStream(args[0]);
  const rl = readline.createInterface({
    input: fileStream,
    crlfDelay: Infinity
  });

  for await (const line of rl) {
    b1.push(line);
  }
}

async function startSpeechSynthesis() {
  await loadFile();

  while (true) {
    for (let text of b1) {
      await runOnce(text);
    }
  }
}

startSpeechSynthesis();

在这次优化中,主要进行了代码结构的调整和简化,以提高代码的可读性和易维护性。将一些功能相对独立的部分拆分成单独的函数,如加载文件内容和语音合成操作,使代码逻辑更清晰。同时对某些注释进行了简化和修正,进一步提高了代码质量。

alabulei1 avatar Apr 22 '24 09:04 alabulei1

这段代码做了什么

iszmxw avatar Apr 22 '24 09:04 iszmxw

这段代码是一个Node.js程序,主要实现了以下功能:

  1. 从命令行参数中获取文件路径,读取该文件内容作为语音合成的文本;
  2. 使用阿里云的语音合成服务Nls.SpeechSynthesizer进行语音合成;
  3. 将合成的语音内容输出到控制台,并显示相关信息;
  4. 实现了异步操作,包括读取文件内容、语音合成过程;
  5. 代码结构更清晰,将不同功能模块拆分成单独的函数,并通过异步函数和Promise来处理操作流程;
  6. 通过事件监听来处理语音合成过程中的元信息、数据接收、完成和失败等情况。

总的来说,这段代码实现了从文件内容到语音合成输出的全流程,并通过优化和简化提高了代码的可读性和维护性。

alabulei1 avatar Apr 22 '24 09:04 alabulei1