Инструмент командной строки Swift или Objective-C и преобразование текста в речь, не выводящие звук

Я пишу инструмент командной строки кода Морзе для Mac OS X, написанный на Swift в качестве языка сценариев. Я хочу дать пользователю возможность прослушать азбуку Морзе с помощью Apple NSSpeechSynthesizer. Я могу заставить это работать внутри приложения без пота. Но внутри инструмента командной строки или сценария Swift функция startSpeakingString() не слышна, если только я не прохожу код построчно.

Вот код в Swift (то же самое для надлежащего инструмента командной строки или скрипта)

import Foundation
import AppKit

var synth:NSSpeechSynthesizer = NSSpeechSynthesizer.init()
synth.startSpeakingString("dit dah")

А вот код инструмента командной строки Objective-C

@import Foundation;
@import AppKit;

int main(int argc, const char * argv[]) {
    @autoreleasepool {
         NSSpeechSynthesizer *synth = [[NSSpeechSynthesizer alloc] init];
         [synth startSpeakingString:@"dit dah"];
    }
    return 0
}

Экземпляр NSSpeechSythesizer кажется законным во всех случаях. Функция startSpeakingString() возвращает true во всех случаях. Вот мой репозиторий (в процессе): https://github.com/jpavley/swift-scripts


person John Pavley    schedule 19.04.2015    source источник
comment
Вашей программе нужен цикл выполнения. См. stackoverflow.com/questions/25126471/ для различных решений.   -  person Martin R    schedule 19.04.2015
comment
Дополнительные решения цикла запуска здесь: stackoverflow .com/questions/28590701/.   -  person Martin R    schedule 19.04.2015
comment
Да спасибо! И после того, как я пошалил, я могу заставить инструмент выводить речь, и тогда он работает вечно. Но я обнаружил, что создал делегата, запустил его и заснул, чтобы работать. Вероятно, есть менее хакерский способ, но я опубликую свое решение ниже!   -  person John Pavley    schedule 19.04.2015


Ответы (2)


NSSpeechSynthesizer.isAnyApplicationSpeaking() ожидает завершения речи.

import Foundation
import AppKit

class Speaker: NSObject , NSSpeechSynthesizerDelegate {
    var synth : NSSpeechSynthesizer!

    func run() {
        self.synth = NSSpeechSynthesizer.init()
        self.synth.delegate = self
        self.synth.startSpeakingString("First word")
        while(NSSpeechSynthesizer.isAnyApplicationSpeaking() == true) {}
    }
}

var speak : Speaker = Speaker.init()
speak.run()
person pepe    schedule 06.08.2015

Спасибо за комментарии, я обнаружил, что мне нужен цикл выполнения. Я нашел вдохновение на GitHub pannous/caffe-speech-recognition и переписал код так, чтобы он выглядел так:

import Foundation
import AppKit

println("Hello, World!")

//var synth:NSSpeechSynthesizer = NSSpeechSynthesizer.init()
//var result = synth.startSpeakingString("dit doh")
//println(result)

@objc class SynthDelegate : NSObject, NSSpeechSynthesizerDelegate {

    func run() {
        var synth = NSSpeechSynthesizer.init()
        synth.delegate = self
        synth.startSpeakingString("dit doh")
    }
}

SynthDelegate().run()
sleep(2);

Я чувствую, что вызов функции sleep(2) немного хак (и не очень хороший). Мне нужно изучить, как сделать это лучше.

person John Pavley    schedule 19.04.2015