2017-02-16 8 views
0

この場合、次のコードを使って何をすべきですか?Swift 3のコマンドラインプログラムで "say"を実行する方法は?

func convertToM4A(filename: String, voice: String) -> Bool { 

    let full_string = speaking_queue?.joined(separator: " ") 
    let command_string: [String] = [/"-v \"\(voice)\"",*/ "--progress", "--output-file=\"\(filename)\"","-i", " \"\(full_string!)\""] 
    print(command_string) 

    /
    let DocumentsDirectory = FileManager().homeDirectory(forUser: "shyamalchandra") 
    print((DocumentsDirectory?.absoluteString)!) 
    */ 

    let task = Process() 

    task.launchPath = "/usr/bin/say" 
    task.arguments = command_string 
    let pipe = Pipe() 
    task.standardOutput = pipe 
    task.launch() 

    let data = pipe.fileHandleForReading.readDataToEndOfFile() 
    let output: String? = String(data: data, encoding: String.Encoding.utf8) 
    task.waitUntilExit() 

    if let output = output { 
     if !output.isEmpty { 
      print(output.trimmingCharacters(in: .whitespacesAndNewlines)) 
     } 
    } 

    return true 
} 

実行時に、TERM環境が設定されていないとの文句を言い、さらにファイルをディスクに書き出しません。何をすべきか?

+0

達成したいことは明確ではありません。コンソールログを印刷しますか? –

+0

@ShyamalChandra実際に配列のときに 'command_string'という変数を作るのはなぜですか? ಠ_ – Alexander

答えて

1

主なエラーは、引数配列の作成方法です。与えられた引数 はプロセスに直接渡されます。 Processシェルを使用して が引数を解釈しないので、引用符で囲んではいけません。 マーク。

もう1つの問題は、ファイルに書き込むときに "-i"(対話型)オプションを使用できないことです。

だからあなたのコードは次のようになります。

func convertToM4A(filename: String, voice: String) -> Bool { 

    let fullString = "Hello world" 

    let task = Process() 
    task.launchPath = "/usr/bin/say" 
    task.arguments = [ "-v", voice, "-o", filename, fullString] 

    task.launch() 
    task.waitUntilExit() 

    return true 
} 

「--progress」オプションが 標準エラー出力に表示するプログレスメーターの原因となります。それを表示したい場合は を非同期に標準エラーから読み取らなければなりません。

0

このlibを見てみると、これまで私が使用していたので、シェルスクリプトを実行することができます。それで、 "say"コマンドを使っていくつかの引数を送ることができます。 https://github.com/kareman/SwiftShell

あなたはネイティブのMacアプリを書き込み、オーディオファイルに合成音声を録音したい場合は、シェルコマンドをラップしようとして行っていないインスタンス

import SwiftShell 

try runAndPrint("say", "Hello world", 4, "arguments") 

let array = ["Hello world", "we", "are"] 
try runAndPrint("say", array, array.count + 2, "arguments") 
1

のためにそれをこのように試みることができます - それにはネイティブAPI があります。 NSSpeechSynthesizerは一般にtext-to-speech用のmacOS APIであり、出力をオーディオファイルに記録するメソッドstartSpeaking(_:to:)を持っています。 AIFFファイルへ

このAPIの出力は、しかし、あなたが変換するために使用できる多数のAPI /エンコードがあることM4Aへ:AVAssetReader/AVAssetWriterAVAudioFile、低レベルのCoreAudio C APIを、など

(一般的には、ネイティブのMacプログラムを作成していて、何かしたいのであれば、シェルコマンドをラップしようとする前にAPIがあるかどうかを確認してください。通常、これらのシェルコマンドは同じAPIを使用しています。すべての間接指示、I/O解析などで自分自身を罰するだけです)

はい、NSSpeechSynthesizerはAppKit APIですが、コマンドラインツール。

関連する問題