Set-voice updated to support the new system. Hopefully also more reliable.
This commit is contained in:
		@@ -1,18 +1,18 @@
 | 
				
			|||||||
#!/usr/bin/env bash
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
# Set Voice
 | 
					# Set Voice
 | 
				
			||||||
# Set the default wine voice ba$sed on installed options.
 | 
					# Set the default wine voice based on installed options.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#    ■The contents of this file are subject to the Common Public Attribution
 | 
					#    âe contents of this file are subject to the Common Public Attribution
 | 
				
			||||||
#    License Version 1.0 (the ■License■); you may not use this file except in
 | 
					#    License Version 1.0 (the âcenseâ you may not use this file except in
 | 
				
			||||||
#    compliance with the License. You may obtain a copy of the License at
 | 
					#    compliance with the License. You may obtain a copy of the License at
 | 
				
			||||||
#    https://opensource.org/licenses/CPAL-1.0. The License is ba$sed on the Mozilla Public License Version
 | 
					#    https://opensource.org/licenses/CPAL-1.0. The License is based on the Mozilla Public License Version
 | 
				
			||||||
#    1.1 but Sections 14 and 15 have been added to cover use of software over a
 | 
					#    1.1 but Sections 14 and 15 have been added to cover use of software over a
 | 
				
			||||||
#    computer network and provide for limited attribution for the Original
 | 
					#    computer network and provide for limited attribution for the Original
 | 
				
			||||||
#    Developer. In addition, Exhibit A has been modified to be consistent with
 | 
					#    Developer. In addition, Exhibit A has been modified to be consistent with
 | 
				
			||||||
#    Exhibit B.
 | 
					#    Exhibit B.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#    Software distributed under the License is distributed on an ■AS IS■ basis,
 | 
					#    Software distributed under the License is distributed on an â ISâasis,
 | 
				
			||||||
#    WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 | 
					#    WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 | 
				
			||||||
#    for the specific language governing rights and limitations under the
 | 
					#    for the specific language governing rights and limitations under the
 | 
				
			||||||
#    License.
 | 
					#    License.
 | 
				
			||||||
@@ -81,7 +81,6 @@ declare -A command=(
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
msgbox() {
 | 
					msgbox() {
 | 
				
			||||||
# Returns: None
 | 
					# Returns: None
 | 
				
			||||||
# Shows the provided message on the screen with an ok button.
 | 
					# Shows the provided message on the screen with an ok button.
 | 
				
			||||||
@@ -143,10 +142,18 @@ set_voice() {
 | 
				
			|||||||
        [[ "$x" = "$tmp" ]] && break
 | 
					        [[ "$x" = "$tmp" ]] && break
 | 
				
			||||||
        counter=$(( $counter + 1 ))
 | 
					        counter=$(( $counter + 1 ))
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
    local RHVoiceName="$(find "${WINEPREFIX}/drive_c/ProgramData/Olga Yakovleva/RHVoice/data/voices/" -maxdepth 1 -type d)"
 | 
					    local RHVoiceName=""
 | 
				
			||||||
 | 
					    local RHVoicePath="${WINEPREFIX}/drive_c/ProgramData/Olga Yakovleva/RHVoice/data/voices/"
 | 
				
			||||||
 | 
					    if [[ -d "$RHVoicePath" ]]; then
 | 
				
			||||||
 | 
					        RHVoiceName="$(find "$RHVoicePath" -maxdepth 1 -type d -not -path "$RHVoicePath" | head -1)"
 | 
				
			||||||
 | 
					        if [[ -n "$RHVoiceName" ]]; then
 | 
				
			||||||
            RHVoiceName="${RHVoiceName##*/}"
 | 
					            RHVoiceName="${RHVoiceName##*/}"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
    fullVoice="${voiceListFullName[$counter]}"
 | 
					    fullVoice="${voiceListFullName[$counter]}"
 | 
				
			||||||
 | 
					    if [[ -n "$RHVoiceName" ]]; then
 | 
				
			||||||
        fullVoice="${fullVoice/RHVoice/RHVoice\\\\${RHVoiceName}}"
 | 
					        fullVoice="${fullVoice/RHVoice/RHVoice\\\\${RHVoiceName}}"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
    ${wine}server -k # If we don't do this it's likely wine will overwrite our reverted change or even clobber the registry key entirely
 | 
					    ${wine}server -k # If we don't do this it's likely wine will overwrite our reverted change or even clobber the registry key entirely
 | 
				
			||||||
    # Remove any existing rate change for voices
 | 
					    # Remove any existing rate change for voices
 | 
				
			||||||
    $sed -i '/"DefaultTTSRate"=dword:/d' "${WINEPREFIX}/user.reg"
 | 
					    $sed -i '/"DefaultTTSRate"=dword:/d' "${WINEPREFIX}/user.reg"
 | 
				
			||||||
@@ -162,13 +169,21 @@ test_voice() {
 | 
				
			|||||||
        [ "$x" = "$tmp" ] && break
 | 
					        [ "$x" = "$tmp" ] && break
 | 
				
			||||||
        counter=$(( $counter + 1 ))
 | 
					        counter=$(( $counter + 1 ))
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
    local RHVoiceName="$(find "${WINEPREFIX}/drive_c/ProgramData/Olga Yakovleva/RHVoice/data/voices/" -maxdepth 1 -type d)"
 | 
					    local RHVoiceName=""
 | 
				
			||||||
 | 
					    local RHVoicePath="${WINEPREFIX}/drive_c/ProgramData/Olga Yakovleva/RHVoice/data/voices/"
 | 
				
			||||||
 | 
					    if [[ -d "$RHVoicePath" ]]; then
 | 
				
			||||||
 | 
					        RHVoiceName="$(find "$RHVoicePath" -maxdepth 1 -type d -not -path "$RHVoicePath" | head -1)"
 | 
				
			||||||
 | 
					        if [[ -n "$RHVoiceName" ]]; then
 | 
				
			||||||
            RHVoiceName="${RHVoiceName##*/}"
 | 
					            RHVoiceName="${RHVoiceName##*/}"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
    fullVoice="${voiceListFullName[$counter]}"
 | 
					    fullVoice="${voiceListFullName[$counter]}"
 | 
				
			||||||
 | 
					    if [[ -n "$RHVoiceName" ]]; then
 | 
				
			||||||
        fullVoice="${fullVoice/RHVoice/RHVoice\\\\${RHVoiceName}}"
 | 
					        fullVoice="${fullVoice/RHVoice/RHVoice\\\\${RHVoiceName}}"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
    ${wine}server -k # If we don't do this it's likely wine will overwrite our reverted change or even clobber the registry key entirely
 | 
					    ${wine}server -k # If we don't do this it's likely wine will overwrite our reverted change or even clobber the registry key entirely
 | 
				
			||||||
    $sed -i -E -e 's/"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\(SOFTWARE|Software)\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^"]+"/"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\'"${fullVoice//\\/\\\\}"'"/g' "${WINEPREFIX}/user.reg"
 | 
					    $sed -i -E -e 's/"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\(SOFTWARE|Software)\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^"]+"/"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\'"${fullVoice//\\/\\\\}"'"/g' "${WINEPREFIX}/user.reg"
 | 
				
			||||||
    cat << "EOF" > "${bottle}/drive_c/windows/temp/speak.vbs"
 | 
					    cat << "EOF" > "${WINEPREFIX}/drive_c/windows/temp/speak.vbs"
 | 
				
			||||||
        dim speechobject
 | 
					        dim speechobject
 | 
				
			||||||
            set speechobject=createobject("sapi.spvoice")
 | 
					            set speechobject=createobject("sapi.spvoice")
 | 
				
			||||||
                speechobject.speak "This is a test of your chosen voice. It contains multiple sentences and punctuation, and is designed to give a full representation of this voices qualities."
 | 
					                speechobject.speak "This is a test of your chosen voice. It contains multiple sentences and punctuation, and is designed to give a full representation of this voices qualities."
 | 
				
			||||||
@@ -186,12 +201,20 @@ args="${args//[[:space:]]/}"
 | 
				
			|||||||
while getopts "${args}" i ; do
 | 
					while getopts "${args}" i ; do
 | 
				
			||||||
    case "$i" in
 | 
					    case "$i" in
 | 
				
			||||||
        b)
 | 
					        b)
 | 
				
			||||||
            if ! [[ -d ~/".local/wine/${OPTARG}" ]]; then
 | 
					            # Check for valid bottles in all possible locations
 | 
				
			||||||
 | 
					            if [[ -d ~/.local/wine/${OPTARG} ]]; then
 | 
				
			||||||
 | 
					                export bottle=~/.local/wine/${OPTARG}
 | 
				
			||||||
 | 
					                export WINEPREFIX=~/.local/wine/${OPTARG}
 | 
				
			||||||
 | 
					            elif [[ -d ~/.local/wine32 && ${OPTARG} == "wine32" ]]; then
 | 
				
			||||||
 | 
					                export bottle=~/.local/wine32
 | 
				
			||||||
 | 
					                export WINEPREFIX=~/.local/wine32
 | 
				
			||||||
 | 
					            elif [[ -d ~/.local/wine64 && ${OPTARG} == "wine64" ]]; then
 | 
				
			||||||
 | 
					                export bottle=~/.local/wine64
 | 
				
			||||||
 | 
					                export WINEPREFIX=~/.local/wine64
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
                echo "Invalid wine bottle specified."
 | 
					                echo "Invalid wine bottle specified."
 | 
				
			||||||
                exit 1
 | 
					                exit 1
 | 
				
			||||||
            fi
 | 
					            fi
 | 
				
			||||||
            export bottle=~/".local/wine/${OPTARG}"
 | 
					 | 
				
			||||||
            export WINEPREFIX=~/".local/wine/${OPTARG}"
 | 
					 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
        h) help;;
 | 
					        h) help;;
 | 
				
			||||||
        r)
 | 
					        r)
 | 
				
			||||||
@@ -210,14 +233,28 @@ done
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Offer a list of wine bottles if one isn't specified on the command line.
 | 
					# Offer a list of wine bottles if one isn't specified on the command line.
 | 
				
			||||||
if [[ -z "${bottle}" ]]; then
 | 
					if [[ -z "${bottle}" ]]; then
 | 
				
			||||||
    declare -a bottle
 | 
					    declare -a bottles=()
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Check for wine32 and wine64 bottles
 | 
				
			||||||
 | 
					    [[ -d ~/.local/wine32 ]] && bottles+=("$HOME/.local/wine32" "wine32")
 | 
				
			||||||
 | 
					    [[ -d ~/.local/wine64 ]] && bottles+=("$HOME/.local/wine64" "wine64")
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Add bottles from ~/.local/wine directory
 | 
				
			||||||
 | 
					    if [[ -d ~/.local/wine ]]; then
 | 
				
			||||||
        for i in $(find ~/.local/wine/ -maxdepth 1 -type d -not -name 'wine' | sort); do
 | 
					        for i in $(find ~/.local/wine/ -maxdepth 1 -type d -not -name 'wine' | sort); do
 | 
				
			||||||
        bottle+=("$i" "${i##*/}")
 | 
					            bottles+=("$i" "${i##*/}")
 | 
				
			||||||
        done
 | 
					        done
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if [[ ${#bottles[@]} -eq 0 ]]; then
 | 
				
			||||||
 | 
					        echo "No wine bottles found in ~/.local/wine32, ~/.local/wine64, or ~/.local/wine/"
 | 
				
			||||||
 | 
					        exit 1
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    export WINEPREFIX="$(dialog --backtitle "Use the up and down arrow keys to find the option you want, then press enter to select it." \
 | 
					    export WINEPREFIX="$(dialog --backtitle "Use the up and down arrow keys to find the option you want, then press enter to select it." \
 | 
				
			||||||
        --clear \
 | 
					        --clear \
 | 
				
			||||||
        --no-tags \
 | 
					        --no-tags \
 | 
				
			||||||
            --menu "Select A Wine Bottle" 0 0 0 "${bottle[@]}" --stdout)"
 | 
					        --menu "Select A Wine Bottle" 0 0 0 "${bottles[@]}" --stdout)"
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
                                                                                                                                                                          
 | 
					                                                                                                                                                                          
 | 
				
			||||||
if [[ -z "${WINEPREFIX}" ]]; then
 | 
					if [[ -z "${WINEPREFIX}" ]]; then
 | 
				
			||||||
@@ -231,9 +268,16 @@ if [[ -r "${WINEPREFIX}/agm.conf" ]]; then
 | 
				
			|||||||
    export WINESERVER
 | 
					    export WINESERVER
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
wine="${WINE:-$(command -v wine)}"
 | 
					wine="${WINE:-$(command -v wine)}"
 | 
				
			||||||
 | 
					wineserver="${WINESERVER:-$(command -v wineserver)}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Debug information - comment out or delete when not needed
 | 
				
			||||||
 | 
					# echo "Using wine bottle: ${WINEPREFIX}"
 | 
				
			||||||
 | 
					# echo "Wine executable: ${wine}"
 | 
				
			||||||
 | 
					# echo "Wineserver executable: ${wineserver}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# In case the user hasn't run a game using sapi in this prefix yet, let's try to initialize all the registry keys properly.
 | 
					# In case the user hasn't run a game using sapi in this prefix yet, let's try to initialize all the registry keys properly.
 | 
				
			||||||
cat << "EOF" > "${bottle}/drive_c/windows/temp/speak.vbs"
 | 
					mkdir -p "${WINEPREFIX}/drive_c/windows/temp"
 | 
				
			||||||
 | 
					cat << "EOF" > "${WINEPREFIX}/drive_c/windows/temp/speak.vbs"
 | 
				
			||||||
dim speechobject
 | 
					dim speechobject
 | 
				
			||||||
set speechobject=createobject("sapi.spvoice")
 | 
					set speechobject=createobject("sapi.spvoice")
 | 
				
			||||||
speechobject.speak ""
 | 
					speechobject.speak ""
 | 
				
			||||||
@@ -245,6 +289,13 @@ ifs="$IFS"
 | 
				
			|||||||
IFS=$'\n'
 | 
					IFS=$'\n'
 | 
				
			||||||
voiceListFullName=($($grep -P '\[Software\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^\\]+\].*' "${WINEPREFIX}/system.reg" | $sed -E -e 's/\[([^]]+)\].*/\1/g'))
 | 
					voiceListFullName=($($grep -P '\[Software\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^\\]+\].*' "${WINEPREFIX}/system.reg" | $sed -E -e 's/\[([^]]+)\].*/\1/g'))
 | 
				
			||||||
IFS="$ifs"
 | 
					IFS="$ifs"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Debug the voice list - comment out or delete when not needed
 | 
				
			||||||
 | 
					# echo "Found ${#voiceListFullName[@]} voices in registry"
 | 
				
			||||||
 | 
					# for voice in "${voiceListFullName[@]}"; do
 | 
				
			||||||
 | 
					#     echo "Voice: $voice"
 | 
				
			||||||
 | 
					# done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
voiceList=()
 | 
					voiceList=()
 | 
				
			||||||
for x in "${voiceListFullName[@]}" ; do
 | 
					for x in "${voiceListFullName[@]}" ; do
 | 
				
			||||||
    voiceList+=("$(echo "$x" | $sed -E -e 's/Software\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\(.+)/\3/g')")
 | 
					    voiceList+=("$(echo "$x" | $sed -E -e 's/Software\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\(.+)/\3/g')")
 | 
				
			||||||
@@ -252,7 +303,7 @@ done
 | 
				
			|||||||
oldVoice="$($grep -P '"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\(SOFTWARE|Software)\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^"]+"' "${WINEPREFIX}/user.reg" | $sed -E -e 's/"DefaultTokenId"="([^"]+)"/\1/g')"
 | 
					oldVoice="$($grep -P '"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\(SOFTWARE|Software)\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^"]+"' "${WINEPREFIX}/user.reg" | $sed -E -e 's/"DefaultTokenId"="([^"]+)"/\1/g')"
 | 
				
			||||||
exit=1
 | 
					exit=1
 | 
				
			||||||
if [[ "${#voiceList[@]}" -eq 0 ]]; then
 | 
					if [[ "${#voiceList[@]}" -eq 0 ]]; then
 | 
				
			||||||
    dialog --msgbox "No voices found." -1 -1
 | 
					    dialog --msgbox "No voices found in ${WINEPREFIX}. Make sure SAPI voices are installed in this Wine prefix." 0 0
 | 
				
			||||||
    exit 1
 | 
					    exit 1
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
while [[ $exit -ne 0 ]] ; do
 | 
					while [[ $exit -ne 0 ]] ; do
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user