Merge branch 'oscVoiceMute' into develop
# Conflicts: # model.py
This commit is contained in:
12
config.py
12
config.py
@@ -892,6 +892,17 @@ class Config:
|
|||||||
self._ENABLE_LOGGER = value
|
self._ENABLE_LOGGER = value
|
||||||
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
|
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
|
||||||
|
|
||||||
|
@property
|
||||||
|
@json_serializable('ENABLE_VRC_MIC_MUTE_SYNC')
|
||||||
|
def ENABLE_VRC_MIC_MUTE_SYNC(self):
|
||||||
|
return self._ENABLE_VRC_MIC_MUTE_SYNC
|
||||||
|
|
||||||
|
@ENABLE_VRC_MIC_MUTE_SYNC.setter
|
||||||
|
def ENABLE_VRC_MIC_MUTE_SYNC(self, value):
|
||||||
|
if isinstance(value, bool):
|
||||||
|
self._ENABLE_VRC_MIC_MUTE_SYNC = value
|
||||||
|
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@json_serializable('IS_CONFIG_WINDOW_COMPACT_MODE')
|
@json_serializable('IS_CONFIG_WINDOW_COMPACT_MODE')
|
||||||
def IS_CONFIG_WINDOW_COMPACT_MODE(self):
|
def IS_CONFIG_WINDOW_COMPACT_MODE(self):
|
||||||
@@ -1071,6 +1082,7 @@ class Config:
|
|||||||
self._ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC = False # Speaker2Chatbox
|
self._ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC = False # Speaker2Chatbox
|
||||||
self._ENABLE_SPEAKER2CHATBOX_PASS = "000000000"
|
self._ENABLE_SPEAKER2CHATBOX_PASS = "000000000"
|
||||||
self._ENABLE_LOGGER = False
|
self._ENABLE_LOGGER = False
|
||||||
|
self._ENABLE_VRC_MIC_MUTE_SYNC = False
|
||||||
self._IS_CONFIG_WINDOW_COMPACT_MODE = False
|
self._IS_CONFIG_WINDOW_COMPACT_MODE = False
|
||||||
|
|
||||||
def load_config(self):
|
def load_config(self):
|
||||||
|
|||||||
@@ -924,6 +924,15 @@ def callbackSetEnableAutoExportMessageLogs(value):
|
|||||||
else:
|
else:
|
||||||
model.stopLogger()
|
model.stopLogger()
|
||||||
|
|
||||||
|
def callbackSetEnableVrcMicMuteSync(value):
|
||||||
|
print("callbackSetEnableVrcMicMuteSync", value)
|
||||||
|
config.ENABLE_VRC_MIC_MUTE_SYNC = value
|
||||||
|
if config.ENABLE_VRC_MIC_MUTE_SYNC is True:
|
||||||
|
model.startCheckMuteSelfStatus()
|
||||||
|
else:
|
||||||
|
model.stopCheckMuteSelfStatus()
|
||||||
|
|
||||||
|
|
||||||
def callbackSetEnableSendMessageToVrc(value):
|
def callbackSetEnableSendMessageToVrc(value):
|
||||||
print("callbackSetEnableSendMessageToVrc", value)
|
print("callbackSetEnableSendMessageToVrc", value)
|
||||||
config.ENABLE_SEND_MESSAGE_TO_VRC = value
|
config.ENABLE_SEND_MESSAGE_TO_VRC = value
|
||||||
@@ -978,7 +987,6 @@ def callbackSetEnableSendReceivedMessageToVrc(value):
|
|||||||
config.ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC = value
|
config.ENABLE_SEND_RECEIVED_MESSAGE_TO_VRC = value
|
||||||
# ---------------------Speaker2Chatbox---------------------
|
# ---------------------Speaker2Chatbox---------------------
|
||||||
|
|
||||||
|
|
||||||
# Advanced Settings Tab
|
# Advanced Settings Tab
|
||||||
def callbackSetOscIpAddress(value):
|
def callbackSetOscIpAddress(value):
|
||||||
if value == "":
|
if value == "":
|
||||||
@@ -1044,6 +1052,11 @@ def createMainWindow(splash):
|
|||||||
if config.ENABLE_LOGGER is True:
|
if config.ENABLE_LOGGER is True:
|
||||||
model.startLogger()
|
model.startLogger()
|
||||||
|
|
||||||
|
# init OSC receive
|
||||||
|
model.startReceiveOSC()
|
||||||
|
if config.ENABLE_VRC_MIC_MUTE_SYNC is True:
|
||||||
|
model.startCheckMuteSelfStatus()
|
||||||
|
|
||||||
splash.toProgress(3) # Last one.
|
splash.toProgress(3) # Last one.
|
||||||
|
|
||||||
# set UI and callback
|
# set UI and callback
|
||||||
@@ -1148,6 +1161,7 @@ def createMainWindow(splash):
|
|||||||
"callback_set_send_message_button_type": callbackSetSendMessageButtonType,
|
"callback_set_send_message_button_type": callbackSetSendMessageButtonType,
|
||||||
"callback_set_enable_notice_xsoverlay": callbackSetEnableNoticeXsoverlay,
|
"callback_set_enable_notice_xsoverlay": callbackSetEnableNoticeXsoverlay,
|
||||||
"callback_set_enable_auto_export_message_logs": callbackSetEnableAutoExportMessageLogs,
|
"callback_set_enable_auto_export_message_logs": callbackSetEnableAutoExportMessageLogs,
|
||||||
|
"callback_set_enable_vrc_mic_mute_sync": callbackSetEnableVrcMicMuteSync,
|
||||||
"callback_set_enable_send_message_to_vrc": callbackSetEnableSendMessageToVrc,
|
"callback_set_enable_send_message_to_vrc": callbackSetEnableSendMessageToVrc,
|
||||||
# Others(Message Formats(Send)
|
# Others(Message Formats(Send)
|
||||||
"callback_set_send_message_format": callbackSetSendMessageFormat,
|
"callback_set_send_message_format": callbackSetSendMessageFormat,
|
||||||
|
|||||||
@@ -243,6 +243,10 @@ config_window:
|
|||||||
label: Auto Export Message Logs
|
label: Auto Export Message Logs
|
||||||
desc: Automatically export the conversation messages as a text file.
|
desc: Automatically export the conversation messages as a text file.
|
||||||
|
|
||||||
|
vrc_mic_mute_sync:
|
||||||
|
label: VRChat Mic Mute Sync
|
||||||
|
desc: VRCT will not send the message to VRChat while VRChat's mic is muted.
|
||||||
|
|
||||||
send_message_to_vrc:
|
send_message_to_vrc:
|
||||||
label: Send Message To VRChat
|
label: Send Message To VRChat
|
||||||
desc: There is a way to use it without sending messages to VRChat, but it is not supported. Enable this feature when you intend to send a message to VRChat.
|
desc: There is a way to use it without sending messages to VRChat, but it is not supported. Enable this feature when you intend to send a message to VRChat.
|
||||||
|
|||||||
@@ -242,6 +242,11 @@ config_window:
|
|||||||
label: 会話ログを自動的に保存する
|
label: 会話ログを自動的に保存する
|
||||||
desc: テキストファイルとしてログがlogsフォルダ内に保存されます。
|
desc: テキストファイルとしてログがlogsフォルダ内に保存されます。
|
||||||
|
|
||||||
|
vrc_mic_mute_sync:
|
||||||
|
label: VRChatマイクミュート同期機能
|
||||||
|
desc: VRChatのマイクがミュートされている間は、メッセージをVRChatに送信しません。
|
||||||
|
|
||||||
|
|
||||||
send_message_to_vrc:
|
send_message_to_vrc:
|
||||||
label: VRChatにメッセージを送信する
|
label: VRChatにメッセージを送信する
|
||||||
desc: "サポート対象外ですが、VRChatにメッセージを送信せずに使う方法があります。送信したい場合、この機能を有効にする事を忘れないでください。"
|
desc: "サポート対象外ですが、VRChatにメッセージを送信せずに使う方法があります。送信したい場合、この機能を有効にする事を忘れないでください。"
|
||||||
|
|||||||
137
model.py
137
model.py
@@ -17,7 +17,7 @@ from typing import Callable
|
|||||||
from flashtext import KeywordProcessor
|
from flashtext import KeywordProcessor
|
||||||
from models.translation.translation_translator import Translator
|
from models.translation.translation_translator import Translator
|
||||||
from models.transcription.transcription_utils import getInputDevices, getOutputDevices
|
from models.transcription.transcription_utils import getInputDevices, getOutputDevices
|
||||||
from models.osc.osc_tools import sendTyping, sendMessage, sendTestAction, receiveOscParameters
|
from models.osc.osc_tools import sendTyping, sendMessage, receiveOscParameters, getOSCParameterValue
|
||||||
from models.transcription.transcription_recorder import SelectedMicEnergyAndAudioRecorder, SelectedSpeakerEnergyAndAudioRecorder
|
from models.transcription.transcription_recorder import SelectedMicEnergyAndAudioRecorder, SelectedSpeakerEnergyAndAudioRecorder
|
||||||
from models.transcription.transcription_recorder import SelectedMicEnergyRecorder, SelectedSpeakerEnergyRecorder
|
from models.transcription.transcription_recorder import SelectedMicEnergyRecorder, SelectedSpeakerEnergyRecorder
|
||||||
from models.transcription.transcription_transcriber import AudioTranscriber
|
from models.transcription.transcription_transcriber import AudioTranscriber
|
||||||
@@ -37,16 +37,27 @@ class threadFnc(Thread):
|
|||||||
self.fnc = fnc
|
self.fnc = fnc
|
||||||
self.end_fnc = end_fnc
|
self.end_fnc = end_fnc
|
||||||
self.loop = True
|
self.loop = True
|
||||||
|
self._pause = False
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
self.loop = False
|
self.loop = False
|
||||||
|
|
||||||
|
def pause(self):
|
||||||
|
self._pause = True
|
||||||
|
|
||||||
|
def resume(self):
|
||||||
|
self._pause = False
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
while self.loop:
|
while self.loop:
|
||||||
self.fnc(*self._args, **self._kwargs)
|
self.fnc(*self._args, **self._kwargs)
|
||||||
|
while self._pause:
|
||||||
|
sleep(0.1)
|
||||||
|
|
||||||
if callable(self.end_fnc):
|
if callable(self.end_fnc):
|
||||||
self.end_fnc()
|
self.end_fnc()
|
||||||
return
|
return
|
||||||
|
|
||||||
class Model:
|
class Model:
|
||||||
_instance = None
|
_instance = None
|
||||||
|
|
||||||
@@ -82,6 +93,9 @@ class Model:
|
|||||||
# self.overlay_image = OverlayImage()
|
# self.overlay_image = OverlayImage()
|
||||||
# self.pre_overlay_message = None
|
# self.pre_overlay_message = None
|
||||||
# self.th_overlay = None
|
# self.th_overlay = None
|
||||||
|
self.mic_audio_queue = None
|
||||||
|
self.mic_mute_status = None
|
||||||
|
self.mic_mute_status_check = None
|
||||||
|
|
||||||
def checkCTranslatorCTranslate2ModelWeight(self):
|
def checkCTranslatorCTranslate2ModelWeight(self):
|
||||||
return checkCTranslate2Weight(config.PATH_LOCAL, config.CTRANSLATE2_WEIGHT_TYPE)
|
return checkCTranslate2Weight(config.PATH_LOCAL, config.CTRANSLATE2_WEIGHT_TYPE)
|
||||||
@@ -238,39 +252,51 @@ class Model:
|
|||||||
def oscSendMessage(message):
|
def oscSendMessage(message):
|
||||||
sendMessage(message, config.OSC_IP_ADDRESS, config.OSC_PORT)
|
sendMessage(message, config.OSC_IP_ADDRESS, config.OSC_PORT)
|
||||||
|
|
||||||
def checkOSCStarted(self, fnc):
|
@staticmethod
|
||||||
self.is_valid_osc = False
|
def getMuteSelfStatus():
|
||||||
def checkOscReceive(address, osc_arguments):
|
return getOSCParameterValue(address="/avatar/parameters/MuteSelf")
|
||||||
if self.is_valid_osc is False:
|
|
||||||
self.is_valid_osc = True
|
|
||||||
|
|
||||||
self.listening_server = receiveOscParameters(checkOscReceive)
|
def startCheckMuteSelfStatus(self):
|
||||||
def oscListener():
|
def checkMuteSelfStatus():
|
||||||
self.listening_server.serve_forever()
|
if self.mic_mute_status is not None:
|
||||||
|
self.changeMicTranscriptStatus()
|
||||||
|
self.stopCheckMuteSelfStatus()
|
||||||
|
|
||||||
def sendTestActionLoop():
|
status = self.getMuteSelfStatus()
|
||||||
for _ in range(10):
|
if status is not None:
|
||||||
sendTestAction()
|
self.mic_mute_status = status
|
||||||
if self.is_valid_osc is True:
|
self.changeMicTranscriptStatus()
|
||||||
break
|
self.stopCheckMuteSelfStatus()
|
||||||
sleep(0.1)
|
|
||||||
self.listening_server.shutdown()
|
|
||||||
|
|
||||||
# start receive osc
|
if not isinstance(self.mic_mute_status_check, threadFnc):
|
||||||
th_receive_osc_parameters = Thread(target=oscListener)
|
self.mic_mute_status_check = threadFnc(checkMuteSelfStatus)
|
||||||
th_receive_osc_parameters.daemon = True
|
self.mic_mute_status_check.daemon = True
|
||||||
th_receive_osc_parameters.start()
|
self.mic_mute_status_check.start()
|
||||||
|
|
||||||
# check osc started
|
def stopCheckMuteSelfStatus(self):
|
||||||
th_send_osc_test_action = Thread(target=sendTestActionLoop)
|
if isinstance(self.mic_mute_status_check, threadFnc):
|
||||||
th_send_osc_test_action.daemon = True
|
self.mic_mute_status_check.stop()
|
||||||
th_send_osc_test_action.start()
|
self.mic_mute_status_check = None
|
||||||
|
|
||||||
th_receive_osc_parameters.join()
|
def startReceiveOSC(self):
|
||||||
th_send_osc_test_action.join()
|
osc_parameter_prefix = "/avatar/parameters/"
|
||||||
|
param_MuteSelf = "MuteSelf"
|
||||||
|
|
||||||
if self.is_valid_osc is False:
|
def change_handler_mute(address, osc_arguments):
|
||||||
fnc()
|
if osc_arguments is True and self.mic_mute_status is False:
|
||||||
|
self.mic_mute_status = osc_arguments
|
||||||
|
self.changeMicTranscriptStatus()
|
||||||
|
elif osc_arguments is False and self.mic_mute_status is True:
|
||||||
|
self.mic_mute_status = osc_arguments
|
||||||
|
self.changeMicTranscriptStatus()
|
||||||
|
|
||||||
|
dict_filter_and_target = {
|
||||||
|
osc_parameter_prefix + param_MuteSelf: change_handler_mute,
|
||||||
|
}
|
||||||
|
|
||||||
|
th_osc_server = Thread(target=receiveOscParameters, args=(dict_filter_and_target,))
|
||||||
|
th_osc_server.daemon = True
|
||||||
|
th_osc_server.start()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def checkSoftwareUpdated():
|
def checkSoftwareUpdated():
|
||||||
@@ -363,8 +389,9 @@ class Model:
|
|||||||
pass
|
pass
|
||||||
return
|
return
|
||||||
|
|
||||||
mic_audio_queue = Queue()
|
self.mic_audio_queue = Queue()
|
||||||
# mic_energy_queue = Queue()
|
# self.mic_energy_queue = Queue()
|
||||||
|
|
||||||
mic_device = choice_mic_device[0]
|
mic_device = choice_mic_device[0]
|
||||||
record_timeout = config.INPUT_MIC_RECORD_TIMEOUT
|
record_timeout = config.INPUT_MIC_RECORD_TIMEOUT
|
||||||
phase_timeout = config.INPUT_MIC_PHRASE_TIMEOUT
|
phase_timeout = config.INPUT_MIC_PHRASE_TIMEOUT
|
||||||
@@ -377,8 +404,8 @@ class Model:
|
|||||||
dynamic_energy_threshold=config.INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD,
|
dynamic_energy_threshold=config.INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD,
|
||||||
record_timeout=record_timeout,
|
record_timeout=record_timeout,
|
||||||
)
|
)
|
||||||
# self.mic_audio_recorder.recordIntoQueue(mic_audio_queue, mic_energy_queue)
|
# self.mic_audio_recorder.recordIntoQueue(self.mic_audio_queue, mic_energy_queue)
|
||||||
self.mic_audio_recorder.recordIntoQueue(mic_audio_queue, None)
|
self.mic_audio_recorder.recordIntoQueue(self.mic_audio_queue, None)
|
||||||
self.mic_transcriber = AudioTranscriber(
|
self.mic_transcriber = AudioTranscriber(
|
||||||
speaker=False,
|
speaker=False,
|
||||||
source=self.mic_audio_recorder.source,
|
source=self.mic_audio_recorder.source,
|
||||||
@@ -390,7 +417,7 @@ class Model:
|
|||||||
)
|
)
|
||||||
def sendMicTranscript():
|
def sendMicTranscript():
|
||||||
try:
|
try:
|
||||||
res = self.mic_transcriber.transcribeAudioQueue(mic_audio_queue, config.SOURCE_LANGUAGE, config.SOURCE_COUNTRY)
|
res = self.mic_transcriber.transcribeAudioQueue(self.mic_audio_queue, config.SOURCE_LANGUAGE, config.SOURCE_COUNTRY)
|
||||||
if res:
|
if res:
|
||||||
message = self.mic_transcriber.getTranscript()
|
message = self.mic_transcriber.getTranscript()
|
||||||
fnc(message)
|
fnc(message)
|
||||||
@@ -398,8 +425,10 @@ class Model:
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def endMicTranscript():
|
def endMicTranscript():
|
||||||
mic_audio_queue.queue.clear()
|
while not self.mic_audio_queue.empty():
|
||||||
# mic_energy_queue.queue.clear()
|
self.mic_audio_queue.get()
|
||||||
|
# while not self.mic_energy_queue.empty():
|
||||||
|
# self.mic_energy_queue.get()
|
||||||
del self.mic_transcriber
|
del self.mic_transcriber
|
||||||
gc.collect()
|
gc.collect()
|
||||||
|
|
||||||
@@ -421,6 +450,42 @@ class Model:
|
|||||||
# self.mic_get_energy.daemon = True
|
# self.mic_get_energy.daemon = True
|
||||||
# self.mic_get_energy.start()
|
# self.mic_get_energy.start()
|
||||||
|
|
||||||
|
self.changeMicTranscriptStatus()
|
||||||
|
|
||||||
|
def resumeMicTranscript(self):
|
||||||
|
# キューをクリア
|
||||||
|
if isinstance(self.mic_audio_queue, Queue):
|
||||||
|
while not self.mic_audio_queue.empty():
|
||||||
|
self.mic_audio_queue.get()
|
||||||
|
|
||||||
|
# 文字起こしを再開
|
||||||
|
# if isinstance(self.mic_print_transcript, threadFnc):
|
||||||
|
# self.mic_print_transcript.resume()
|
||||||
|
|
||||||
|
# 音声のレコードを再開
|
||||||
|
if isinstance(self.mic_audio_recorder, SelectedMicEnergyAndAudioRecorder):
|
||||||
|
self.mic_audio_recorder.resume()
|
||||||
|
|
||||||
|
def pauseMicTranscript(self):
|
||||||
|
# 文字起こしを一時停止
|
||||||
|
# if isinstance(self.mic_print_transcript, threadFnc):
|
||||||
|
# self.mic_print_transcript.pause()
|
||||||
|
|
||||||
|
# 音声のレコードを一時停止
|
||||||
|
if isinstance(self.mic_audio_recorder, SelectedMicEnergyAndAudioRecorder):
|
||||||
|
self.mic_audio_recorder.pause()
|
||||||
|
|
||||||
|
def changeMicTranscriptStatus(self):
|
||||||
|
if config.ENABLE_VRC_MIC_MUTE_SYNC is True:
|
||||||
|
if self.mic_mute_status is True:
|
||||||
|
self.pauseMicTranscript()
|
||||||
|
elif self.mic_mute_status is False:
|
||||||
|
self.resumeMicTranscript()
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
self.resumeMicTranscript()
|
||||||
|
|
||||||
def stopMicTranscript(self):
|
def stopMicTranscript(self):
|
||||||
if isinstance(self.mic_print_transcript, threadFnc):
|
if isinstance(self.mic_print_transcript, threadFnc):
|
||||||
self.mic_print_transcript.stop()
|
self.mic_print_transcript.stop()
|
||||||
@@ -493,7 +558,7 @@ class Model:
|
|||||||
record_timeout=record_timeout,
|
record_timeout=record_timeout,
|
||||||
)
|
)
|
||||||
# self.speaker_audio_recorder.recordIntoQueue(speaker_audio_queue, speaker_energy_queue)
|
# self.speaker_audio_recorder.recordIntoQueue(speaker_audio_queue, speaker_energy_queue)
|
||||||
self.speaker_audio_recorder.recordIntoQueue(speaker_audio_queue ,None)
|
self.speaker_audio_recorder.recordIntoQueue(speaker_audio_queue, None)
|
||||||
self.speaker_transcriber = AudioTranscriber(
|
self.speaker_transcriber = AudioTranscriber(
|
||||||
speaker=True,
|
speaker=True,
|
||||||
source=self.speaker_audio_recorder.source,
|
source=self.speaker_audio_recorder.source,
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
from time import sleep
|
from time import sleep
|
||||||
import threading
|
|
||||||
from pythonosc import osc_message_builder
|
from pythonosc import osc_message_builder
|
||||||
from pythonosc import udp_client
|
from pythonosc import udp_client
|
||||||
from pythonosc import dispatcher
|
from pythonosc import dispatcher
|
||||||
from pythonosc import osc_server
|
from pythonosc import osc_server
|
||||||
from tinyoscquery.queryservice import OSCQueryService
|
from tinyoscquery.queryservice import OSCQueryService
|
||||||
|
from tinyoscquery.query import OSCQueryBrowser, OSCQueryClient
|
||||||
from tinyoscquery.utility import get_open_udp_port, get_open_tcp_port
|
from tinyoscquery.utility import get_open_udp_port, get_open_tcp_port
|
||||||
|
|
||||||
# send OSC message typing
|
# send OSC message typing
|
||||||
@@ -48,6 +48,19 @@ def sendChangeVoice(ip_address="127.0.0.1", port=9000):
|
|||||||
sendInputVoice(flag=0, ip_address=ip_address, port=port)
|
sendInputVoice(flag=0, ip_address=ip_address, port=port)
|
||||||
sleep(0.05)
|
sleep(0.05)
|
||||||
|
|
||||||
|
def getOSCParameterValue(address, server_name="VRChat-Client"):
|
||||||
|
value = None
|
||||||
|
try:
|
||||||
|
browser = OSCQueryBrowser()
|
||||||
|
sleep(1)
|
||||||
|
service = browser.find_service_by_name(server_name)
|
||||||
|
if service is not None:
|
||||||
|
oscq = OSCQueryClient(service)
|
||||||
|
mute_self_node = oscq.query_node(address)
|
||||||
|
value = mute_self_node.value[0]
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
return value
|
||||||
|
|
||||||
def receiveOscParameters(dict_filter_and_target, ip_address="127.0.0.1", title="VRCT"):
|
def receiveOscParameters(dict_filter_and_target, ip_address="127.0.0.1", title="VRCT"):
|
||||||
osc_port = get_open_udp_port()
|
osc_port = get_open_udp_port()
|
||||||
@@ -55,14 +68,14 @@ def receiveOscParameters(dict_filter_and_target, ip_address="127.0.0.1", title="
|
|||||||
osc_dispatcher = dispatcher.Dispatcher()
|
osc_dispatcher = dispatcher.Dispatcher()
|
||||||
for filter, target in dict_filter_and_target.items():
|
for filter, target in dict_filter_and_target.items():
|
||||||
osc_dispatcher.map(filter, target)
|
osc_dispatcher.map(filter, target)
|
||||||
|
|
||||||
osc_udp_server = osc_server.ThreadingOSCUDPServer((ip_address, osc_port), osc_dispatcher)
|
osc_udp_server = osc_server.ThreadingOSCUDPServer((ip_address, osc_port), osc_dispatcher)
|
||||||
threading.Thread(target=osc_udp_server.serve_forever, daemon = True).start()
|
|
||||||
|
|
||||||
osc_client = OSCQueryService(title, http_port, osc_port)
|
osc_client = OSCQueryService(title, http_port, osc_port)
|
||||||
for filter, target in dict_filter_and_target.items():
|
for filter, target in dict_filter_and_target.items():
|
||||||
osc_client.advertise_endpoint(filter)
|
osc_client.advertise_endpoint(filter)
|
||||||
|
|
||||||
|
osc_udp_server.serve_forever()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
osc_parameter_prefix = "/avatar/parameters/"
|
osc_parameter_prefix = "/avatar/parameters/"
|
||||||
osc_avatar_change_path = "/avatar/change"
|
osc_avatar_change_path = "/avatar/change"
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class BaseRecorder:
|
|||||||
def record_callback(_, audio):
|
def record_callback(_, audio):
|
||||||
audio_queue.put((audio.get_raw_data(), datetime.now()))
|
audio_queue.put((audio.get_raw_data(), datetime.now()))
|
||||||
|
|
||||||
self.stop = self.recorder.listen_in_background(self.source, record_callback, phrase_time_limit=self.record_timeout)
|
self.stop, self.pause, self.resume = self.recorder.listen_in_background(self.source, record_callback, phrase_time_limit=self.record_timeout)
|
||||||
|
|
||||||
class SelectedMicRecorder(BaseRecorder):
|
class SelectedMicRecorder(BaseRecorder):
|
||||||
def __init__(self, device, energy_threshold, dynamic_energy_threshold, record_timeout):
|
def __init__(self, device, energy_threshold, dynamic_energy_threshold, record_timeout):
|
||||||
@@ -68,7 +68,7 @@ class BaseEnergyRecorder:
|
|||||||
def recordCallback(_, energy):
|
def recordCallback(_, energy):
|
||||||
energy_queue.put(energy)
|
energy_queue.put(energy)
|
||||||
|
|
||||||
self.stop = self.recorder.listen_energy_in_background(self.source, recordCallback)
|
self.stop, self.pause, self.resume = self.recorder.listen_energy_in_background(self.source, recordCallback)
|
||||||
|
|
||||||
class SelectedMicEnergyRecorder(BaseEnergyRecorder):
|
class SelectedMicEnergyRecorder(BaseEnergyRecorder):
|
||||||
def __init__(self, device):
|
def __init__(self, device):
|
||||||
@@ -107,17 +107,18 @@ class BaseEnergyAndAudioRecorder:
|
|||||||
with self.source:
|
with self.source:
|
||||||
self.recorder.adjust_for_ambient_noise(self.source)
|
self.recorder.adjust_for_ambient_noise(self.source)
|
||||||
|
|
||||||
def recordIntoQueue(self, audio_queue, energy_queue):
|
def recordIntoQueue(self, audio_queue, energy_queue=None):
|
||||||
def audioRecordCallback(_, audio):
|
def audioRecordCallback(_, audio):
|
||||||
audio_queue.put((audio.get_raw_data(), datetime.now()))
|
audio_queue.put((audio.get_raw_data(), datetime.now()))
|
||||||
|
|
||||||
def energyRecordCallback(energy):
|
def energyRecordCallback(energy):
|
||||||
energy_queue.put(energy)
|
energy_queue.put(energy)
|
||||||
|
|
||||||
if isinstance(energy_queue, Queue):
|
self.stop, self.pause, self.resume = self.recorder.listen_energy_and_audio_in_background(
|
||||||
self.stop = self.recorder.listen_energy_and_audio_in_background(self.source, audioRecordCallback, phrase_time_limit=self.record_timeout, callback_energy=energyRecordCallback)
|
source=self.source,
|
||||||
else:
|
callback=audioRecordCallback,
|
||||||
self.stop = self.recorder.listen_energy_and_audio_in_background(self.source, audioRecordCallback, phrase_time_limit=self.record_timeout)
|
phrase_time_limit=self.record_timeout,
|
||||||
|
callback_energy=energyRecordCallback if energy_queue is not None else None)
|
||||||
|
|
||||||
class SelectedMicEnergyAndAudioRecorder(BaseEnergyAndAudioRecorder):
|
class SelectedMicEnergyAndAudioRecorder(BaseEnergyAndAudioRecorder):
|
||||||
def __init__(self, device, energy_threshold, dynamic_energy_threshold, record_timeout):
|
def __init__(self, device, energy_threshold, dynamic_energy_threshold, record_timeout):
|
||||||
|
|||||||
7
view.py
7
view.py
@@ -519,6 +519,12 @@ class View():
|
|||||||
VAR_ENABLE_AUTO_EXPORT_MESSAGE_LOGS=BooleanVar(value=config.ENABLE_LOGGER),
|
VAR_ENABLE_AUTO_EXPORT_MESSAGE_LOGS=BooleanVar(value=config.ENABLE_LOGGER),
|
||||||
|
|
||||||
|
|
||||||
|
VAR_LABEL_ENABLE_VRC_MIC_MUTE_SYNC=StringVar(value=i18n.t("config_window.vrc_mic_mute_sync.label")),
|
||||||
|
VAR_DESC_ENABLE_VRC_MIC_MUTE_SYNC=StringVar(value=i18n.t("config_window.vrc_mic_mute_sync.desc")),
|
||||||
|
CALLBACK_SET_ENABLE_VRC_MIC_MUTE_SYNC=None,
|
||||||
|
VAR_ENABLE_VRC_MIC_MUTE_SYNC=BooleanVar(value=config.ENABLE_VRC_MIC_MUTE_SYNC),
|
||||||
|
|
||||||
|
|
||||||
VAR_LABEL_ENABLE_SEND_MESSAGE_TO_VRC=StringVar(value=i18n.t("config_window.send_message_to_vrc.label")),
|
VAR_LABEL_ENABLE_SEND_MESSAGE_TO_VRC=StringVar(value=i18n.t("config_window.send_message_to_vrc.label")),
|
||||||
VAR_DESC_ENABLE_SEND_MESSAGE_TO_VRC=StringVar(value=i18n.t("config_window.send_message_to_vrc.desc")),
|
VAR_DESC_ENABLE_SEND_MESSAGE_TO_VRC=StringVar(value=i18n.t("config_window.send_message_to_vrc.desc")),
|
||||||
CALLBACK_SET_ENABLE_SEND_MESSAGE_TO_VRC=None,
|
CALLBACK_SET_ENABLE_SEND_MESSAGE_TO_VRC=None,
|
||||||
@@ -770,6 +776,7 @@ class View():
|
|||||||
self.view_variable.CALLBACK_SET_ENABLE_NOTICE_XSOVERLAY=config_window_registers.get("callback_set_enable_notice_xsoverlay", None)
|
self.view_variable.CALLBACK_SET_ENABLE_NOTICE_XSOVERLAY=config_window_registers.get("callback_set_enable_notice_xsoverlay", None)
|
||||||
self.view_variable.CALLBACK_SET_ENABLE_AUTO_EXPORT_MESSAGE_LOGS=config_window_registers.get("callback_set_enable_auto_export_message_logs", None)
|
self.view_variable.CALLBACK_SET_ENABLE_AUTO_EXPORT_MESSAGE_LOGS=config_window_registers.get("callback_set_enable_auto_export_message_logs", None)
|
||||||
|
|
||||||
|
self.view_variable.CALLBACK_SET_ENABLE_VRC_MIC_MUTE_SYNC=config_window_registers.get("callback_set_enable_vrc_mic_mute_sync", None)
|
||||||
self.view_variable.CALLBACK_SET_ENABLE_SEND_MESSAGE_TO_VRC=config_window_registers.get("callback_set_enable_send_message_to_vrc", None)
|
self.view_variable.CALLBACK_SET_ENABLE_SEND_MESSAGE_TO_VRC=config_window_registers.get("callback_set_enable_send_message_to_vrc", None)
|
||||||
|
|
||||||
self.view_variable.CALLBACK_SET_SEND_MESSAGE_FORMAT=config_window_registers.get("callback_set_send_message_format", None)
|
self.view_variable.CALLBACK_SET_SEND_MESSAGE_FORMAT=config_window_registers.get("callback_set_send_message_format", None)
|
||||||
|
|||||||
@@ -25,6 +25,9 @@ def createSettingBox_Others(setting_box_wrapper, config_window, settings, view_v
|
|||||||
def buttonAutoExportMessageLogsCallback():
|
def buttonAutoExportMessageLogsCallback():
|
||||||
callFunctionIfCallable(view_variable.CALLBACK_OPEN_FILEPATH_LOGS)
|
callFunctionIfCallable(view_variable.CALLBACK_OPEN_FILEPATH_LOGS)
|
||||||
|
|
||||||
|
def checkboxVrcMuteSyncCallback(checkbox_box_widget):
|
||||||
|
callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_VRC_MIC_MUTE_SYNC, checkbox_box_widget.get())
|
||||||
|
|
||||||
def checkboxEnableSendMessageToVrcCallback(checkbox_box_widget):
|
def checkboxEnableSendMessageToVrcCallback(checkbox_box_widget):
|
||||||
callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_SEND_MESSAGE_TO_VRC, checkbox_box_widget.get())
|
callFunctionIfCallable(view_variable.CALLBACK_SET_ENABLE_SEND_MESSAGE_TO_VRC, checkbox_box_widget.get())
|
||||||
|
|
||||||
@@ -74,6 +77,17 @@ def createSettingBox_Others(setting_box_wrapper, config_window, settings, view_v
|
|||||||
row+=1
|
row+=1
|
||||||
|
|
||||||
|
|
||||||
|
config_window.sb__vrc_mic_mute_sync = createSettingBoxCheckbox(
|
||||||
|
for_var_label_text=view_variable.VAR_LABEL_ENABLE_VRC_MIC_MUTE_SYNC,
|
||||||
|
for_var_desc_text=view_variable.VAR_DESC_ENABLE_VRC_MIC_MUTE_SYNC,
|
||||||
|
checkbox_attr_name="sb__checkbox_vrc_mic_mute_sync",
|
||||||
|
command=lambda: checkboxVrcMuteSyncCallback(config_window.sb__checkbox_vrc_mic_mute_sync),
|
||||||
|
variable=view_variable.VAR_ENABLE_VRC_MIC_MUTE_SYNC,
|
||||||
|
)
|
||||||
|
config_window.sb__vrc_mic_mute_sync.grid(row=row)
|
||||||
|
row+=1
|
||||||
|
|
||||||
|
|
||||||
config_window.sb__enable_send_message_to_vrc = createSettingBoxCheckbox(
|
config_window.sb__enable_send_message_to_vrc = createSettingBoxCheckbox(
|
||||||
for_var_label_text=view_variable.VAR_LABEL_ENABLE_SEND_MESSAGE_TO_VRC,
|
for_var_label_text=view_variable.VAR_LABEL_ENABLE_SEND_MESSAGE_TO_VRC,
|
||||||
for_var_desc_text=view_variable.VAR_DESC_ENABLE_SEND_MESSAGE_TO_VRC,
|
for_var_desc_text=view_variable.VAR_DESC_ENABLE_SEND_MESSAGE_TO_VRC,
|
||||||
|
|||||||
Reference in New Issue
Block a user