冬の街角ノイズをパラメータに

https://dl.dropbox.com/u/264798/winter_noise2009.png

年末年始は田舎からリアル田舎に帰ったのですが、その珍幹線の道すがらで年の瀬の喧騒をパラメータにして遊びながら帰省しました。
つまり珍幹線内の音声ノイズを拾って、音声認識エンジンを通して文字にしてみたわけです。ある意味書き初め的なものかもしれません。

音声認識エンジンにはJuliusを使ってみました。10.6なmacへのインスコについてはこちらの記事を参考にさせていただきました。

http://coffeeash.blogspot.com/2009/12/julius-414-on-osx-1062-snow-leopard.html

本来であれば、Julius自体はきちんとした音響的な準備をすればかなり高精度な音声認識ができるものです。しかし、あえて人間の声そのものではなく「声にならない声」というか「むりくり新幹線の走行音だとかのノイズを人間の声と誤認識させる」という決して役には立たないことを年末のクソ忙しいとこでコソコソやってたわけですね。

このJuliusをモジュール起動させて、Grocessingからソケット通信で繋いで文字をレンダリングすると。そういったものです。そんなにたいしたものではないのですが、移動のヒマをつぶせたのでよかったです。以下ソースです。

import processing.core.*
import javax.swing.JFrame

class App extends PApplet{
  PFont font
  def words = ["冬の街角ノイズ"]

  void setup(){
    size(640,480)
    frameRate(10)
    background(255)
    smooth()
  
    font = createFont("MidashiMinPro-MA31",24)}

  void draw(){
    before()
    doing()
    after()}

  def before = {}

  def doing = {
    words.each{w->
      def tsize = random(20,width/5 as Float)
      textFont(font)
      textSize(tsize)
      textLeading(tsize-2 as Float)
      noStroke()
      fill(0)
      text(w, 10, random(tsize as Float, height-tsize as Float), width-10, height/2 as Float)}}

  def after = {
    words = []
    fill(255,20)
    rect(0,0,width,height)}
 
  //白く塗る
  void mouseClicked(){
    background(255)
    words << "冬の街角ノイズ"}

  def update(String name, Closure clo){
    clo.delegate = this
    this."${name}" = clo}
}

app = new App()
app.init()
jframe = new JFrame(title:"冬の街角ノイズ",resizable:true).with{
  add(app)
  pack()
  defaultCloseOperation = JFrame.EXIT_ON_CLOSE
  resizable = true
  visible = true}

//catch street noize
def socket
def reader

def parse = {
  def xml = new XmlSlurper().parseText(it)
  def stack = []
  xml.SHYPO.WHYPO.each{x->
    stack << x.@WORD}
  if(stack.size()!=0){
    def str = stack.join('')
    if(str!="。"){
      app.words << str}}}

try{
  socket = new Socket('localhost', 10500)
  while(true){
    def c = null
    def t = ""
    reader = new InputStreamReader(socket.getInputStream())
    while(null != ((c=reader.readLine()))){
      if(c!="."){
        t = t + c}
      else{
        parse(t)
        t = ""
        break}}}}
catch(Exception e){
  println e.toString()}

いちおうスクショも撮ってみたのですが、そんなに面白みはないかもです。

Winter Street Noise from nbqx on Vimeo.

というわけで、ことしもよろしくおねがいいたします。<追記 2010.01.05>

  • textLeadingあたりをいじるのが本職っぽいよねー(ラテンパーカッションを叩く仕事ですが)
  • ちなみにjuliusの起動はこんなかんじです。「-outcode W」をつけて余分なデータをつけないようにしてます。詳しくはwebで。
> julius -C ~/local/dictation-kit-v4.0/fast.jconf -charconv EUC-JP UTF-8 -module -outcode W