Skip to content

Commit 5ea794e

Browse files
authored
Merge pull request #701 from nature-heart-software/feat/add-engines-options
Add more engines options
2 parents 2fd6494 + 6a327b5 commit 5ea794e

File tree

6 files changed

+186
-75
lines changed

6 files changed

+186
-75
lines changed

apps/app/src/plugins/speech-engines/google-cloud/NvSettings.vue

Lines changed: 88 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,110 @@
11
<template>
22
<NvAccessBlocker
3-
:allowed="
3+
:allowed="
44
(speechStore.hasUniversalApiCredentials && !getProperty('useLocalCredentials')) ||
55
!!getProperty('apiKey', true)
66
"
7-
reason="Credentials required"
7+
reason="Credentials required"
88
>
9-
<NvFormItem label="Voice">
10-
<NvVoiceSelect />
11-
</NvFormItem>
9+
<NvStack spacing="5">
10+
<NvFormItem label="Voice">
11+
<NvVoiceSelect/>
12+
</NvFormItem>
13+
<NvDivider direction="horizontal"/>
14+
<NvFormItem label="Speaking Rate">
15+
<NvGroup>
16+
<NvRangeInput
17+
:max="4"
18+
:min="0.25"
19+
:step=".01"
20+
class="!grow"
21+
v-bind="{
22+
modelValue: getProperty('speakingRate'),
23+
'onUpdate:modelValue': (value) => setProperty('speakingRate', value),
24+
}"
25+
/>
26+
<NvNumberInput
27+
:max="4"
28+
:min="0.25"
29+
:step=".01"
30+
v-bind="{
31+
modelValue: getProperty('speakingRate'),
32+
'onUpdate:modelValue': (value) => setProperty('speakingRate', value),
33+
}"
34+
/>
35+
</NvGroup>
36+
</NvFormItem>
37+
<NvDivider direction="horizontal"/>
38+
<NvFormItem label="Pitch">
39+
<NvGroup>
40+
<NvRangeInput
41+
:max="20"
42+
:min="-20"
43+
:step=".1"
44+
class="!grow"
45+
v-bind="{
46+
modelValue: getProperty('pitch'),
47+
'onUpdate:modelValue': (value) => setProperty('pitch', value),
48+
}"
49+
/>
50+
<NvNumberInput
51+
:max="20"
52+
:min="-20"
53+
:step=".1"
54+
v-bind="{
55+
modelValue: getProperty('pitch'),
56+
'onUpdate:modelValue': (value) => setProperty('pitch', value),
57+
}"
58+
/>
59+
</NvGroup>
60+
</NvFormItem>
61+
<NvDivider direction="horizontal"/>
62+
<NvFormItem label="Volume Gain (Db)">
63+
<NvGroup>
64+
<NvRangeInput
65+
:max="16"
66+
:min="-96"
67+
:step=".1"
68+
class="!grow"
69+
v-bind="{
70+
modelValue: getProperty('volumeGainDb'),
71+
'onUpdate:modelValue': (value) => setProperty('volumeGainDb', value),
72+
}"
73+
/>
74+
<NvNumberInput
75+
:max="20"
76+
:min="-20"
77+
:step=".1"
78+
v-bind="{
79+
modelValue: getProperty('volumeGainDb'),
80+
'onUpdate:modelValue': (value) => setProperty('volumeGainDb', value),
81+
}"
82+
/>
83+
</NvGroup>
84+
</NvFormItem>
85+
</NvStack>
1286
</NvAccessBlocker>
1387
<template v-if="speechStore.hasUniversalApiCredentials">
14-
<NvDivider direction="horizontal" />
88+
<NvDivider direction="horizontal"/>
1589
<NvGroup justify="apart" no-wrap spacing="5">
1690
<NvStack>
1791
<NvText type="label">Use my own credentials</NvText>
1892
</NvStack>
1993
<NvSwitch
20-
:modelValue="getProperty('useLocalCredentials')"
21-
@update:modelValue="(value) => setProperty('useLocalCredentials', value)"
94+
:modelValue="getProperty('useLocalCredentials')"
95+
@update:modelValue="(value) => setProperty('useLocalCredentials', value)"
2296
/>
2397
</NvGroup>
2498
</template>
2599
<template v-if="getProperty('useLocalCredentials') || !speechStore.hasUniversalApiCredentials">
26-
<NvDivider direction="horizontal" />
100+
<NvDivider direction="horizontal"/>
27101
<NvStack spacing="5">
28102
<NvFormItem label="API Key">
29103
<NvInput
30-
:modelValue="getProperty('apiKey', true)"
31-
show-password
32-
type="password"
33-
@update:modelValue="(value) => setProperty('apiKey', value, true)"
104+
:modelValue="getProperty('apiKey', true)"
105+
show-password
106+
type="password"
107+
@update:modelValue="(value) => setProperty('apiKey', value, true)"
34108
/>
35109
</NvFormItem>
36110
</NvStack>
@@ -42,7 +116,7 @@ import {
42116
NvDivider,
43117
NvFormItem,
44118
NvGroup,
45-
NvInput,
119+
NvInput, NvNumberInput, NvRangeInput,
46120
NvStack,
47121
NvSwitch,
48122
NvText,

apps/app/src/plugins/speech-engines/google-cloud/register.ts

Lines changed: 55 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -8,60 +8,63 @@ import { ENGINE_ID, ENGINE_NAME, getVoiceName } from './shared'
88
import { getProperty, setProperty } from './store'
99

1010
const getCredentials = () => ({
11-
apiKey: getProperty('apiKey', true),
11+
apiKey: getProperty('apiKey', true),
1212
})
1313

1414
const getSelectedVoice = () => getProperty('selectedVoice')
1515
registerEngine({
16-
id: ENGINE_ID,
17-
name: ENGINE_NAME,
18-
category: 'cloud',
19-
getSelectedVoice,
20-
getVoiceName,
21-
getCredentials,
22-
hasCredentials() {
23-
const speechStore = useSpeechStore()
24-
return (
25-
speechStore.hasUniversalApiCredentials ||
26-
Object.values(getCredentials()).every(Boolean)
27-
)
28-
},
29-
getPayload({ text, translatedText, voice: v }) {
30-
const selectedVoice = getSelectedVoice()
31-
const voice: any = pick(v || selectedVoice, [
32-
'name',
33-
'ssmlGender',
34-
'languageCode',
35-
])
36-
// eslint-disable-next-line prefer-destructuring
37-
voice.languageCode = selectedVoice.languageCodes[0]
38-
return {
39-
input: {
40-
text: translatedText || text,
41-
},
42-
voice,
43-
audioConfig: {
44-
audioEncoding: 'LINEAR16',
45-
volumeGainDb: 0,
46-
},
47-
}
48-
},
49-
getLanguageCode(voice) {
50-
return (voice || getSelectedVoice()).languageCodes[0]
51-
},
52-
synthesizeSpeech({ credentials, payload }) {
53-
return api(
54-
getProperty('useLocalCredentials') ? 'local' : 'remote',
55-
).post<Blob>(
56-
'/tts/google-cloud/synthesize-speech',
57-
{
58-
credentials,
59-
payload,
60-
},
61-
{ responseType: 'blob' },
62-
)
63-
},
64-
voiceSelectComponent: NvVoiceSelect,
65-
settingsComponent: NvSettings,
66-
store: { setProperty, getProperty },
16+
id: ENGINE_ID,
17+
name: ENGINE_NAME,
18+
category: 'cloud',
19+
getSelectedVoice,
20+
getVoiceName,
21+
getCredentials,
22+
hasCredentials() {
23+
const speechStore = useSpeechStore()
24+
return (
25+
speechStore.hasUniversalApiCredentials ||
26+
Object.values(getCredentials()).every(Boolean)
27+
)
28+
},
29+
getPayload({ text, translatedText, voice: v }) {
30+
const selectedVoice = getSelectedVoice()
31+
const voice: any = pick(v || selectedVoice, [
32+
'name',
33+
'ssmlGender',
34+
'languageCode',
35+
])
36+
// eslint-disable-next-line prefer-destructuring
37+
voice.languageCode = selectedVoice.languageCodes[0]
38+
return {
39+
input: {
40+
text: translatedText || text,
41+
},
42+
voice,
43+
audioConfig: {
44+
audioEncoding: 'LINEAR16',
45+
speakingRate: Number(getProperty('speakingRate')),
46+
pitch: Number(getProperty('pitch')),
47+
volumeGainDb: Number(getProperty('volumeGainDb')),
48+
49+
},
50+
}
51+
},
52+
getLanguageCode(voice) {
53+
return (voice || getSelectedVoice()).languageCodes[0]
54+
},
55+
synthesizeSpeech({ credentials, payload }) {
56+
return api(
57+
getProperty('useLocalCredentials') ? 'local' : 'remote',
58+
).post<Blob>(
59+
'/tts/google-cloud/synthesize-speech',
60+
{
61+
credentials,
62+
payload,
63+
},
64+
{ responseType: 'blob' },
65+
)
66+
},
67+
voiceSelectComponent: NvVoiceSelect,
68+
settingsComponent: NvSettings,
69+
store: { setProperty, getProperty },
6770
})

apps/app/src/plugins/speech-engines/google-cloud/store.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@ import { definePluginStore } from '@/store'
22
import { ENGINE_ID } from './shared'
33

44
export const { setProperty, getProperty } = definePluginStore(ENGINE_ID, {
5-
apiKey: '',
6-
selectedVoice: {
7-
languageCodes: ['en-GB'],
8-
ssmlGender: 'FEMALE',
9-
name: 'en-GB-Wavenet-A',
10-
},
11-
useLocalCredentials: false,
12-
favoriteVoiceIds: [],
5+
apiKey: '',
6+
selectedVoice: {
7+
languageCodes: ['en-GB'],
8+
ssmlGender: 'FEMALE',
9+
name: 'en-GB-Wavenet-A',
10+
},
11+
useLocalCredentials: false,
12+
favoriteVoiceIds: [],
13+
speakingRate: 1,
14+
pitch: 0,
15+
volumeGainDb: 0,
1316
})

apps/app/src/plugins/speech-engines/say/NvSettings.vue

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,37 @@
22
<NvFormItem label="Voice">
33
<NvVoiceSelect />
44
</NvFormItem>
5+
<NvDivider direction="horizontal" />
6+
<NvFormItem label="Speed">
7+
<NvGroup>
8+
<NvRangeInput
9+
:max="300"
10+
:min="1"
11+
class="!grow"
12+
v-bind="{
13+
modelValue: getProperty('speed'),
14+
'onUpdate:modelValue': (value) => setProperty('speed', value),
15+
}"
16+
/>
17+
<NvNumberInput
18+
:max="300"
19+
:min="1"
20+
v-bind="{
21+
modelValue: getProperty('speed'),
22+
'onUpdate:modelValue': (value) => setProperty('speed', value),
23+
}"
24+
/>
25+
</NvGroup>
26+
</NvFormItem>
527
</template>
628
<script lang="ts" setup>
7-
import { NvFormItem } from '@packages/ui'
29+
import {
30+
NvDivider,
31+
NvFormItem,
32+
NvGroup,
33+
NvNumberInput,
34+
NvRangeInput,
35+
} from '@packages/ui'
836
import NvVoiceSelect from './NvVoiceSelect'
37+
import { getProperty, setProperty } from '@/plugins/speech-engines/say/store.ts'
938
</script>

apps/app/src/plugins/speech-engines/say/register.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ registerEngine({
2020
return {
2121
text: translatedText || text,
2222
voice: voice || getSelectedVoice(),
23+
speed: getProperty('speed') / 100,
2324
}
2425
},
2526
getLanguageCode() {

apps/app/src/plugins/speech-engines/say/store.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ import { ENGINE_ID } from './shared'
44
export const { setProperty, getProperty } = definePluginStore(ENGINE_ID, {
55
selectedVoice: null,
66
favoriteVoiceIds: [],
7+
speed: 100,
78
})

0 commit comments

Comments
 (0)