mirror of
https://github.com/ikechan8370/chatgpt-plugin.git
synced 2025-12-16 13:27:08 +00:00
Merge branch 'v2' of github.com:ikechan8370/chatgpt-plugin into v2
This commit is contained in:
commit
24f1b6d9d0
7 changed files with 107 additions and 9 deletions
|
|
@ -10,6 +10,9 @@
|
|||
* API3模式下,绕过Cloudflare防护直接访问ChatGPT的SSE API,与官方体验一致,且保留对话记录,在官网可查。免费。
|
||||
* (Deprecated)提供基于浏览器的解决方案作为备选,API3不可用的情况下或担心账户安全的用户可以选择使用浏览器模式。
|
||||
* 支持新[必应](https://www.bing.com/new)(Beta)
|
||||
* 2023-03-15 API3支持GPT-4尝鲜,需要Plus用户
|
||||
|
||||
### 如果觉得这个插件有趣或者对你有帮助,请点一个star吧!
|
||||
|
||||
## 版本要求
|
||||
Node.js >= 18 / Node.js >= 14(with node-fetch)
|
||||
|
|
@ -250,6 +253,9 @@ pnpm i
|
|||
5. vit API能本地搭建吗?
|
||||
|
||||
能。克隆下来安装依赖直接运行即可。
|
||||
## 交流群
|
||||
|
||||
* QQ 559567232
|
||||
|
||||
## 感谢
|
||||
|
||||
|
|
|
|||
|
|
@ -619,7 +619,7 @@ export class chatgpt extends plugin {
|
|||
}
|
||||
if (useTTS) {
|
||||
if (Config.ttsSpace && response.length <= 299) {
|
||||
let wav = await generateAudio(response, speaker, '中文')
|
||||
let wav = await generateAudio(response, speaker, '中日混合(中文用[ZH][ZH]包裹起来,日文用[JA][JA]包裹起来)')
|
||||
await e.reply(segment.record(wav))
|
||||
if (Config.alsoSendText) {
|
||||
await this.reply(`${response}`, e.isGroup)
|
||||
|
|
|
|||
|
|
@ -313,6 +313,12 @@ export function supportGuoba () {
|
|||
bottomHelpMessage: '即使配置了proxy,依然使用ChatGPT反代',
|
||||
component: 'Switch'
|
||||
},
|
||||
{
|
||||
field: 'useGPT4',
|
||||
label: '使用GPT-4',
|
||||
bottomHelpMessage: '使用GPT-4,注意试用配额较低,如果用不了就关掉',
|
||||
component: 'Switch'
|
||||
},
|
||||
{
|
||||
label: '以下为浏览器方式的配置.(Deprecated)',
|
||||
component: 'Divider'
|
||||
|
|
|
|||
|
|
@ -375,10 +375,93 @@ export async function isCN () {
|
|||
}
|
||||
}
|
||||
|
||||
export function limitString(str, maxLength) {
|
||||
export function limitString (str, maxLength) {
|
||||
if (str.length <= maxLength) {
|
||||
return str;
|
||||
return str
|
||||
} else {
|
||||
return str.slice(0, maxLength) + '...';
|
||||
return str.slice(0, maxLength) + '...'
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ```
|
||||
* var text = '你好,こんにちは,Hello!';
|
||||
* var wrappedText = wrapTextByLanguage(text);
|
||||
* console.log(wrappedText);
|
||||
* ```
|
||||
* @param text
|
||||
* @returns {string}
|
||||
*/
|
||||
export function wrapTextByLanguage (text) {
|
||||
// 根据标点符号分割句子
|
||||
const symbols = /([。!?,])/
|
||||
let sentences = text.split(symbols)
|
||||
sentences = sentences.reduce((acc, cur, index) => {
|
||||
if (symbols.test(cur)) {
|
||||
// 如果当前字符串是标点符号,则将其添加到前一个字符串的末尾
|
||||
acc[acc.length - 1] += cur
|
||||
} else {
|
||||
// 否则,将当前字符串添加到结果数组中
|
||||
acc.push(cur)
|
||||
}
|
||||
|
||||
return acc
|
||||
}, [])
|
||||
let wrappedSentences = []
|
||||
for (let i = 0; i < sentences.length; i++) {
|
||||
let sentence = sentences[i]
|
||||
|
||||
// 如果是标点符号,则跳过
|
||||
if (sentence === '。' || sentence === '!' || sentence === '?' || sentence === ',') {
|
||||
continue
|
||||
}
|
||||
const pattern = /[a-zA-Z]/g
|
||||
sentence = sentence.replace(pattern, '')
|
||||
// 判断这一句话是中文还是日语
|
||||
let isChinese = true
|
||||
let isJapanese = false
|
||||
for (let j = 0; j < sentence.length; j++) {
|
||||
let char = sentence.charAt(j)
|
||||
if (char.match(/[\u3040-\u309F\u30A0-\u30FF]/)) {
|
||||
isJapanese = true
|
||||
isChinese = false
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// 包裹句子
|
||||
if (isChinese) {
|
||||
sentence = `[ZH]${sentence}[ZH]`
|
||||
} else if (isJapanese) {
|
||||
sentence = `[JA]${sentence}[JA]`
|
||||
}
|
||||
|
||||
wrappedSentences.push(sentence)
|
||||
}
|
||||
|
||||
const mergedSentences = wrappedSentences.reduce((acc, cur) => {
|
||||
if (cur === '') {
|
||||
// 如果当前字符串为空或者是标点符号,则直接将其添加到结果数组中
|
||||
acc.push(cur)
|
||||
} else {
|
||||
// 否则,判断前一个字符串和当前字符串是否为同种语言
|
||||
const prev = acc[acc.length - 1]
|
||||
let curPrefix = `${cur.slice(0, 4)}`
|
||||
if (prev && prev.startsWith(curPrefix)) {
|
||||
// 如果前一个字符串和当前字符串为同种语言,则将它们合并
|
||||
let a = (acc[acc.length - 1] + cur)
|
||||
a = lodash.replace(a, curPrefix + curPrefix, '')
|
||||
acc[acc.length - 1] = a
|
||||
} else {
|
||||
// 否则,将当前字符串添加到结果数组中
|
||||
acc.push(cur)
|
||||
}
|
||||
}
|
||||
|
||||
return acc
|
||||
}, [])
|
||||
|
||||
return mergedSentences.join('')
|
||||
}
|
||||
|
||||
// console.log(wrapTextByLanguage('你好,这里是哈哈,こんにちは,Hello!'))
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ const defaultConfig = {
|
|||
apiBaseUrl: 'https://pimon.d201.cn/backend-api',
|
||||
apiForceUseReverse: false,
|
||||
plus: false,
|
||||
useGPT4: false,
|
||||
promptPrefixOverride: 'Your answer shouldn\'t be too verbose. Prefer to answer in Chinese.',
|
||||
assistantLabel: 'ChatGPT',
|
||||
thinkingTips: true,
|
||||
|
|
@ -60,7 +61,7 @@ const defaultConfig = {
|
|||
initiativeChatGroups: [],
|
||||
enableDraw: true,
|
||||
helloPrompt: '写一段话让大家来找我聊天。类似于“有人找我聊天吗?"这种风格,轻松随意一点控制在20个字以内',
|
||||
version: 'v2.1.7'
|
||||
version: 'v2.1.8'
|
||||
}
|
||||
const _path = process.cwd()
|
||||
let config = {}
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ export class OfficialChatGPTClient {
|
|||
}
|
||||
}
|
||||
],
|
||||
model: Config.plus ? 'text-davinci-002-render-sha' : 'text-davinci-002-render-sha',
|
||||
model: Config.useGPT4 ? 'gpt-4' : 'text-davinci-002-render-sha',
|
||||
parent_message_id: parentMessageId
|
||||
}
|
||||
if (conversationId) {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import { Config } from './config.js'
|
||||
import fetch from 'node-fetch'
|
||||
import _ from 'lodash'
|
||||
import {wrapTextByLanguage} from "./common.js";
|
||||
let proxy
|
||||
if (Config.proxy) {
|
||||
try {
|
||||
|
|
@ -35,11 +36,12 @@ function randomNum (minNum, maxNum) {
|
|||
return 0
|
||||
}
|
||||
}
|
||||
export async function generateAudio (text, speaker = '随机', language = '中文', noiseScale = Config.noiseScale, noiseScaleW = Config.noiseScaleW, lengthScale = Config.lengthScale) {
|
||||
export async function generateAudio (text, speaker = '随机', language = '中日混合(中文用[ZH][ZH]包裹起来,日文用[JA][JA]包裹起来)', noiseScale = Config.noiseScale, noiseScaleW = Config.noiseScaleW, lengthScale = Config.lengthScale) {
|
||||
if (!speaker || speaker === '随机') {
|
||||
logger.info('随机角色!这次哪个角色这么幸运会被选到呢……')
|
||||
speaker = speakers[randomNum(0, speakers.length)]
|
||||
}
|
||||
text = wrapTextByLanguage(text)
|
||||
logger.info(`正在使用${speaker},基于文本:'${text}'生成语音`)
|
||||
let body = {
|
||||
data: [
|
||||
|
|
@ -48,8 +50,8 @@ export async function generateAudio (text, speaker = '随机', language = '中
|
|||
]
|
||||
}
|
||||
let space = Config.ttsSpace
|
||||
if (space.endsWith('api/generate')) {
|
||||
let trimmedSpace = _.trimEnd(space, '/api/generate')
|
||||
if (space.endsWith('/api/generate')) {
|
||||
let trimmedSpace = space.substring(0, space.length - 13)
|
||||
logger.warn(`vits api 当前为${space},已校正为${trimmedSpace}`)
|
||||
space = trimmedSpace
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue