728x90
반응형

프랑스-한국 역사연대기.xlsx
0.04MB

한국과 프랑스의 역사를 시대(시간/연대)별로 정리( 첨부파일 참조)

 

내용 형식 (앞 부분 일부)

728x90
반응형
728x90
반응형

원본 URL :

VoiceFilter-Lite: Streaming Targeted Voice Separation for On-Device Speech Recognition (google.github.io)

요약

- VoiceFilter-Lite( 이미지필터링, 주파수 필터링 처럼 특정 보이스만 필터링 후에 남기고자하는 모듈이며, 저사양 CPU환경에서도 수행되도록)

- Single-channel source separation(즉 단일 마이크, 휴내폰처럼)

- Preserve only the speech signals from a target user

( 칵테일파티 문제처럼, 여러 화자가 동시에 발성할 경우에 특정 한 화자의 음성만 음성인식기에 전달한다. 단, 목적화자의 발성은 미리 등록되어 있어야 한다.)

- as part of a streaming speech recognition system

( 음성인식엔진과 별개 모듈이다. 즉 단독으로 전처리하는 모듈이다. 인식엔진과 동시에 딥러닝모델링할 수도 있지만, 사용자(target user)가 없는 경우 즉, 등록을 하지 않을 경우가 있기 때문에, 별개 단독모듈로, 스크리밍방식이므로 실시간적 처리를 강조함. 즉 녹음을 다 받거나 미리 녹음된 음성데이터에 대한 처리가 아니다.)

- It should improve the performance when the input signal consistsof overlapped speech( 동시 발성이 있는 음성입력에 대한 성능은 물론 향상시킬 수 있어야 하며)

- and must not hurt the speech recognition performance under all other acoustic conditions.( 동시발성이 없거나, 잡음 요소가 없는 환경에서도 그 성능이 보존 또는 향상되어야 한다.)

(새로운 loss function과 supression을 조절하는 것을 제안 적ㅇㅇ용함)

- This model must be tiny, fast and performance in a streaming fashion( full precion에 비해 큰 성능저하 없이 8bit 정수형으로 처리하여, 모델 용량 및 수행 속도를 향상시킴.)

Result

- 동시발성이 있는 데이터에 대해, WER를 상대적으로 50%를 줄인다.(절대수치로는 약 25%p)

- Clean(잡음이 없는) 데이터에 대해, 성능 저하를 유발시키지 않는다.

개인의견

- 성능은 시장에서 원하는 동시발성이 있는 상황에서도 클린 환경만큼의 성능에는 좀 더 R&D가 진행되어야..(후속 연구결과는 나올 것으로 기대함)

- 다중 마이크 어레이를 쓰지 않아서, 디바이스 환경 구축에 용이.

- 화자인식이나 화자별 음성데이터 분리에 사용되는 특징벡터를 활용.

- 필터뱅크의 특징벡터에 대해, 필터링 적용.( 이미 등록된 화자의 특성만 남김.)

- 카페나 회의에서, 인간은 특정 사람의 목소리에 집중할 수 있는데, 이러한 특성에 상당히 접근한 기술로 여겨짐.

728x90
반응형
728x90
반응형

참조한 자료들

 

영어자료(외국)

https://www.youtube.com/watch?v=hS42xD3O55E Unsupervised Speech Recognition(Wav2Vec-U) 2021.5.23

https://www.youtube.com/watch?v=XkUVOijzAt8 Wav2Vec: Unsupervised pre-training for speech recognition, 2019.7.6

https://www.youtube.com/watch?v=aUSXvoWfy3w wav2vec 2.0: A Framework for Self-Supervised Learning of Speech Representations. 2020.06.25

https://www.youtube.com/watch?v=C4UQWJcp7w4 [CVPR 2020 Tutorial] Talk #5 Self-supervised Learning by Licheng Yu, Yen-Chun Chen and Linjie Li, 2020.06.17

https://github.com/ShigekiKarita/espnet-semi-supervised , 2018-2019, InterSpeech 2018, PyTorch...

https://www.youtube.com/watch?v=8Kpowre6yyk wav2vec 2.0 | Lecture 76 (Part 3) | Applied Deep Learning, 2021.05.07

 

국내자료(한국)

https://www.youtube.com/watch?v=Z1lSukzyA0E [Paper Review] Semi-Supervised Learning in Auto Speech Recognition, KU, 2021.07.07

http://dsba.korea.ac.kr/review/?mod=document&uid=1408 2020 NIPS 후기, DSBA, Korea University. 2020.12.31

https://github.com/kakaobrain/pororo/issues/54 kakaobrain, wav2vec 2.0 한국어 실험환경....

https://ichi.pro/ko/eumhyang-deiteo-sajeon-gyoyuggwa-gat-eun-eon-eo-model-270503402471882 음향데이터 사전 교육과 같은 언어모델

 

LM Pretained Model == Contextual Word-Embeddeing...

Word-Embedding :: 유사한 의미를 가진 단어가 유사한 표현을 갖도록하는 일종의 표현,

비지도 / 자기 감독 표현 학습

 

 

Wav2Vec 활용분야 :: 음성인식, 오디오 분할, 이상한 음향 감지

 

Fairseq에는 wav2vec, vq-wav2vec, wav2vec 2.0의 예시적인 구현이 있습니다.

 

728x90
반응형
728x90
반응형

1. 목적

특정 프로그램 서비스를 구동할 때, root 계정으로 수행시 해당 로그파일도 root계정으로 생성됨.

유지보수 측면에서 로그파일 점검은 root계정을 부여하지 않는 낮은 권한의 계정으로 분석을 수행함.

이에, 로그로테이션 로그파일에 대해 특정계정으로 로그파일을 생성함.

 

2. 설명

- RotatingFileHandler함수를 상속하여야 함. ( TimedRoatingFileHandler 아님.)

- shouldRollover()를 overriding하여야 함.

- 날마다 또는 시/분 등으로 로그파일을 rotation시키고자 할 경우, 그 단위를 직접 구현하여야 함.(파일명)::getBaseFileName()참조

- 변경된 파일명을 부모 클래스인 RotatingFIleHandler()에게 넘김.

- Ownership변경은 파일명이 생성될 때, shell util 함수를 사용하여 변경한다.

- 아래 포스팅된 코드는 시분 단위로 구현하여, 짧은 시간에 점검이 가능함. ( 필요시, 날마다로 변경 가능)

- 구현단계에서 고민하였던 코드는 주석처리하여 보존함.

- TimedRoatingFile에 대한 callback을 처리하는 것은 동작하지 않는 것으로 파악됨.

3. 참조

본 포스팅은 https://www.py4u.net/discuss/193456 를 참조로 하였음.

추가적으로 구현하여, 상기 포스팅 자료와 달리, 전체 프로그램을 단독으로 수행가능함.(핸들러 지정/연결 등)

파일모드로 로그환경변수를 지정하는 대신에, dictionary형태로 지정함.

 

```​

from logging import handlers

import logging

import logging.config

import datetime

import time

import os

import shutil

class DailyRotatingFileHandler(handlers.RotatingFileHandler):

def __init__( self, alias, basedir, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0 ):

#def __init__( self, alias, basedir, filename, when='h', interval=1, backupCount=0, encoding=None, delay=0, utc=0, atTime=None, errors=None):

self.basedir_ = basedir

self.alias_ = alias

self.baseFilename = self.getBaseFileName()

print("baseFileName = %s\n" % self.baseFilename )

handlers.RotatingFileHandler.__init__(self, self.baseFilename, mode, maxBytes, backupCount, encoding, delay )

#handlers.TimedRotatingFileHandler.__init__(self, self.baseFilename, when='m', interval=1 )

 

def getBaseFileName(self):

#self.today_ = datetime.date.today()

#basename_ = self.today_.strftime("%Y-%m-%d") + ".log" + '.' + self.alias_

self.today_ = datetime.date.today()

tm = time.localtime()

self.hour_ = str( tm.tm_hour )

self.minute_ = '%02d' % tm.tm_min

basename_ = self.today_.strftime("%Y-%m-%d") + "_" + self.hour_ + "_" + self.minute_ + ".log"

filename = os.path.join(self.basedir_, basename_)

'''

Change owner

'''

#if not os.path.exists(filename):

# open(filename, 'a').close()

#group = 'klaud'

#shutil.chown(filename, group, group)

 

return filename

 

def shouldRollover(self, record):

print("#### in the shouldRollover() ####")

#print(record);

 

if self.stream is None:

print("#### file.open() ####")

self.stream = self._open()

#if self.maxBytes > 0:

# msg = "%s\n" % self.format(record)

# self.stream.seek(0, 2)

# if( self.stream.tell() + len(msg)) >= self.maxBytes:

# return 1

 

#if self.today_ != datetime.date.today():

# self.baseFilename = self.getBaseFileName()

# return 1

tm = time.localtime()

if self.minute_ != str( tm.tm_min ):

self.baseFilename = self.getBaseFileName()

return 1

 

return 0

 

 

if __name__ == '__main__':

config ={

"version": 1,

"formatters": {

"simple": {"format": "[%(name)s] %(message)s"},

"complex": {

"format": "%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] - %(message)s"

},

},

"handlers": {

"console": {

"class": "logging.StreamHandler",

"formatter": "simple",

"level": "INFO",

},

"file": {

#"class": "logging.FileHandler",

#"filename": "error.log",

#"formatter": "complex",

#"level": "ERROR",

#'()': owned_file_handler,

#'owner': ['klaud', 'klaud'],

'level': 'INFO',

#'class': 'logging.handlers.TimedRotatingFileHandler',

#'class': 'TimedRotatingFileHandler',

'class' : 'logging.handlers.RotatingFileHandler',

#'when': 'M',

#'backupCount': 8,

#'filename': f'/home/klaud/logs/aaa.log',

'filename': f'timed_test_kkkk.log',

 

},

},

"root": {"handlers": ["console", "file"], "level": "INFO"},

"loggers": {"parent": {"level": "INFO"}, "parent.child": {"level": "DEBUG"},},

}

 

 

log_file = "timed_test.log"

#logging.config.fileConfig('logging.conf')

logging.config.dictConfig(config)

logger = logging.getLogger("root")

#logger = logging.getLogger("sLogger")

logger.setLevel(logging.INFO)

#create_timed_rotation_log(log_file)

#print("## Calling : owned_file_handler")

#handler = owned_file_handler(log_file, "klaud", when='m',

# interval=1

# );

#handler = TimedRotatingFileHandler( path,

# when="m",

# interval=1,

# backupCount=5)

handler = DailyRotatingFileHandler("alias", "./")

logger.addHandler(handler)

for i in range(6):

#logger.info("[%s]This is a test!", datetime.datetime.now().strftime("%H:%M:%S") )

logger.info("This is a test!" )

time.sleep(65)

 

```

수행 결과 예시

[root@localhost sahngwoon]# ls -al

합계 76

drwxr-xr-x 6 root root 4096 11월 23 11:21 .

drwxr-xr-x. 5 root root 4096 11월 22 16:40 ..

-rw-r--r-- 1 klaud klaud 16 11월 23 11:15 2021-11-23_11_15.log

-rw-r--r-- 1 klaud klaud 16 11월 23 11:17 2021-11-23_11_17.log

-rw-r--r-- 1 klaud klaud 16 11월 23 11:18 2021-11-23_11_18.log

-rw-r--r-- 1 klaud klaud 16 11월 23 11:19 2021-11-23_11_19.log

-rw-r--r-- 1 klaud klaud 16 11월 23 11:20 2021-11-23_11_20.log

-rw-r--r-- 1 klaud klaud 16 11월 23 11:21 2021-11-23_11_21.log

-rw-r--r-- 1 root root 267 11월 16 13:23 ReverseString.java

 

728x90
반응형

+ Recent posts