達磨面壁堂

https://dharma.tanaka0903.netというサブドメインを作った。

https://tanaka0903.net の過去記事はほとんどすべてレビュー待ちに移した。こちらの記事は一つずつ確認した上で戻そうと思う。

今後は「はかもなきこと」の更新はやめて、ブログは「達磨面壁堂」で更新することにする。

dharma.tanaka0903.net だけ AdSense に登録しようとしたのだが、サブドメインだけ登録することはできないということなので、仕方なくそうした。

やれやれ。さてどうなることやら。

南北朝

中国で南北朝と言えば、北と南で別々の王朝が立っている状態で、特に隋によって統一されるまでの時代をいう。

日本で南北朝というと京都が北朝で吉野が南朝という時代を言うのだが、これは別に全然南北朝でもなんでも無い。日本は南北に細長いから、関東以北と関西以南、だいたい木曽川あたりを境にして分裂した状態を南北朝というはずだ。しかし後醍醐天皇の南朝は単に一部の地方を掌握していた政権というだけであって、日本全体は東北から九州まで北朝が支配していた(九州や東北、信濃を、一時期南朝の皇子が支配していたことがあったが、要するに南朝と北朝が虫食い状態になっていただけで、南と北にきっぱり分かれていたのではない)。これを南北朝と言うから日本史の本質が見えなくなる。

日本における真の南北朝とは、足利時代に室町将軍と鎌倉公方が対立していた状態を言うべきだ。しかしこのことの重要性を認識している人はほとんどいない。なぜ対立したかといえば将軍が自ら関東を支配せず、京都になんかいたからだ。

室町将軍と鎌倉公方の対立は両家の血筋が離れていくにつれて深刻化していった。京都と関東と、二つの幕府があるかのような状態となった。そのため足利義教は鎌倉公方を滅ぼしたが、自らも暗殺された。これによって足利幕府の権威は失墜し、南北朝(足利幕府の)が成立した。室町将軍は関東に新しい鎌倉公方を送ろうとしたが失敗し、鎌倉公方は北関東に逃げて古河公方となり、関東の守護らは鎌倉を留守にして領地に住むようになった。つまり典型的な封建領主になった。これが戦国時代の始まりだ(伊豆における北条早雲の自立をもって戦国大名の嚆矢、守護職の崩壊とする説もまあ良いのだが、古河公方の成立を戦国時代の始まりとしたほうがもう少しわかりよい。応仁の乱を戦国時代の始めとするのは最悪の解釈だ。事実はまったく逆で、戦国時代が始まったので応仁の乱が起きたのだ)。同じことが京都でも起きて、応仁の乱によってそれが決定的となり、京都にいた守護らは京都を留守にして領地に住むようになった。

こうして足利幕府の守護職は有名無実化し、守護の時代から戦国大名の時代に移行した。

こうしてみると足利時代の歴史というのは極めて単純明快である。京都と関東の両方に同時に目を配ることで初めて足利時代とはなんだったかが、わかるのだ。日本人は南北朝というものが何かわかってないから室町時代がまったくわからないし、応仁の乱もさっぱりわかってない。関東は関東で、京都は京都で勝手にバラバラに戦争していた。日本人は政治音痴だった。将軍は政治をほったらかしにして能楽と茶の湯にふけっていた。応仁の乱は京都でなんとなく始まった東軍と西軍(つまり南北朝)の戦いがだらだら長期化しそれが戦国時代を招いた、などというバカげた認識しかいまだにない。日本の歴史学者はほんとうにバカしかいない。日本史ファンもみんなバカだ。足利時代ほど面白い時代はないのに、源平合戦とか、戦国時代か、幕末維新にしか興味がない。

足利時代に比べると徳川時代と鎌倉時代は、関東も京都も同じ幕府が同時に支配していて非常に安定していた。それは、関東に幕府を置き、京都に出張所を置くというやり方が、日本全土を支配するのに理に適っていたからだ。近畿を日本の政治的中心にするということがそもそも間違っているのだ。特に徳川時代は、当時としてはこれ以上望むべくもないほどに安定していた。それは徳川幕府時代の儒者らが足利時代や鎌倉時代を良く研究していたからだ。特に新井白石や松平定信が幕政に貢献したが、ほかにも多くの優れた学者がいた。

もし日本に関東平野のような広大な平野があと二つも三つもあったら日本という国の歴史はどうなっていたかわからん。南北に長いだけだったので二つに分かれることはよくあった。その場合常に関東が京都を制圧してきた(明治維新は例外だが。太平の世が続きすぎて坂東武者もすっかり腑抜けになってしまった。広大な荒野だった関東平野は完全に開発され尽くし、人民も飼いならされてしまった)。それでも皇統がゆらぐことはなかったが、関東に匹敵する武力の中心(つまり武士が疾駆する広大な原野)が、ほかにもあったら、地方政権がいくつもできてしまい、国や皇統も簡単に分裂し、また統一したりを繰り返したに違いない。そのことは日本にとってよかったのか悪かったのかなんとも言えない。

しかし日本には関東平野のような広大な未開拓の原野は一つしかなかった。狭苦しい横須賀を旅行していてそんなことを考えた。埼玉や千葉など、平らなのが当たり前なところに長い間住むことがなかったらそんなことを考えることもなかっただろうと思う。

横須賀

横須賀に行ってきたのだが、京急横須賀中央から三崎口方面へ延びている三崎街道というものが、横須賀のもともとの繁華街であったらしく、ここに今もアーケードが残っている。春日野などは大正時代から続く老舗らしい。立花食堂も気に入った。ヨネヤは昔の蔵を改造して新しくできた飲み屋で、立食が気にならなければ良い店だと思う。

紅五五六(クレ556)という風変わりな名前の店にも行った。地魚中心の店三崎街道は明らかに旧道とバス通りが並走しており、紅五五六は旧道の入口あたりにある。

三崎商店街で腹いっぱいになってしまい、シェンムーゆかりの Honey Bee にはいきそこねた。持ち帰りにして翌日の朝食にしようかと思ったが、持ち帰りの窓口はあるのだが閉まっていて、そこは諦めてどぶ板通りの東の入り口あたりにある Hera’s Loungeという店に入った。

後で考えると、Honey Bee は人気店であり、金曜の夜だからそこそこ空いていたのだ。しかも Honey Bee は店内の雰囲気が売りなのでわざわざ持ち帰りにする客などいないのだった。Hera’s Lounge はメニューが spicy chicken sandwich としか書いてなかったのでチキンかと思って買ったら普通のビーフのハンバーガーだった。割とおいしかったし、たぶんあの時食べてなければ一生食べることはなかっただろうからまあまあ満足している。

というわけで花松という花屋など、聖地巡礼して回ったのだが、この花屋が入っているのがまた、GHQ司令で闇市をまとめた感じの実に見事な雑居ビルであった。同じようなビルで三笠ビルというのがあるが、こちらは三笠ビル2号とでもいうのか。さいか屋という創業150年というデパートにも行ってみた。そんで本町一丁目のバス停からバスに乗り横須賀港へ。シェンムーと同じだ。停泊したイージス艦や戦艦陸奥主砲などを見て、JR横須賀駅から帰った。

割と強行軍だったのでもう一度くらいは行っても良いかもしれん。

久里浜と九十九里浜

九十九里浜は日本書紀には玉浦と出てきて、浜の両端には玉前という神社があるというが、どうも九十九里浜は最初は久里浜と呼ばれていたのではなかろうか。房総半島と三浦半島では地名に重複が多いことが知られている(四国や近畿地方とも)。これは人が移住することで元住んでいた地名を移したからだと考えられるが、のちに、房総半島と三浦半島でまったく同じ地名があると紛らわしいから、房総の方の久里浜を九十九里浜と呼ぶようになったのではなかろうか。

また、久里浜とはハマグリがとれる浜というような意味ではなかろうか。

unreal から voicevox をしゃべらせる2

webrick で rubyスクリプトで rest api サーバーを立ち上げて、voicevox にアクセスできるようにした(powershell で rest api サーバーを書いていたがそれをやめて ruby だけで書いた)。voicevox2.rb

require 'net/http'
require 'uri'
require 'json'
require 'webrick'

def speak(text, speaker)
  puts text, speaker
  uri = URI.parse("http://localhost:50021/audio_query")
  uri.query = URI.encode_www_form({ "text" => text, "speaker" => speaker })
  headers = {
    "Content-Type" => "application/json",
    "User-Agent" => "vox-client:0.1",
  }
  response = Net::HTTP.post(uri, "", headers)
  case response
  when Net::HTTPSuccess
    result = JSON.parse(response.body)
  else
    puts "audio query error: #{response}"
  end
  uri = URI.parse("http://localhost:50021/synthesis")
  uri.query = URI.encode_www_form({ "speaker" => speaker })
  response = Net::HTTP.post(uri, response.body, headers)
  if response.code == '200'
    File.open("output#{speaker}.wav", "wb") do |f|
      f.write(response.body)
    end
  else
    puts "synthesis response error"
  end
end

# サーバーの設定
server = WEBrick::HTTPServer.new(
  Port: 6001,
  BindAddress: '0.0.0.0'
)

# POST /talk というパスへの処理を定義
server.mount_proc '/talk' do |req, res|
  # POSTメソッド以外は受け付けない
  if req.request_method == 'POST'
    begin
      # 1. リクエストボディを読み込んでJSONパース
      data = JSON.parse(req.body)
      
      # 2. "message" キーを取り出して表示
      message = data["message"]
      puts "[#{Time.now}] 受信メッセージ: #{message}"
      speak(message, 1)
      # powershell で output*.wav を鳴らす
      system("powershell -ExecutionPolicy Bypass -command .\\sound1.ps1")
      # 3. ステータスコード 204 (No Content) を設定
      res.status = 204
    rescue => e
      puts "エラーが発生しました: #{e.message}"
      res.status = 400 # 不正なリクエスト
    end
  else
    res.status = 405 # Method Not Allowed
  end
end

# Ctrl+C で安全に停止するための設定
trap('INT') { server.shutdown }

# サーバー起動
puts "Server started on http://localhost:6001"
server.start

ruby (もしくは python) でできることは powershell でやる必要は無いなと思う。powershell でしかできないこと(windows固有の、wavを再生するとか)だけを powershell に投げれば良いのではないか。いや、それが当たり前なんだろうけど。

unreal から voicevox をしゃべらせる

voicevox を立ち上げると rest api サーバー(localhost:50021)が常駐するので、そこへ文字列と話者(ずんだもんとか四国めたんなど)を渡せばその文字列をしゃべらせることができる。unreal から voicevox の rest api サーバーへ varest プラグインを通じて直接アクセスすれば良さそうに思えるのだが、その後 voicevox が生成した wav ファイルを鳴らすという処理も行う必要がある。この部分のこまごまとした作業を blueprint で書くのは難しい。wavファイルをwindowsで再生するというそれだけの単純作業にしても、powershell から呼ぶのが一番安全確実である。

そこで powershell で rest api サーバーを立てて、unreal はそのサーバーにいったんデータを送り、そこから ruby なり python なり別の powershell なりのスクリプトを呼び出して、voicevox の rest api サーバーを間接的に呼び出したり wavファイルを再生するのが一番よかろうということになった。

私は ruby が好きなので、できるだけ ruby で書けるところは ruby で書きたいと思った。python は結局使わずに済んだ。

次の ruby スクリプトはコマンドラインの引数に文字列を渡して voicevox サーバーを呼び出し最終的に powershell スクリプトで voicevox が生成した wavファイルを再生するというものである。

voicevox1.rb

require 'net/http'
require 'uri'
require 'json'

def speak(text, speaker)
  puts text, speaker
  uri = URI.parse("http://localhost:50021/audio_query")
  uri.query = URI.encode_www_form({ "text" => text, "speaker" => speaker })
  headers = {
    "Content-Type" => "application/json",
    "User-Agent" => "vox-client:0.1",
  }
  response = Net::HTTP.post(uri, "", headers)
  case response
  when Net::HTTPSuccess
    result = JSON.parse(response.body)
  else
    puts "audio query error: #{response}"
  end
  uri = URI.parse("http://localhost:50021/synthesis")
  uri.query = URI.encode_www_form({ "speaker" => speaker })
  response = Net::HTTP.post(uri, response.body, headers)
  if response.code == '200'
    File.open("output#{speaker}.wav", "wb") do |f|
      f.write(response.body)
    end
  else
    puts "synthesis response error"
  end
end

query_text = ARGV[0]
speak(query_text, 1)
# powershell で output*.wav を鳴らす
system("powershell -ExecutionPolicy Bypass -command .\\sound1.ps1")

そして次の powershell スクリプト sraserv02.ps1 は unreal から呼び出す rest api サーバーであり、unreal から渡された文字列をその都度 ruby スクリプトに渡すというだけのものである。じゃあ最初から rest api サーバーも ruby で書いてしまえばよかったんじゃないのと思うが、もう動いてしまったのでとりあえず今のところはこれでよしとする。

$port = 6001
$prefix = "http://localhost:$port/"
$text_encoding = [System.Text.Encoding]::UTF8

$listener = New-Object System.Net.HttpListener
$listener.Prefixes.Add($prefix)
$listener.Start()

Write-Host "REST API Server listening on $prefix"
Write-Host "Press Ctrl+C to stop."

try {
  while ($true) {
    $context  = $listener.GetContext()
    $request  = $context.Request
    $response = $context.Response

    $path = $request.Url.AbsolutePath
    $method = $request.HttpMethod

    Write-Host "$method $path"

    $result = $null
    $status = 200

    if ($method -eq "POST" -and $path -eq "/talk") {
      # POST /talk
      # {"message": "string to talk" }
      $reader = New-Object IO.StreamReader($request.InputStream, $text_encoding)
      $body = $reader.ReadToEnd()
      $reader.Close()
      $result = $body | ConvertFrom-Json
    } else {
      $status = 404
      $result = @{ error = "Not found" }
    }
        
    Write-Host $result.message
    # ruby で voicevox に言葉を送る
    ruby voicevox1.rb $result.message
  }
}
finally {
  $listener.Stop()
  $listener.Close()
}

で、最後はただ単にwavファイルを再生するだけの powershell スクリプト sound1.ps1。

(New-Object Media.SoundPlayer "output1.wav").PlaySync()

pardon は unreal 側からまず ollama に質問してその答えを reply に渡す。

reply は ruby スクリプトで書いた localhost:6001 の rest api サーバーにアクセスして voicevox を喋らせる。

太宰春台と平田鐵胤の墓

根津、天眼禅寺にある太宰春台のお墓にお参りした。享年1747年だから、今から300年近く前の墓にしては、きれいな墓石で、文字もはっきりと読める。手入れもされていて、苔むしたりはしていない。もともとそれなりに良い石を使ってあるのだろうか。

本堂には三つ葉葵の扉がある。松平家ゆかりの寺だが臨済宗なのは少しめずらしい。

今どきの御影石の墓石はきれいだが風情がない。最近はなんでもかんでも御影石だ。

そのあと巣鴨のとげぬき地蔵など行き、それから芥川龍之介、谷崎潤一郎などの墓などもお参りにいったのだが、途中珍しいお墓があったので寄ってみた。平田篤胤の娘と結婚して平田鐵胤(かねたね)と名乗った人だ。つまり篤胤に養子縁組した篤胤の弟子なのだ。このあたりは区画ごとに囲いがしてあって、なかなかたどり着けない。しかも一番奥で藪蚊がひどかった(クモの巣もある。行くには用心したほうがよい)。岡倉天心の墓のさらに奥。

平田篤胤は秋田の出身だが脱藩して江戸に住み、山鹿素行流兵学者の平田家に養子で入り、この墓はその平田家代々の墓であるらしい。平田篤胤の墓は本居宣長の墓の隣、つまり伊勢松坂にあるはずなので、ここではないということでよかろうか。

染井霊園は墓石の形はおおむね普通だが、明治政府が神葬祭地に指定し、東京府が管理したのだというから、ここのお墓はみな仏教徒ではなく神道家だということか。それから東京市に移管され、今は東京都が管理している都営霊園ということでよかろうか。なんかわからんことだらけだ。ウェブサイトなどもしっかりしていて万事ちゃんとしている。

このあたりはどこまでも墓地だが、寺が管理していたり都が管理していたり、その区画ごとに囲まれていて、かなり迷う。

護国寺や雑司ヶ谷霊園にも行こうと思ったのだが、眠いし暑いしで疲れ果ててしまった。荻生徂徠の墓は白金高輪のほうにあるし。正岡子規の墓は田端のほうだし。も少し時間をかけないとちゃんと墓参りはできない。

頼山陽 立志論

男児不学則已、学当超群矣。今日之天下、猶古昔之天下也。今日之民、猶古昔之民也。天下与民、古不異今。而所以治之、今不及古者何也。国異勢乎、人異情乎。無有志之人也。庸俗之人、溺於情勢、而不自知。無上下一也。

男児学ばされば則ち已む、学べは当に群れを超ゆべし、

古之賢聖豪傑、如伊傅如周召者亦一男児耳、吾雖生于東海千歳之下、生幸為男児矣、又為儒生矣、安可不奮発立志以答国恩、以顕父母哉。

古の賢聖豪傑、伊傅の如き、周召の如き者は亦た一男児のみ、吾れ東海千歳の下に生まると雖も、生まれて幸ひにして男児となり、又た儒生となりて、安んぞ奮発立志して以て国恩に答へ、以て父母を顕さざるべけんや。

かな?

伊傅は伊尹と傅説、周召は周公旦と召公奭のことらしい。

これを一から訳すのは大変だなあ。

太宰春台

上田秋成『胆大小心録』に

聖人もだんだんご身代が大きうならしゃまして、悪人がたを加へねば、芝居がうてぬやうになつた事じゃ。ある儒者が、聖人とはなんでも国の乱れを治めたのが聖人じゃといふたは、末世の早算用なり。国を盗める候となる。候の心に仁義とはくだくだしいて聞こえにくい。その儒者どのが其の心ゆゑ、身持ちが悪くて、徂徠学じゃといへば、今の俳諧師のやうな相場じゃあったげな。太宰といふが力まれても、とかくに本家の評判が悪いから、とんとあとがない。

また頼山陽『山陽先生書後』「書徂徠集後」に

南郭の如きは王李に克肖し、其の師を踰ゆる有れど、而して観るに足らず。春台の能く其の師の非を悟るは豪傑と謂ふべし。

などとある。秋成の秋成節は何を言っているのかいつもながらよくわからんが、徂徠よりも春台のほうを高く評価しているようにもみえる。山陽も徂徠よりは春台のほうがまだましだと言っている。

しかし私が徂徠の書いたものと、春台が書いたものを見比べるに、春台は徂徠のおかげで名は売れて、文章も達者で、相当世間を騒がせたようだが、結局は徂徠の焼き直しにすぎず、徂徠と違うあたりには頭のおかしなことを言っているだけのようにみえる。それが「太宰といふが力まれても」という評になったか。

当時の人々にとって徂徠が有名だったのは間違いないが、何かしら徂徠はうとましい存在だったのかもしれない。春台のほうがなぜかしら好ましい人に見えたのかもしれない。しかし春台はろくに就職もしてないし、宮仕えなどできるような人でもなかったようにみえる。

要するには私には、山陽や秋成が春台を高く買っているのが不思議だということで、漱石も春台が嫌いではなかったし、春台がなぜそんなに評価されているのか、わけがわからないのである。

『山陽先生書後』なんだけど国会図書館デジタルコレクションには天保時代の木版本しかない。ふざけんなと言いたい。かっちりとした楷書で書かれているから読めるっちゃ読めるんだが(和文で、くずし字で書かれてたら死んでた。漢文だからまだ読めたのだ)、活字に起こして読み下し文とか現代語訳とか付けてほしい。ならおまえがやれ、と言われそうだが(追記。よく探したらあった)。

『徂徠集』にしてもいつの時代のものかしれぬ、出版者が松村九兵衛とかになってる木版本しかない。これはさすがに怒ってもいいんじゃないのか。国文学者らの怠慢ではないのか。