feat: 添加Azure语音支持

This commit is contained in:
ikechan8370 2023-04-22 22:54:03 +08:00
parent 20f6cd5390
commit cf992bbc2c
6 changed files with 396 additions and 36 deletions

View file

@ -29,7 +29,7 @@ try {
}
_puppeteer = new Puppeteer(puppeteerCfg)
} catch (e) {
logger.warn('未能加载puppeteer尝试降级到Yunzai的puppeteer尝试')
logger.debug('未能加载puppeteer尝试降级到Yunzai的puppeteer尝试')
_puppeteer = puppeteer
}

View file

@ -104,6 +104,10 @@ const defaultConfig = {
slackClaudeSpecifiedChannel: '',
cloudTranscode: 'https://silk.201666.xyz',
cloudMode: 'url',
ttsMode: 'vits-uma-genshin-honkai', // or azure
azureTTSKey: '',
azureTTSRegion: '',
azureTTSSpeaker: 'zh-CN-XiaochenNeural',
version: 'v2.5.7'
}
const _path = process.cwd()

View file

@ -0,0 +1,246 @@
import crypto from 'crypto'
import { mkdirs } from '../common.js'
import { Config } from '../config.js'
let sdk
try {
sdk = (await import('microsoft-cognitiveservices-speech-sdk')).default
} catch (err) {
logger.warn('未安装microsoft-cognitiveservices-speech-sdk无法使用微软Azure语音源')
}
async function generateAudio (text, option = {}) {
if (!sdk) {
throw new Error('未安装microsoft-cognitiveservices-speech-sdk无法使用微软Azure语音源')
}
let subscriptionKey = Config.azureTTSKey
let serviceRegion = Config.azureTTSRegion
const _path = process.cwd()
mkdirs(`${_path}/data/chatgpt/tts/azure`)
let filename = `${_path}/data/chatgpt/tts/azure/${crypto.randomUUID()}.wav`
let audioConfig = sdk.AudioConfig.fromAudioFileOutput(filename)
let speechConfig = sdk.SpeechConfig.fromSubscription(subscriptionKey, serviceRegion)
// speechConfig.speechSynthesisLanguage = option?.language || 'zh-CN'
logger.info('using speaker: ' + option?.speaker || 'zh-CN-YunyeNeural')
speechConfig.speechSynthesisVoiceName = option?.speaker || 'zh-CN-YunyeNeural'
let synthesizer = new sdk.SpeechSynthesizer(speechConfig, audioConfig)
return new Promise((resolve, reject) => {
synthesizer.speakTextAsync(text, result => {
if (result.reason === sdk.ResultReason.SynthesizingAudioCompleted) {
console.log('synthesis finished.')
} else {
console.error('Speech synthesis canceled, ' + result.errorDetails +
'\nDid you update the subscription info?')
}
synthesizer.close()
synthesizer = undefined
resolve(filename)
}, err => {
console.error('err - ' + err)
synthesizer.close()
synthesizer = undefined
reject(err)
})
})
}
const supportConfigurations = [
{
code: 'zh-CN-liaoning-XiaobeiNeural',
name: '晓北',
language: 'zh-CN',
languageDetail: '中文(东北官话,简体)',
gender: '女'
},
{
code: 'zh-CN-henan-YundengNeural',
name: '云登',
language: 'zh-CN',
languageDetail: '中文(中原官话河南,简体)',
gender: '男'
},
{
code: 'zh-CN-shaanxi-XiaoniNeural',
name: '晓妮',
language: 'zh-CN',
languageDetail: '中文(中原官话陕西,简体)',
gender: '女'
},
{
code: 'zh-CN-henan-YundengNeural',
name: '云翔',
language: 'zh-CN',
languageDetail: '中文(冀鲁官话,简体)',
gender: '男'
},
{
code: 'zh-CN-XiaoxiaoNeural',
name: '晓晓',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '女'
},
{
code: 'zh-CN-YunxiNeural',
name: '云希',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '男'
},
{
code: 'zh-CN-YunyangNeural',
name: '云扬',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '男'
},
{
code: 'zh-CN-YunyeNeural',
name: '云野',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '男'
},
{
code: 'zh-CN-XiaoshuangNeural',
name: '晓双',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '女'
},
{
code: 'zh-CN-XiaoyouNeural',
name: '晓悠',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '女'
},
{
code: 'zh-CN-XiaoqiuNeural',
name: '晓秋',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '女'
},
{
code: 'zh-CN-XiaochenNeural',
name: '晓辰',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '女'
},
{
code: 'zh-CN-XiaoyanNeural',
name: '晓颜',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '女'
},
{
code: 'zh-CN-XiaomoNeural',
name: '晓墨',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '女'
},
{
code: 'zh-CN-XiaoxuanNeural',
name: '晓萱',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '女'
},
{
code: 'zh-CN-XiaohanNeural',
name: '晓涵',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '女'
},
{
code: 'zh-CN-XiaoruiNeural',
name: '晓睿',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '女'
},
{
code: 'zh-CN-XiaomengNeural',
name: '晓梦',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '女'
},
{
code: 'zh-CN-XiaoyiNeural',
name: '晓伊',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '女'
},
{
code: 'zh-CN-XiaozhenNeural',
name: '晓甄',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '女'
},
{
code: 'zh-CN-YunfengNeural',
name: '云枫',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '男'
},
{
code: 'zh-CN-YunhaoNeural',
name: '云皓',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '男'
},
{
code: 'zh-CN-YunjianNeural',
name: '云健',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '男'
},
{
code: 'zh-CN-YunxiaNeural',
name: '云夏',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '男'
},
{
code: 'zh-CN-YunzeNeural',
name: '云泽',
language: 'zh-CN',
languageDetail: '中文(普通话,简体)',
gender: '男'
},
{
code: 'zh-HK-HiuGaaiNeural',
name: '曉佳',
language: 'zh-CN',
languageDetail: '中文(粤语,繁体)',
gender: '女'
},
{
code: 'zh-HK-HiuMaanNeural',
name: '曉曼',
language: 'zh-CN',
languageDetail: '中文(粤语,繁体)',
gender: '女'
},
{
code: 'zh-HK-WanLungNeural',
name: '雲龍',
language: 'zh-CN',
languageDetail: '中文(粤语,繁体)',
gender: '男'
}
]
export default { generateAudio, supportConfigurations }