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

sabro

2009年11月09日 03:45


最近、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