Изменение текста в речь по умолчанию - PullRequest
1 голос
/ 15 июня 2011
Tell application "System Preferences" 
    set "default voice" to "Agnes" 
end tell 

Результат:

Невозможно установить «голос по умолчанию» на «anna».Доступ запрещен.

Ответы [ 4 ]

6 голосов
/ 20 мая 2013

В вашем подходе есть две проблемы:

  • Словарь для приложения System Preferences не содержит элемента default voice или какого-либо другого элемента для изменения голоса TTS (преобразования текста в речь) по умолчанию.(начиная с OS X 10.11);на самом деле, похоже, что Apple не предоставляет никакого программного способа изменения голоса по умолчанию (даже через класс NSSpeechSynthesizer Какао).
  • Двойными кавычками default voice вы 'мы пытаемся присвоить значение строковому литералу , который всегда будет неудачным.

Примечание: более ранняя версия этого ответа указывала на скрипт Bashс именем voice в папке Dropbox;с тех пор этот сценарий был переименован в voices, его синтаксис был пересмотрен и теперь правильно публикуется как проект с открытым исходным кодом - см. ниже.

К сожалению, начиная с OSX 10.11 (El Capitan), нет задокументированного программного способа изменить голос по умолчанию.

Это можно сделать, но это требует недокументированных внутренних компонентов системы, поэтому совместимость в будущем не гарантируется.

voices - это написанный мною CLI, который делает именно это - проверено на работу с OSX 10.11 вплоть до OSX 10.8.

Затем вы можете сделать следующее из AppleScript:

do shell script "/path/to/voices -d {voiceName}"

Например, если вы поместили voices в /usr/local/bin и хотите переключиться на Agnes в качестве голоса по умолчанию, используйте:

do shell script "/usr/local/bin/voices -d Agnes"

Если у вас установлен Node.js, вы можете установить voices в /usr/local/bin с

npm install voices -g

В противном случае следуйте инструкциям здесь .

2 голосов
/ 20 мая 2013

Изменения в ~/Library/Preferences/com.apple.speech.voice.prefs.plist, кажется, применяются немедленно.

d=com.apple.speech.voice.prefs
if [[ $(defaults read $d SelectedVoiceName) = Kathy ]]; then
  defaults write $d SelectedVoiceCreator -int 1835364215
  defaults write $d SelectedVoiceID -int 201
  defaults write $d SelectedVoiceName Alex  
else
  defaults write $d SelectedVoiceCreator -int 1836346163
  defaults write $d SelectedVoiceID -int 2
  defaults write $d SelectedVoiceName Kathy
fi

Другая опция, использующая сценарии пользовательского интерфейса:

tell application "System Preferences"
    reveal anchor "TTS" of pane "com.apple.preference.speech"
end tell
tell application "System Events" to tell process "System Preferences"
    tell pop up button 1 of tab group 1 of window 1
        delay 0.1
        click
        if value is "Alex" then
            click menu item "Kathy" of menu 1
        else
            click menu item "Alex" of menu 1
        end if
    end tell
end tell
quit application "System Preferences"

Без задержки значение было Loading Voices…, если Системные настройкине был открыт раньше.

1 голос
/ 05 января 2015

Чтобы заставить его работать с Yosemite, вам нужно добавить следующие 2 строки в конец скрипта, предоставленного mklement0 выше:

Оригинальная ссылка на файл из mklement0: https://dl.dropboxusercontent.com/u/10047483/voice

Добавьте две строки ниже, чтобы перезапустить SpeechSynthesisServer, иначе вы не сможете использовать сочетание клавиш для немедленного доступа к новому голосу по умолчанию:

killall SpeechSynthesisServer
open /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSynthesisServer.app
0 голосов
/ 15 июня 2011

Это работает:

property currentVoice : "Vicki"

set systemVoices to {"Agnes", "Albert", "Alex", "BadNews", "Bahh", "Bells", "Boing", "Bruce", ¬
 "Bubbles", "Cellos", "Deranged", "Fred", "GoodNews", "Hysterical", "Junior", "Kathy", ¬
 "Organ", "Princess", "Ralph", "Trinoids", "Vicki", "Victoria", "Whisper", "Zarvox"}

    repeat

     activate me

     set theResult to display dialog "Say What?" default answer ¬

      "" buttons {"Quit", "Speak", "Change Voice"} ¬

      default button "Speak" cancel button "Quit"


if button returned of theResult is "Quit" then exit repeat

 else if button returned of theResult is "Change Voice" then

  set currentVoice to item 1 of ¬

(choose from list systemVoices with prompt "Choose new voice.")

 end if

 if text returned of theResult is not "" then

  say text returned of theResult using currentVoice volume 1

 end if

end repeat
...