ソラマメブログ

2009年11月09日

ゆっくりボイスでボイスチャットしつつチャットログを出すツール

最近、SofTalkというツールを使って、ゆっくりボイスでボイスチャットするテクを覚えました( ̄∇  ̄ )

ゆっくりしていってね

単に、音を出すだけなら簡単で、Windowsのタスクトレイの音の設定で録音デバイスを開き、ステレオミキサーを有効にするだけです。画像はVistaですがXPでも同じ設定がどこかにあるそうです。あと、さぶろーはやってないですが、直接パソコンのスピーカー出力とマイク入力をケーブルでつないでしまうやり方もあるようです。

ステレオミキサー

注意点として、ボイスチャットを行うにはマイクのデバイスが存在する必要があります。サウンドボードによっては、別途マイクを購入する必要があるかもしれません。あとは、ボイスチャットで話すを有効にして、Softalkを立ち上げて何かしゃべると、周りでボイチャ有効にしてる人に聞こえるはずです。

↓ボイスチャットで話すをONにした状態
ボイスチャット

ちなみにこのやり方は、本来スピーカーに出力する内容を、ボイスチャットのマイクへ転送しているだけなんで、セカンドライフの裏でエロゲーをしたり、痛いアニメを見てたりする猛者は、えらい目に遭います。ご注意をw


さて、ボイチャでしゃべらせるだけなら簡単なのですが、ボイチャを使うとチャットのログが残らず、あとから文脈を追いにくいという問題があります。

そこで話した内容を、SLビューワとSoftalk両方に送るようなツールを作ろうと思ったのですが、さぶろーがあまり使ったことのないWindowsAPIを使わないといけないようで、どうしようかと困っていたのでした。

それが、昨日、New Scriptシムのスクリプターの会で、そのことを話すと、SLのチャットログを読んでSoftalkへ転送した方が早いとか色んな意見が出て、さらには、Kobun Footpadさん、midori Paulseさんの、お二方が1晩でツールを作ってくれました( ̄∇  ̄ )


Kobun Footpadさんのツール
こちらは、Pythonで書かれています。途中のIf文を変更することで、誰の発言をしゃべらせるか切り替えたり、クリップボード経由でメッセージを送信するようにしたりできます(クリップボードは、Softalk ver 1.47以前のみ使用可)。事前にPythonと、Windows用の拡張のインストールが必要です。

使うには、コマンドプロンプトで引数にチャットログファイルを指定します。ソースを、「speak.py」で保存した場合は、こんな感じ。

C:\Python26\python speak.py chat.txt

Softalkは先に起動しておく必要があります。また、環境設定で「ENTERで再生&クリア」を有効にするのを忘れないでください。

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Python本体はこちらから
# http://www.python.org/download/
# Windows用拡張はこちらから
# http://sourceforge.net/projects/pywin32/
#
# エラーチェックとかしてないです
# speak.py [filename]
# 例:
# C:\Python26\python speak.py chat.txt

# 改版履歴
# クリップボード廃止後のバージョンに対応(.NET v1.69でのみ確認)
# 環境設定→その他 ENTERで再生&クリア にチェックしてください
# 無用なファイルのオープンクローズを撤廃
# アバターの通常発言のみをSoftTalkへ送る(というか 名前 苗字 な形だけ)

import os, sys, time, codecs, array, struct
import win32clipboard as w32cb
import win32con as wc
import win32gui as wg

class tail():
lmtime = None;
delay = 0.05; # Windowsのタスクスライスが50msなので
def __init__(self, filename):
self.filename = filename
f = open(self.filename)
f.seek(0, 2);
self.pos = f.tell()

def makeString(self, str):
try:
if (False): # 特定の人の発言のみSoftTalkに送る場合は True にする
# 特定の人の場合
s = str.split('Kobun Footpad: ', 1)[1]
pass
else:
# だれでも
p, s = str.split(': ', 1)
if (len(p.split(' ')) != 5):
s = None
except:
s = None
return s

def run(self):
self.file = codecs.open(self.filename, 'r', 'utf-8')
while True:
time.sleep(self.delay)
stat = os.stat(self.filename)
if stat.st_mtime != self.lmtime:
self.lmtime = stat.st_mtime
self.read()
self.file.close()

def read(self):
self.file.seek(self.pos, 0)
s = self.file.read();
self.pos = self.file.tell()
if s:
s = self.makeString(s)
if s:
if (False):
# SoftTalk v 1.47 or earlier
w32cb.OpenClipboard()
w32cb.EmptyClipboard()
w32cb.SetClipboardText(s)
w32cb.CloseClipboard()
else:
# SOfTalk v1.48 or later (tested on .NET v1.69 only)
# find SoftTalk target window
hwnd = wg.FindWindowEx(wg.FindWindow('WindowsForms10.Window.8.app.0.378734a', 'SofTalk'),
0, 'WindowsForms10.EDIT.app.0.378734a', None)
if (hwnd):
wg.SendMessage(hwnd, wc.WM_SETTEXT, 0, s.encode('cp932', 'ignore'))
wg.PostMessage(hwnd, wc.WM_KEYDOWN, wc.VK_RETURN, 0)
#<NOT USED># wg.PostMessage(hwnd, wc.WM_CHAR, wc.VK_RETURN, 0x001c0001)
#<NOT USED># wg.PostMessage(hwnd, wc.WM_KEYUP, wc.VK_RETURN, 0x001c0001)


if __name__ == "__main__":
tail(sys.argv[1]).run()


midori Paulseさんのツール
こちらはC言語ですが、ご本人のエントリ(文字チャットでボイスチャットをw)に詳しく書いてありますので、そちらを参照した方がいいと思います。自分でコンパイルするので少しだけ上級者向けでしょうか。


どちらのツールも、さぶろーの環境で問題なく動きましたんで、ご自分の環境に合わせて簡単に導入できる方を使えばよいと思います( ̄∇  ̄ )

ライセンスは、お二方ともFreeBSDライセンスだそうです。当然、無保証ですので、これらのツールの使用は自己責任でお願いいたします。



同じカテゴリー(Tips)の記事画像
HUDパーティクルを試してみた
SpaceNavigatorの3つのモード
着ぐるみアバター制作中
デフォーマーについて調べてみた
擬似トゥーンレンダリングプリム作成のまとめ
SLテクスチャ、TGAとPNGでの挙動の違い
同じカテゴリー(Tips)の記事
 HUDパーティクルを試してみた (2009-06-26 03:13)
 SpaceNavigatorの3つのモード (2009-06-14 17:30)
 着ぐるみアバター制作中 (2009-03-16 23:32)
 デフォーマーについて調べてみた (2009-01-24 21:00)
 擬似トゥーンレンダリングプリム作成のまとめ (2008-11-19 00:39)
 SLテクスチャ、TGAとPNGでの挙動の違い (2008-10-19 18:32)

Posted by sabro at 03:45│Comments(6)Tips
この記事へのコメント
私の書いたコードですけど
s.encode('shift-jisx0213')
の部分を
s.encode('cp932', 'ignore')
としないと文字によっては例外で止まってしまうため、書き換えて使ったほうがよいですね。
Posted by Kobun Footpad at 2009年11月09日 20:01
Kobunさん、フォローありがとうございます( ̄∇  ̄ )
本文のコードは修正しておきました。
Posted by sabrosabro at 2009年11月09日 23:12
こんにちは、おもしろいと思って使わせていただいています。

windowsXPの環境では、ちゃんと動いていたのですが
あたらしいPC環境では、文字化けしてsoftalkが、
はなしてくれないです。
windows7 64bit
python 3.12
SLviewer 2.1.1
softalk 1.80
一応、softalkまでは、行っているようですが、
表示される文字が化けているようです。
Posted by step Aya at 2010年09月20日 11:19
さぶろーは、Pythonは門外漢なんであんまり分からないのですが、
たしか、Python2.x系と、Python3.x系では、
Unicode文字の扱いが変わっていたはずなので、
Python2.x系で動かして試してみてはどうでしょうか( ̄∇  ̄ )

ちなみに、さぶろーは
Windows Vista 32bit
Python 2.6.4
SLViewer ver2.0導入前のSnowGrove
Softalk 1.67
で、動かしてました(Viewer2以降は、未確認です)。
Posted by sabro at 2010年09月20日 16:42
返信ありがとうございました。

python全然わからないのですが、
わからないなりに試していたら、
環境
windows7 64bit
python 3.1.2
SLviewer 2.1.1
softalk 1.8.3
で、softalkのオプション、クリップボード読み上げをONにして、
66行目の False を True にして、クリップボード経由にすると、ちゃんと読み上げてくれるようです。

ただしコピーすると、チャット以外も読み上げてくれちゃうのですが・・・^^;
Posted by step Aya at 2010年10月03日 00:53
Softalk1.48以降であれば、66行目はFalseのままでいいはずではあります。

ここから、Windows-x86_64向けのPython2.6インストーラを
ダウンロードして試してみるのもありかも。
http://www.python.org/download/releases/2.6.6/

で、実行はPythonのインストール先にもよりますが、こんな感じで
C:\Python26\python speak.py chat.txt

ただし、やるなら自己責任でお願いします( ̄∇  ̄ )
Posted by sabro at 2010年10月03日 04:21
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。