드디어 모니위키 속도가 300RPS의 벽을 깼다.

불필요한 초기화 부분 한 줄 제거했는데 이렇게 나옴;; https://github.com/wkpark/moniwiki/commit/bc662afdc2268e86154da8a6abfe61c0a93432c8 참조

아래는 nginx + php-fpm + eaccelerator를 설정하고 모니위키 1.2.0 개발판 테스트해본 결과.

아파치를 쓰더라도 거의 비슷하지만 nginx + php-fpm의 경우가 좀 더 빠른 듯.


아래는 몇 번을 반복했을 때 가장 높은 측정값이 나온 경우.

$ ab -c 5 -n 300 http://localhost:8800/moniwiki/wiki.php?FrontPage
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Finished 300 requests


Server Software:        nginx/0.8.54
Server Hostname:        localhost
Server Port:            8800

Document Path:          /moniwiki/wiki.php?FrontPage
Document Length:        30134 bytes

Concurrency Level:      5
Time taken for tests:   0.778 seconds
Complete requests:      300
Failed requests:        0
Write errors:           0
Total transferred:      9088800 bytes
HTML transferred:       9040200 bytes
Requests per second:    385.65 [#/sec] (mean)
Time per request:       12.965 [ms] (mean)
Time per request:       2.593 [ms] (mean, across all concurrent requests)
Transfer rate:          11409.94 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   1.2      0      16
Processing:     5   13   4.7     12      43
Waiting:        0   12   4.7     11      43
Total:          5   13   4.9     12      44

Percentage of the requests served within a certain time (ms)
  50%     12
  66%     13
  75%     14
  80%     15
  90%     18
  95%     22
  98%     27
  99%     29
 100%     44 (longest request)

config.php의 설정값

$trail=0; // trail 끔
$cachetime=60*60*24; // 캐시 설정

by dumpcookie 2013. 5. 21. 08:56

최근에 엔하위키 속도 문제에 관련되어서 모니위키를 업데이트하게 되었고,

관련 작업이 모니위키 개발자 버전에 반영되었으며, 차일 피일 미루던 모니위키 1.2.0 릴리스 준비를 하고 있습니다.


엔하위키가 느린 점에 대해서 말들이 많았는데,

현재 엔하위키에는 간단한 몇가지 속도 패치가 적용된 상태입니다.

- 페이지 캐싱 활성화 - 모니위키 1.1.3부터 지원하였던 이 기능을 비로소 최근에 활성화 시켰습니다.

- 모니위키 1.1.5부터 지원했던 랜덤 페이지 전용 페이지 목록 인덱싱 기능을 활성화 시켰습니다.

- 기타 페이지 목록이 빈번하게 갱신되던 문제를 해결한 패치를 적용시켰습니다.



현재 엔하위키는 그나마 예전보다는 나은 속도를 내고 있습니다만 여전히 다음과 같은 문제가 있습니다.


1. 전체 페이지 리스트가 여전히 빈번하게 갱신되고 있다.

  - 현재 랜덤페이지에 의해서 사용되는 전체 페이지 목록을 가져오는 부분이 문제가 있는 듯 여전히 전체 페이지 목록이 자주 갱신되고 있습니다.

  - 이 문제는 패치 자체 버그로 보입니다. 그러나 예전보다 크기가 작고 빠른 속도로 갱신이 되어서 큰 문제를 느끼지 못하고 있는 듯.


2. 검색 - 역링크 / 제목검색 / 본문검색 포함

  - 현재 DBA 인덱서 패치가 추가로 엔하위키에 적용된 상태이지만 몇가지 문제로 사용되지 않고 있습니다.

  - DBA 인덱서를 적용한다 하더라도 역링크 및 제목검색은 상당히 빠르지만 본문검색은 적게는 수초가 걸리고 그 이상으로 느린 경우도 있습니다.

  - 인덱서 패치를 적용했는데 오히려 제목 목차가 느려졌습니다. (효율적이지 않은 제목 인덱싱)



이러한 문제를 해결하기 위해서

1. DBA를 사용한 본문/제목/링크 등등의 인덱싱 처리를 일차적으로 최적화 과정에서 배제시켰습니다.

2. 본문 검색보다는 제목 검색에 초점을 두었습니다. 본문 검색은 외부 검색엔진을 도입하는 것이 여러모로 나을 것으로 생각되며,

3. 전체 페이지 목록을 갱신하는 부분을 모듈화하고, 일단 매우 간단한 구현을 하였습니다. (기존의 페이지 목록 인덱서 개량)

4. 페이지 내용 검색(Fulltext search) 및 이와 관련된 느린 검색에 대해서 일단 시간 제한 혹은 개수 제한을 걸고 페이징 처리를 하도록 하였습니다.


이렇게 방향을 변경하고 다음의 작업이 진행되었습니다.

1. 전체 페이지 목록을 한꺼번에 갱신할 필요가 아예 없게 만들었습니다.

 - 랜덤 페이지 이외에 전체 페이지목록이 필요한 부분에 대해서 통합하고

 - 느린 전체 페이지 갱신을 아예 할 필요가 없게 만들었습니다. (페이지 추가/제거/이름 변경시에 전체 리스트를 업데이트만 함)

 - 이는 기존의 페이지이름 인덱서를 업데이트한 것입니다.


2. 역링크는 이제 검색이 아닙니다.

 - 역링크를 검색기능이 아니게 되었습니다.

  (그런데 모니위키의 역링크는 그 구현상 원래부터 검색이 아니였습니다 ^^;; 이번에 버그를 잡았습니다.)

 - 역링크는 페이지가 만들어지거나 갱신될 때에 즉각적으로 아주 빠르게 갱신됩니다.

 - 실제로 역링크를 사용시에는 그냥 역링크 정보를 가져오기만 합니다.


3. 페이지 이름검색이 빨라지고 유연해졌습니다.

 - 공백이 들어있거나 공백이 아예 없거나, 특수문자가 일부 들어간다고 해도 잘 찾아냅니다.

 - 특별히 이름 검색에 대해서 인덱싱 처리하거나 하지 않는데도 20만 페이지 규모에서도 매우 빠릅니다.


4. 본문 검색에 시간 제한을 걸고, 페이징처리를 하였습니다.

 - 일단 본문검색에 대해서 이러한 방식으로 처리하여 서버에 줄 수 있는 부담을 최소화했습니다.



일단 이러한 일련의 대규모 위키사이트에 대한 작업은 모니위키 1.2.0 개발자 버전에 대해서 진행중입니다.



참고적으로 로컬로 측정한 아파치 벤치마크 값입니다.

- 모니위키의 경우 19만 페이지가 있습니다. / 도쿠위키는 전체 10페이지 미만.

- 페이지는 단순한 HelpContents 페이지를 기준으로 삼았습니다. (static html은 그 랜더링된 결과)

- ab -c 2 -n 500을 기준으로 했습니다. (단순 측정값입니다.)

- 서버사양 AMD dual core 5200 / 2GB 램


static html의 경우 ~1000RPS

모니위키 1.2.0 개발판의 경우 ~300RPS (eaccelerator + 내장 캐시 사용)

모니위키 1.1.5 구버전의 경우 ~220RPS (eaccelerator + 내장 캐시)

도쿠위키 2012-10-13일 판 ~120RPS (eaccelerator + 내장 캐시 사용)

(미디어위키는 기본 설치 설정으로는 너무 느려서 논외.)



모니위키 1.2.0 최신 개발자 버전 맛보기 (임시적으로 엔하위키 19만 페이지가 읽기 전용으로 되어있음)

http://moniwiki.kldp.net/moniwiki/wiki.php


및 모니위키 github 사이트

https://github.com/wkpark/moniwiki


http://moniwiki.kldp.net/wiki.php/MoniWikiFeatures/1.2.0 그밖에 모니위키에 포함될 새로운 기능들

by dumpcookie 2013. 5. 18. 18:31

XE 게시판과 위키를 연동하는 경우

위키 링크라던지 위키에 관련된 기능이 게시판에도 필요한 경우가 종종 있습니다.

([[위키백과]]같은 위키 링크)


이 애드온은 위키의 링크를 손쉽게 연결시켜 주는 xe 게시판용 애드온입니다



이와 관련된 기능은 xe 사이트의 애드온을 찾아보면 이미 있습니다. (wikilink로 검색하면 몇 개 나옴)


여기서 소개하는 애드온은 위키네임을 링크시켜주는 기능 말고도 모니위키에서 지원하는 일부 기능인 URL을 고쳐주는 기능이 같이 들어있습니다.


예를 들어서 http://rigvedawiki.org/r1/wiki/FrontPage 같은 식으로 예전 링크가 있다면 이것을 rigvedawiki.net으로 고쳐서 자동으로 보여줍니다.


급조한 것이지만 xe 1.7에서 아무런 문제없이 동작하는 것을 확인하였습니다~

1.5에서도 문제없이 될 것으로 생각됩니다.


아직 urlmapping은 xe 사이트에 정식등록한 상태가 아닙니다.


urlmapping 애드온은 위키 관련된 링크를 고쳐주거나 하는 애드온이므로 이것과 관련된 기능 제안을 환영합니다~


TODO

- 인터위키 연결 지원 외


스크린샷 (관리자 메뉴)



다운로드


urlmapping-0.1.tar.gz


by dumpcookie 2013. 5. 10. 15:22

어나니머스의 우리민족끼리 해킹으로 소란스럽습니다. 관련 링크를 한번 모아보았습니다.

1차 공개

2차 공개


1차 공개된 회원 리스트 포맷은 다음과 같습니다. 맨 상단의 몇줄만 여기에 써보면 다음과 같습니다.

userID,sex,name,email,birth,country,signDate,password
adminkus,M,관리자,urimanager@xxxxxxxx.com,19771224,8,20040414,9db81750e9058a339f3dbee7f4a19390 (kusxxxxx)
1234567890,M,아침,133@q.com,19720103,8,1088641164,827ccb0eea8a706c4c34a16891f84e7b (12345)
sgxxxx,M,ㅅㄱㅎ,jshxxxxxxx@hotmail.com,19790812,9,1087541426,3eeec6e35b8d779ce5caebc70c6be89b

맨 첫번째로 공개된 사용자가 관리자!! 생년월일과 signDate 그리고 비밀번호에 해당 비밀번호를 크랙한 비밀번호까지 나옵니다 -_-;; (엉터리 이메일 주소는 그대로 두고, 의미 있는 듯한 이메일주소는 지웁니다)

그런데 두번째 라인의 사용자 ID는 "1234567890"이라는 엉터리 아이디에 메일 주소또안 133@q.com과 같은 엉터리 이메일 주소, 비밀번호도 "12345"라고 되어있어 이 사용자는 "가짜 사용자"라는 것을 보여주고 있습니다.

여기서 잠깐. signDate는 무엇을 의미할까요?

세번째 사용자의 비밀번호는 크랙이 되지 않아있고 실명일 가능성이 있는데 (이메일 및 아이디는 x로 처리했습니다.) 세번째 사용자의 signDate는 1087541426이며, 이 값은 unix timestamp로서 "Fri, 18 Jun 2004 06:50:26 GMT" 입니다. 2004년도에 등록을 했다는 뜻 같습니다.

엉터리 이메일주소의 가짜 회원들

그런데 쭈욱 보다보니 다음과 같은 엉터리도 많습니다.

kooma77,M,원빈,ljlfajglajk@dfklghsdflajgkal.com,20001010,9,1088912541,398bb4d9a15db2d8bf52b9ca9c8538ee (0601)

kooma77이라고 등록한 이 사용자는 자신의 이름을 "원빈"이라고 해놓고 엉터리 이메일 주소에 생년월일도 2000년10월입니다. (2004년에 사용자 등록을 했는데 생년월일이 2000년..)

이 즈음에서 우리민족끼리의 사용자 관리 수준이 여실히 드러납니다.

이메일이 제대로 된 이메일인지도 확인하지 않고 있는 것입니다. 또한 사용자 등록을 한 사용자가 진짜 본인인지, 아니면 이름과 이메일 주소를 도용한 사람인지를 전혀 분간하지 못하고 있다는 사실도 아주 쉽게 알 수 있습니다.

이정도 수준의 사용자 관리를 하고있는 사이트를 털어, 그 명단을 공개해서 대체 뭘 얻을 수 있을지 의심이 드는 부분입니다.

중복 사용자

회원 관리가 이정도 수준이니 중복사용자도 금방 보입니다. 다음과 같은 경우는 중복해서 5번이나 가입했습니다. 그것도 엉터리 이메일주소로

pakyu,F,pakunjong,pakuj@.615,19921014,<blank>,1155300029,b45570328dc3d4885b13607b7e6952ff
pakur,F,pakunjong,pakuj@.615,19921014,<blank>,1155300171,b45570328dc3d4885b13607b7e6952ff
kimyu,F,pakunjong,pakuj@.615,19921014,<blank>,1155359081,b45570328dc3d4885b13607b7e6952ff
paksu,F,pakunjong,pakuj@.615,19921014,<blank>,1155367013,b45570328dc3d4885b13607b7e6952ff
gftruygjhg,F,pakunjong,pakuj@.615,19921014,<blank>,1155382803,b45570328dc3d4885b13607b7e6952ff

이정도 수준의 회원 명단을 가지고 떠들썩한게 한심하기도 합니다.

마치며

2차로 공개한 맨 마지막 회원 명단이 인상적입니다

jjh30008,M,Kimpig,Fuckyou@asshole.com,1044444444,201211,2013-03-30 00:00:00,<blank>,1364569200,89e3f0a39209cd42f0db5b8c2a39d3bf


by dumpcookie 2013. 4. 8. 00:03

자바스크립트로 만들어진 한글 입력기가 몇가지 있습니다.

가장 유명한 것이 alee님이 만든 OHI 자바스크립트 한글 입력기이며, 이것 이외에도 몇가지가 더 있습니다.

alee님의 OHI 한글 입력기는 전체 소스 라인이 200줄도 안되는 극한의 크기로 두벌식/세벌식을 모두 지원하고 있으며, 심지어 영문은 QWERTY뿐만 아니라 QWERTZ/AZERTY 자판도 지원하고 있습니다.

그런데 이렇게 극한의 크기로 최적화된 소스이기때문에 그 기능을 추가하는 것이 쉽지 않고, 자판을 다른 조합으로 쉽게 확장하기가 어려운 단점이 있습니다.



그래서 자바스크립트로 구현된 한글 입력기를 새로 작성해보았으며, 오토마타는 새나루 한글입력기를 거의 그대로 가져오고 개선시켰습니다. 그러한 이유로 이 자바스크립트 한글 입력기의 이름을 가칭 새나루(saenaru.js)라고 지었습니다. (alee님의 OHI한글 입력기 소스도 같이 참고하였습니다.)


자바스크립트 새나루 한글입력기의 특징은 다음과 같습니다.

  • 자판을 손쉽게 확장/추가 가능 (외부 자바스크립트 파일 형태로 확장)
  • 현재 두벌식 오토마타만 지원 (종성 조합을 지원하는 두벌식 오토마타)
    • 세벌식 오토마타는 추가 지원 예정입니다.
  • 글자 조합 방식을 확장/추가 가능
  • 단어단위 편집 기능 지원
  • 새나루 혹은 나비 한글 입력기처럼 모음+자음 입력시 교정 기능 (단, 느리게 입력하면 입력 순서대로 입력됨)
    • 예) ㅏ + ㄴ => 나
  • 그밖에 새나루 한글 입력기와 같이 ㅂ+ㄹ을 빠르게 입력하면 ㄼ으로 자동 교정
    • 새나루 한글 입력기보다 더 영리하게 입력 키 조합의 시간 간격을 체크하여 교정할 것인지 말것인지를 판별합니다.

그밖에 다음과 같은 재밌는 기능을 추가/개선해보았습니다.

  • 영문 입력 오류시 => F2키 입력하면 한글로 자동 변환
  • 쉬프트-백스페이스를 누르면 이미 한글로 입력된 음절을 자소단위로 지워줌
  • Firefox 최신 / 크롬 및 IE9에서 테스트 (크롬에서도 Ctrl-Z 잘 지원)

이렇게 만든 새나루 자바스크립트 입력기는 "사용자 조합 방식"을 지원하기때문에 다음과 같은 확장이 가능합니다.

  • ㅏ+ㅏ=>ㅑ 조합 및 ㅑ+ㅏ=>ㅏ 등으로 순환 조합 지원 가능 - 즉, ㅏ 연타가 ㅑ로 입력되고, 한번 더 ㅏ를 입력하면 ㅏ
  • 한손 자판 지원 가능

그밖에 필기인식 기능을 조합해서 한글 필기인식기능을 테스트해볼 생각입니다.


자바스크립트 새나루 한글입력기 소스받기

https://gist.github.com/wkpark/5310769

JSBin에서 테스트해보기

http://jsbin.com/ewizox/6/ (한영 전환키는 Ctrl-space입니다)

by dumpcookie 2013. 4. 4. 23:19

리눅스 머신의 파워를 교체하다가 갑자기 웽~ 하는 팬소리 나더니 멈추고 타는 냄새가 순간적으로 나서 급히 전원을 내리기는 했습니다만, 메인보드가 완전히 맛이 가고 급기야 하드디스크도 인식이 안되게 되버렸습니다 ㅠㅠ



메인보드(아수스 M3A78-EM)는 타는 냄새가 나는 듯 해서 똑같은 모델을 중고로 하나 장만하였고(3만냥)
HDD는 현재 중고장터에서 찾아보고 있는 중입니다

전원을 급히 내렸기 때문에 아마도 HDD의 PCB기판만 나갔을 것으로 생각되어서 관련 정보를 찾아보니,
PCB 기판을 똑같은 것을 구해서 교체하면 복구가 가능할 것 같더군요.
http://www.clien.net/cs2/bbs/board.php?bo_table=lecture&wr_id=61681

이 하드디스크에는 최근의 거의 모든 자료 (옵투 / 옵3D / 프라다의 커널을 비롯한 거의 모든 자료) + 및
최근의 상당수의 작업물이 들어있습니다 -_-;;

HDD의 모델은 다음과 같습니다.

WD3200AAKS WD Caviar SE16
MDL : WD3200AAKS-00VYA0 (A0가 펌웨어 버전이라고 합니다)
DATE: 21 APR 2008 (참고)
DCM: HHRNNTJCAN (참고)




■ 기판에 붙어있는 PCB 모델명 :
2061-701444-700 AD XC 4Z08 2DTE 5 0006380 8386
(굵은 글씨가 일치해야 합니다.)
PWB 2060-701444-004 REV A. (일치해야 합니다)

WD 3200AAKS HDD의 모델을 가지고 계신 분중에 잠자고 있는 HDD를 가지고 계시다면
HDD의 PCB 모델명을 비교해보시고 판매 가능하신 분은 제게 알려주시기 바랍니다~ㅠㅠ
(320GB 하드 중고 시세가 2만5천~3만5천원 정도 하며, 리퍼비시 가격이 5만원 미만(다나와 기준)입니다.)

기타 메모
- PCB 기판을 못찾으면 이곳에 연락해볼 예정입니다: http://music24.kr/xe/hard


04/02 업데이트
- 가지고 있는 WD 400GB 모델(WD4000AAKS-00YGA0)의 기판이 3200 AAKS 기판 모델명과 완전히 일치해서 다음을 테스트해보았습니다.
 - 400GB짜리 기판이 완전히 일치한다는 것은 펌웨어만 다르다는 것을 의미합니다.
 - 관련 정보를 찾아보니, 거의 같은 시기에 나왔던 이 두 하드디스크는 플래터 개수와 펌웨어만 다르고 나머지는 모두 일치하는 듯 합니다.
 - 그래서 400GB의 PCB를 떼어내에 320GB에 장착시키고 부팅해보니 HDD가 돌아갑니다만, 인식이 안됩니다.
 - 이것은 하드디스크의 모터는 문제 없다는 것을 의미하며, PCB만 손상되어있을 가능성이 높다는 것을 의미합니다.

04/03 업데이트
조금 저렴한 업체에 전화로만 문의해본 결과 15만원~20만원 수준의 복구비용으로 초기 진단받았습니다.

04/06 업데이트
약간 낡았지만 비슷한 모델을 중X나라에서 찾았습니다.
- WD의 경우는 PCB버전이 일치하지 않더라 하더라도 간혹 PCB교체 성공한 케이스가 있었습니다. 
  http://forum.hddguru.com/viewtopic.php?t=22696 (WD4000AAKS-00YGA0 성공 케이스)
- 2007년도 제품. 모델명 일치. PWB버전 일치. 2061-701444-700 AA 버전 (AD 버전이 아닌 AA버전)

by dumpcookie 2013. 4. 3. 00:16

마우스로 영문 글자를 써보세요. (스마트폰의 경우는 터치스크린에 손가락으로)

[Your browser can not show this example.]

Zinna를 이용한 영문 필기 인식

Zinna(http://zinnia.sourceforge.net/)는 일본어/한자와 같은 획이 많은 문자를 인식하는데 매우 좋은 필기인식기입니다.

이를 영문 인식에도 써먹기 위해서 Zinnia를 조금 변경하였고, 영문+숫자 입력 모델만 지원합니다.
여기까지가 제가 몇달 전에 PHP School의 Tip&Tech에 올렸던 내용입니다.

참고 http://phpschool.com/link/tipntech/76573

ShortStraw 알고리즘

그리고 난 후에 ShortStraw 알고리즘을 우연히 찾게 되어서 이를 이용하면 필기인식률을 높일 수 있을 것 같아서 테스트중에 있습니다.

ShortStraw 알고리즘은 고안된지 얼마되지 않지만 상당히 단순하고도 명쾌하여 최근에 널리 퍼지게 된 알고리즘이라고 합니다. ShortStarw를 사용하여 제스쳐 인식에 응용하거나 필기인식 알고리즘에 응용할 수 있습니다. 특히 ShortStraw는 직선에 가까운 선은 잘 인식을 하는데, 곡선을 제대로 인식하지 못하는 문제점이 있습니다. 이를 보완한 IStraw도 있는데 이와 관련된 정보는 다음의 문서에서 참고하실 수 있습니다.

IStraw를 참고한 ShortStraw 자바스크립트 개선

그래서 IStarw는 아쉽게 자세한 소스가 공개되어있지 않기때문에 IStraw에 대한 알고리즘을 분석하여 ShortStraw자바스크립트를 약간 개선해보았습니다. [1]번 논문에 있는 다음과 같은 그림이 IStraw에 적용된 곡선 인식 보완책을 설명하고 있습니다.


이 방식을 ShortStraw 자바스크립트에 적용시키니 다음과 같은 식으로 개선이 됩니다.

(아래 이미지는 위의 필기인식 캔버스의 스크린샷)

여기서 붉은 선은 ShortStraw 알고리즘으로 얻어진 선분이며, 검은 점은 IStraw 방식으로 제거되는 점들입니다. 고친 소스에는 몇번의 반복 실험을 통해 얻어진 경험적인 값들이 사용되어졌습니다.

이런식으로 영문 글자의 모서리값을 얻게되면 그 모서리값은 재현성이 높게되며, ShortStraw에 의해 얻어진 모서리 개수의 값을 필기인식의 feture값으로 지정할 수 있을 것입니다. 이 방식을 Zinna에 새로운 feature로 지정해 적용해볼 생각입니다~

by dumpcookie 2013. 3. 23. 10:10

안드로이드는 음성인식(Speech Recognize)기능을 지원하고 있습니다.


그런데 안드로이드에서 지원하는 음성인식이 두가지 방식이라는 사실은 잘 모르시는 분들이 많습니다. 하나는 잘 알려진, 구글 음성인식 검색을 지원하는 음성인식 엔진이며, 다른 하나는 안드로이드 소스에 들어있으며 SpeechRecorder라는 안드로이드 내장 앱 등등에서 쓰이고 있는 Nuance SREC 네이티브 엔진입니다.

안드로이드의 음성인식 엔진은 두가지

구글 음성인식 검색용 엔진은 offline에서는 사용할 수 없었으나 (젤리빈부터 가능), Nuance SREC 엔진은 자체 내장 native 엔진이기때문에 offline에서 사용 가능하다는 장점이 있으며, 아파치 라이선스로 모든 소스가 공개되어 있다는 장점이 있습니다!

최근에 젤리빈에서 지원하기 시작한 오프라인 음성인식 지원은 Nuance SREC을 사용한 오프라인 음성인식이 아닌 것으로 보입니다. (http://forum.xda-developers.com/showthread.php?t=2014946 참조해서 보면 오프라인으로 쓰고자 하는 경우 데이터를 받게끔 되어있습니다. http://www.youtube.com/watch?v=BTARRXP_I24 넥서스 7에서 오프라인 음성인식 사용하기 영상 참조)

반면, 현재 SREC은 영문만 지원하는 단점이 있습니다. (SREC에서 쓰이는 사전도 영문만 있고, grammar도 영문만 지원) 또한 일반적인 grammar 문법은 잘 지원하지만 dictation을 아직 지원하지 않습니다.

Nuance SREC 엔진은 2008/2009년에 공개되었는데도 많이 사용되지 않고 있는 것은 아마도 관련 문서가 아직은 거의 없기 때문이 아닌가 합니다. (혹은 다른 음성인식 라이브러리를 사용한다거나 해서??)
비교적 최근에 데비안 프로젝트에서 Nuance SREC엔진을 포팅하려는 시도가 있는 것 같은데 별다른 진척은 없는 상태입니다. https://github.com/arthurv/srec 참조

추가: Nuance srec을 이용해 kinect를 리눅스상에서 쓸 수 있게 포팅한 (소스를 보면 고친 부분은 거의 없음) 것도 있더군요. http://www.keyboardmods.com/2011/10/kinect-speech-recognition-in-linux.html 이것을 보면 리눅스상에서도 많은 수고 없이도 사용할 수도 있을 것으로 생각됩니다.

그밖에 더 자세한 내용은 다음 사이트를 참조하시기 바랍니다.


Nuance SREC 음성엔진을 사용하는 프로젝트

그런데 Nuance SREC엔진은 안드로이드 SDK API로 지원되지 않으므로, 이 자체 내장 엔진을 이용해서 앱을 만드려면 android.speech.srec.* 소스를 복사해서 사용하는 방식으로 만들어야 합니다. 이와 같은 방식으로 안드로이드 내장 음성인식 엔진 SREC을 사용하는 대표적인 프로젝트/앱이 다음과 같은 것이 있습니다.

소스 예제

android.speech.srec.Recognizer 자바 소스를 살펴보면 다음과 같은 식으로 사용할 수 있다는 주석이 있습니다.
(아래 소스를 조금 보기좋게 해 두었습니다.)
https://github.com/CyanogenMod/android_frameworks_base/tree/jellybean/core/java/android/speech/srec
https://github.com/CyanogenMod/android_frameworks_base/blob/jellybean/core/java/android/speech/srec/Recognizer.java - CyanogenMod 소스

// create and start audio input
InputStream audio = new MicrophoneInputStream(11025, 11025*5);
// create a Recognizer
String cdir = Recognizer.getConfigDir(null);
Recognizer recognizer = new Recognizer(cdir + "/baseline11k.par");
// create and load a Grammar
Recognizer.Grammar grammar =
    recognizer.new Grammar(cdir + "/grammars/VoiceDialer.g2g");
// setup the Grammar to work with the Recognizer
grammar.setupRecognizer();
// fill the Grammar slots with names and save, if required
grammar.resetAllSlots();
for (String name : names) grammar.addWordToSlot("@Names", name, null, 1, "V=1");
// names 배열에 이름을 넣어두면 인식됨 예를 들어 { "hello", "foobar", "kim" }
grammar.compile();
grammar.save("/mnt/sdcard/foo.g2g"); // path를 고쳐둠
// start the Recognizer
recognizer.start();
// loop over Recognizer events
while (true) {
    switch (recognizer.advance()) {
    case Recognizer.EVENT_INCOMPLETE:
    case Recognizer.EVENT_STARTED:
    case Recognizer.EVENT_START_OF_VOICING:
    case Recognizer.EVENT_END_OF_VOICING:
        // let the Recognizer continue to run
        continue;
    case Recognizer.EVENT_RECOGNITION_RESULT:
        // success, so fetch results here!
        for (int i = 0; i < recognizer.getResultCount(); i++) {
            String result = recognizer.getResult(i, Recognizer.KEY_LITERAL);
            Log.d(TAG, "result = " + result); // 인식 결과값 출력
        }
        break;
    case Recognizer.EVENT_NEED_MORE_AUDIO:
        // put more audio in the Recognizer
        recognizer.putAudio(audio);
        continue;
    default:
        // notifyFailure();
        break;
    }
    break;
}
// stop the Recognizer
recognizer.stop();
// destroy the Recognizer
recognizer.destroy();
// stop the audio device
audio.close();

위의 소스를 거의 고치지 않고서 이를 이용해 간단한 샘플 앱을 만들어보니 자체 내장 음성인식 엔진 SREC이 아주 잘 작동하는 것을 확인하였습니다. (아래 링크를 참조하세요)
(이렇게 확인하고 구글링을 더 해보니 2011년에 이미 다른 분이 이 테스트를 해보신 모양입니다 :) http://www.eoeandroid.com/thread-54280-1-1.html 참고)

기타 참고 사이트


요청이 계속 있어서 간단한 앱을 급조했습니다~

(ICS 배포 이후부터 일부 기종은 srec을 제거한 상태인 기종의 경우에 libsrec_jni가 내장되지 않아서 제대로 작동하지 않습니다.)

https://github.com/wkpark/srec-example

컴파일하고 설치한 후에 사용법은 다음과 같습니다.

1. Start 버튼을 누른다.

2. Dial 123 123 같은 식의 VoiceDialer 명령을 내려본다. (이 명령 세트는 VoiceDialer.g2g 그래머 파일에 있는 내용)

(VoiceDialer.g2g는 external/srec/config/en.us/grammars/VoiceDialer.grxml 파일을 참조하세요)

컴파일된 앱: (libsrec_jni.so가 자체 내장된 기종에서만 제대로 작동합니다)

srec-example.apk



by dumpcookie 2013. 3. 16. 23:05

리눅스상에서 자유롭게 쓸 수 있는 오픈소스/자유 소프트웨어 Text-To-Speech(TTS)엔진은 꽤 많으며, 다음과 같은 공개 TTS엔진이 유명합니다.

  • Festivalhttp://www.cstr.ed.ac.uk/projects/festival/ - MIT 형식의 라이선스 (상용 제한 없음) - 대부분의 리눅스 배포판에서 기본으로 설치됨
  • MBROLAhttp://tcts.fpms.ac.be/synthesis/ - 한국어도 지원 (부산대 김경석 교수가 만든 "한말(hanmal)" 음성 지원) - 개인은 자유롭게 쓸 수 있으나, 제한적인 라이선스(상용 안됨)
  • eSpeakhttp://espeak.sourceforge.net/ - GPL 라이선스 - 윈도우 및 안드로이드 지원
  • HTS http://hts.sp.nitech.ac.jp/ - BSD 라이선스 (상용제한 없음) - Google TTS엔진에서 사용한다고 함.
    HTS 관련 문서를 읽어보면 상당히 다양한 프로젝트에서 HTS를 사용하고 있다는 것을 알 수 있으며, 음성 소스만 주어지면 그 목소리에 대응하는 synthesize용 목소리를 만들 수 있습니다!! @@ 단, 데모에서 들을 수 있는 음성은 매우 품질이 좋은 반면, flite나 festival 등등의 다른 프로젝트용으로 만들어진 음성자료를 통해 생성된 음질 썩 좋은 편이 아닙니다.
    (데모 페이지는 http://homepages.inf.ed.ac.uk/jyamagis/demos/page35/page35.html를 비롯한 일련의 페이지)

그러나 이러한 공개 TTS엔진에서 만들어내는 소리가 그렇게 훌륭한 편은 아닙니다. MBROLA가 그중에 가장 나은 소리를 들려준다고 하지만 라이선스가 제한이 있고, Festival가 그나마 들어줄만한 소리를 만들어내지만 안드로이드의 svox-pico보다는 음성의 질이 떨어집니다.

구글 안드로이드 도넛(버전 1.6)부터 자체 내장된 svox-pico TTS엔진은 2008년에 SVOX사에서 공개한 TTS엔진입니다. svox-pico는 소스코드까지 공개된 TTS엔진이며, 공개당시 매우 획기적인 일이였고, 소스 및 실행 바이너리 크기가 상당히 적고 가벼운 편이며, 발음도 훌륭한 편이였습니다.

현재는 IVONA와 같은 안드로이드에서 무료로 쓸 수 있는 TTS엔진이 있기때문에 svox-pico의 인기가 다소 떨어진 편이지만, svox-pico의 소스가 공개되어 있으므로 svox-pico를 리눅스에서도 쓸 수 있게되는 것은 시간문제였습니다. (그런데 검색해보니 관련된 한국어 문서가 전혀 없더군요. 그래서 이렇게 포스팅을 하게 된 것입니다 ;)

svox-pico 소스코드

svox-pico 최신 소스코드를 직접 받고자 하는 경우에는 구글 레포지터리를 통해서 받을 수 있습니다.
https://android.googlesource.com/platform/external/svox.git

여기에는 svox의 소스코드뿐만 아니라 언어팩을 만들 수 있는 툴(윈도우용) 및 메뉴얼도 같이 포함되어 있기때문에, 전체 소스코드의 압축된 크기가 상당히 큽니다.

svox-pico 설치해보기

svox-pico는 우분투나 데비안용 패키지가 이미 수년전에 나와있는 상태입니다. 페도라에서 설치하기 위해서 검색해보니 쉽게 찾을 수 없었으나, ALT 리눅스용 소스 rpm이 있었습니다. ALT리눅스용 소스 rpm을 다운로드 받아서 페도라에 맞게끔 spec파일을 살짝 고치고 빌드하니 아무런 문제 없이 컴파일 할 수 있었으며 실행도 아주 잘 되었습니다.

  • src.rpm은 다음 사이트를 통해서 얻을 수 있었습니다.
    http://sisyphus.ru/en/srpm/Sisyphus/svox-pico
  • pico2wave --wave test.wav "Hello World" 라고 실행하면 test.wav가 얻어집니다.
  • 생성되는 소리는 진저브레드에서 Pico-TTS 엔진을 기본으로 설정했을때에 나오는 소리와 똑같았습니다.
  • git 소스로부터 직접 빌드하려 할 경우라면 http://wiki.freeswitch.org/wiki/Mod_tts_commandline 사이트를 참조하시기 바랍니다.


by dumpcookie 2013. 3. 14. 21:54

mecab 프로젝트에 대해 조금 더 살펴보니 2006년에 만들어진 꽤 오래된 프로젝트였습니다. http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html

mecab 패키지에는 이미 java/perl/python 등등의 바인딩을 지원하지만 php 바인딩만 자체 지원하지 않습니다. 그래서 php 바인딩은 없나 하고 살펴보니 2008년도부터 php바인딩을 지원하는 프로젝트가 있었더군요. https://github.com/rsky/php-mecab by rsky

rpm 패키지는 없나 해서 살펴보니 금방 찾을 수 없어서, 그냥 빌드해봤습니다. (참고로 본인은 Fedora 15 사용중)

  1. 소스를 받고 : 소스가 github의 레포지터리이므로 git clone으로 소스를 받고
  2. php 바인딩 소스 디렉토리에서 phpize 실행
  3. make 명령으로 빌드
  4. modules 디렉토리에 생성된 mecab.so/usr/lib/php/modules 아래에 설치
  5. php.ini 설정

$ git clone https://github.com/rsky/php-mecab
Cloning into php-mecab...
remote: Counting objects: 616, done.
remote: Compressing objects: 100% (249/249), done.
remote: Total 616 (delta 427), reused 548 (delta 359)
Receiving objects: 100% (616/616), 120.44 KiB | 110 KiB/s, done.
Resolving deltas: 100% (427/427), done.
$ cd php-mecab/
$ ls
mecab  packages  README.md
$ cd mecab
$ phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626

그런다음 빌드

$ ./configure
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for a sed that does not truncate output... /bin/sed
checking for cc... cc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether cc accepts -g... yes
checking for cc option to accept ISO C89... none needed
checking how to run the C preprocessor... cc -E
(중략)
checking whether to build shared libraries... yes
checking whether to build static libraries... no
configure: creating ./config.status
config.status: creating config.h
config.status: executing libtool commands
$ make
... (생략)

php 바인딩 소스 본체가 mecab.c라는 소스가 전부라서 눈깜짝할 사이에 빌드가 됩니다.

빌드된 mecab.so 파일을 다음과 같은 식으로 설치해줍니다.

$ sudo cp modules/mecab.so /usr/lib/php/modules/

다음과 같은 내용을 /etc/php.ini에 넣거나, /etc/php.d/mecab.ini라는 파일을 만들어 추가해줍니다.

extension=mecab.so

다음과 같은 간단한 예제를 examples/* 디렉토리 아래에 있는 다양한 예제를 참고해서 만들어봤습니다.

$dic = './mecab-ko-dic-1.1.3-20130226';
ini_set('mecab.default_dicdir', $dic);

$arg = array();

$mecab = mecab_new($arg);

$str = "PHP-mecab 한글테스트중입니다. 무궁화꽃이 피었습니다";
echo mecab_sparse_tostr($mecab, $str);

mecab_destroy($mecab);

이 파일은 test.php라고 이름붙여 저장하고, mecab용 한글 사전 디렉토리는 현재 디렉토리 아래에 있는 은전한닢 프로젝트의 사전으로 지정하였으며 (./mecab-ko-dic-1.1.3-20130226), 다음과 같이 실행해 보니 아무런 문제없이 잘 실행됨을 볼 수 있었습니다.

$ php test.php
PHP     SL,*,*,*,*,*,*
-       SY,*,*,*,*,*,*
mecab   SL,*,*,*,*,*,*
한글    NN,T,한글,*,*,*,*
테스트  NN,F,테스트,*,*,*,*
중      NNB,T,중,*,*,*,*
입니다  VCP+EF,F,입니다,Inflect,VCP,EF,이/VCP+ㅂ니다/EF
.       SF,*,*,*,*,*,*
무궁화  NN,F,무궁화,Compound,*,*,무궁+화
꽃      NN,T,꽃,*,*,*,*
이      JKC,F,이,*,*,*,*
피      VV,F,피,*,*,*,*
었      EP,T,었,*,*,*,*
습니다  EC,F,습니다,*,*,*,*
EOS

by dumpcookie 2013. 3. 11. 16:06
| 1 ··· 3 4 5 6 7 |