概要
ズンドコキヨシ、テキストで出力するお題ですが、やっぱり歌いたい、ということで、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)