Merge branch 'v2' of github.com:ikechan8370/chatgpt-plugin into v2

This commit is contained in:
ikechan8370 2023-03-16 17:49:05 +08:00
commit 24f1b6d9d0
7 changed files with 107 additions and 9 deletions

View file

@ -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
## 感谢

View file

@ -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)

View file

@ -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'

View file

@ -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'))

View file

@ -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 = {}

View file

@ -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) {

View file

@ -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
}