1. Qiita
  2. 投稿
  3. Swift

Swiftが歌う、音声出力ズンドコキヨシ

  • 6
    いいね
  • 0
    コメント

概要

ズンドコキヨシ、テキストで出力するお題ですが、やっぱり歌いたい、ということで、Mac OS XのAppKitにあるNSSpeechSynthesizerを使って歌うズンドコを書きました。

実行結果例

実行結果は音声出力です。
→ SoundCloud

仕様

ズンが4回以上続いたら→4の倍数回続いたら、に仕様変更してます。メロディが合わないので。

リズム

適当実装です。usleepで待ってリズムとってますが、本当は、ちゃんと時間の精度が出る方法で、UIの応答が止まらないようにしなきゃいけませんね

音程

音程はNSSpeechPitchBasePropertyで変えられるようですが、普通の声だと単語としてのアクセントが加味されて音程が変わってしまうので、Zarvoxという平坦な声を選びました。Zarvoxさんは英語を話すので、ズンドコも日本語っぽい発音になるように英語っぽい綴りで書きます。2chフラッシュ懐かしいね。

ソース

zundoko()を実行するとズンドコします。

"Zundoko.swift"
class Zundoko {
    let speechSynth: NSSpeechSynthesizer = NSSpeechSynthesizer(voice: "com.apple.speech.synthesis.voice.Zarvox")!

    func zundoko() {
        var zundex = 0
        while true {
            let zunSel = arc4random() % 2 == 1
            if zunSel {
                if zundex == zun.count {
                    zundex=0
                }
                playElements(zun[zundex])
                zundex++
            } else {
                playElements(doko)
                if zundex == zun.count {
                    playElements(kiyoshi)
                    break
                } else {
                    zundex = 0
                }
            }
        }
    }

    let zun:[[Element]] =
    [
        [Element(length:4,pitch:51.0,text:"zoon")],
        [Element(length:2,pitch:56.0,text:"zoon")],
        [Element(length:1,pitch:57.0,text:"zoo"),
            Element(length:1,pitch:56.0,text:"oon")],
        [Element(length:2,pitch:51.0,text:"zoon")]
    ]
    let doko:[Element] =
    [Element(length:1,pitch:54.0,text:"do"),
        Element(length:1,pitch:51.0,text:"ko")]

    let kiyoshi:[Element] =
    [Element(length:1,pitch:63.0,text:"key"),
        Element(length:1,pitch:63.0,text:"yo"),
        Element(length:1,pitch:63.0,text:"shit")]

    func playElements(elements: [Element]) {
        for element in elements {
            playElement(element)
        }
    }

    func playElement(element: Element) {
        try! speechSynth.setObject(element.pitch, forProperty: NSSpeechPitchBaseProperty)
        speechSynth.startSpeakingString(element.text)
        usleep(UInt32(element.length)*263*1000)
    }

    class Element {
        var length: Int
        var pitch: Double
        var text: String
        init(length: Int, pitch: Double, text: String) {
            self.length = length
            self.pitch = pitch
            self.text = text
        }
    }
}

環境

OS X El Capitan バージョン 10.11.3
Xcode Version 7.2.1 (7C1002)

Comments Loading...