Skip to content
This repository has been archived by the owner on May 14, 2024. It is now read-only.

Commit

Permalink
Merge branch 'master' into 拆做聲韻莫調
Browse files Browse the repository at this point in the history
  • Loading branch information
sih4sing5hong5 authored May 8, 2018
2 parents 79951e5 + f576a61 commit 7786647
Show file tree
Hide file tree
Showing 30 changed files with 672 additions and 359 deletions.
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,5 +58,5 @@ deploy:
secure: J8T8072IpOA2NNRrJ0nnJVO21LbG0tH0KGAOEotDaCpusPIy1KuQyfVqdjFc+Dba+dCObgW0UQPgcAhOHk1//DhnwpRRL4L9wZsQjrkmLtKtZSG1z45oYKlF2WEPcCflcdzMyqCwnGfPtWTS5Iex6MfS0qTzRdWlFEnRFMdra6UjpTCIAiFLCETvDbL2VLKbhwENrVRzGSGRVFf9ICjohQyJRaC5Hpr+OVdLOhihev/lbdHZivPWvN6KqqP3ULad0+0ROiLadF6V46RDDYQT3CrNkJK1xVDNQ5F/9Cu95MMbUD1UsyeMBlvViMHSuvO0JzSiN4W6VmgzXxf1wYAlVS2MwbTWIak7+NTYlLt31I3a0dO82iF2ThDCkfK2JSy3UgCbq0x3tAH4wbT/ymXaOpsgKEPNnM+h7Td1o0Tz2ohxNU4g7MV3tGn3T8Fg4HLuGZFtSD/3S6be8TfWIuMJ7L6fuN9onNEvaAQs+gBFdjewbkKmHWHziSVZtTKSIUHFfJXV5Eht4pACiRysaU1zZMG+KyYM3o7dpsoLh+BBtaQLrmw5C/fbkiXSSpYASVDR/4a9umWvlB5YfSNHlF7fnZ1lENF/xMDmHha0RHmhm8gKuICV+qkOJQwVddZWw7jEnwYh9QuRO4vHfe03wOYZLG2AAsz4DIpUzs+oP6QB9Ww=
on:
tags: true
repo: sih4sing5hong5/tai5-uan5_gian5-gi2_hok8-bu7
repo: i3thuan5/tai5-uan5_gian5-gi2_hok8-bu7
condition: $TRAVIS_PYTHON_VERSION == '3.5' && $TOX_ENV = 'tan1uan5'
8 changes: 2 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# 臺灣言語服務

[![PyPI version](https://badge.fury.io/py/tai5-uan5_gian5-gi2_hok8-bu7.svg)](https://badge.fury.io/py/tai5-uan5_gian5-gi2_hok8-bu7)
[![Build Status](https://travis-ci.org/sih4sing5hong5/tai5-uan5_gian5-gi2_hok8-bu7.svg)](https://travis-ci.org/sih4sing5hong5/tai5-uan5_gian5-gi2_hok8-bu7)
[![Coverage Status](https://coveralls.io/repos/sih4sing5hong5/tai5-uan5_gian5-gi2_hok8-bu7/badge.svg?branch=master&service=github)](https://coveralls.io/github/sih4sing5hong5/tai5-uan5_gian5-gi2_hok8-bu7?branch=master)
[![Build Status](https://travis-ci.org/i3thuan5/tai5-uan5_gian5-gi2_hok8-bu7.svg?branch=master)](https://travis-ci.org/i3thuan5/tai5-uan5_gian5-gi2_hok8-bu7)
[![Coverage Status](https://coveralls.io/repos/github/i3thuan5/tai5-uan5_gian5-gi2_hok8-bu7/badge.svg?branch=master)](https://coveralls.io/github/i3thuan5/tai5-uan5_gian5-gi2_hok8-bu7?branch=master)

本專案提供一般人可以用臺灣母語的資訊技術,像是正規化翻譯、語音合成等Web-based服務,可以參考[網頁展示](http://xn--7zrr5mu7u.xn--v0qr21b.xn--kpry57d),或是加入我們[hackpad](https://g0v.hackpad.com/f4rSgcFTIzz)的討論。

Expand All @@ -12,10 +12,6 @@
[wiki](https://github.com/sih4sing5hong5/tai5-uan5_gian5-gi2_hok8-bu7/wiki)有更詳細的說明。

## 相關專案
* [臺灣言語資料庫](https://github.com/sih4sing5hong5/tai5-uan5_gian5-gi2_tsu1-liau7-khoo3)
* 母語資料存放規範
* [臺灣言語工具](https://github.com/sih4sing5hong5/tai5-uan5_gian5-gi2_kang1-ku7)
* 母語parser、寫法轉換、…功能。
* 翻譯、語音辨識、語音合成等工具整合。
* [臺灣言語平臺](https://github.com/sih4sing5hong5/tai5-uan5_gian5-gi2_phing5-thai5)
* 修改`臺灣言語資料庫`的網頁介面
18 changes: 8 additions & 10 deletions 臺灣言語服務/HTS介面.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,15 @@

class HTS介面:

def __init__(self):
用pyro4 = False
try:
if settings.HTS_PYRO4:
用pyro4 = True
except AttributeError:
pass
if 用pyro4:
self.服務 = Pyro4.Proxy("PYRONAME:HTS服務")
@property
def 服務(self):
if getattr(settings, "HTS_ING7_PYRO4", False):
pyro4主機 = getattr(settings, "PYRO4_TSU2_KI1", None)
pyro4_naming主機 = Pyro4.locateNS(pyro4主機)
pyro4的uri = pyro4_naming主機.lookup("HTS服務")
return Pyro4.Proxy(pyro4的uri)
else:
self.服務 = HTS服務()
return HTS服務()

def 語音合成支援腔口(self, request):
return JsonResponse({'腔口': self.服務.支援腔口()})
Expand Down
53 changes: 53 additions & 0 deletions 臺灣言語服務/KaldiModels.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
from os.path import abspath, join

from django.conf import settings
from django.core.files.base import ContentFile
from django.db import models
from jsonfield.fields import JSONField
from 臺灣言語服務.models檢查 import 檢查聽拍內底欄位敢有夠
from 臺灣言語工具.語音辨識.聲音檔 import 聲音檔


class 影音檔案欄位(models.Model):
class Meta:
abstract = True

影音 = models.FileField(blank=True)
語言 = models.CharField(blank=True, max_length=50)

@classmethod
def 準備辨識(cls, 語言, 音檔):
return cls.objects.create(語言=語言).存影音資料(音檔)

def 聲音檔(self):
return 聲音檔.對檔案讀(self.影音所在())

def 影音所在(self):
return join(abspath(settings.MEDIA_ROOT), self.影音.name)

def 存影音資料(self, 音檔):
self.影音.save(
name=self.編號名(),
content=ContentFile(音檔.wav格式資料()),
save=True,
)
return self

def 編號名(self):
return '{0}_{1:04}'.format(self., self.id)


class Kaldi辨識結果(影音檔案欄位):
= 'Kaldi辨識'
辨識好猶未 = models.BooleanField(default=False)
辨識出問題 = models.BooleanField(default=False)
分詞 = models.TextField(blank=True)


class Kaldi對齊結果(影音檔案欄位):
= 'Kaldi對齊'
對齊好猶未 = models.BooleanField(default=False)
對齊出問題 = models.BooleanField(default=False)
欲切開的聽拍 = models.TextField()
切好的聽拍 = JSONField(null=True, blank=True, validators=[檢查聽拍內底欄位敢有夠])
壓縮檔 = models.FileField(blank=True)
73 changes: 30 additions & 43 deletions 臺灣言語服務/Kaldi介面.py
Original file line number Diff line number Diff line change
@@ -1,38 +1,34 @@
from base64 import b64decode
import json

from celery import shared_task
from django.conf import settings
from django.http.response import HttpResponse, JsonResponse,\
HttpResponseBadRequest
from django.utils.datastructures import MultiValueDictKeyError
from django.views.decorators.csrf import csrf_exempt

from celery import shared_task


from 臺灣言語服務.Kaldi語料辨識 import Kaldi語料辨識
from 臺灣言語工具.語音辨識.聲音檔 import 聲音檔
from 臺灣言語資料庫.資料模型 import 影音表
from 臺灣言語工具.解析整理.拆文分析器 import 拆文分析器
from 臺灣言語服務.Kaldi語料對齊 import Kaldi語料對齊
from 臺灣言語服務.models import Kaldi對齊結果
from 臺灣言語服務.KaldiModels import Kaldi辨識結果


@csrf_exempt
def 看辨識結果(request):
結果 = []
for 影音 in (
影音表.objects
.filter(Kaldi辨識結果__isnull=False)
.select_related('Kaldi辨識結果', '語言腔口')
for 辨識結果 in (
Kaldi辨識結果.objects
.order_by('-pk')[:300]
):
這筆 = {
'編號': 影音.編號(),
'網址': 影音.影音資料.url,
'語言': 影音.語言腔口.語言腔口,
'編號': 辨識結果.id,
'網址': 辨識結果.影音.url,
'語言': 辨識結果.語言,
}
辨識結果 = 影音.Kaldi辨識結果
if not 辨識結果.辨識好猶未:
這筆['狀態'] = '辨識中…'
elif 辨識結果.辨識出問題:
Expand All @@ -41,8 +37,7 @@ def 看辨識結果(request):
這筆['狀態'] = '成功'
這筆['分詞'] = 辨識結果.分詞

語言 = 影音.語言腔口.語言腔口
服務設定 = settings.HOK8_BU7_SIAT4_TING7[語言]
服務設定 = settings.HOK8_BU7_SIAT4_TING7[辨識結果.語言]
章物件 = 拆文分析器.分詞章物件(辨識結果.分詞)
try:
這筆['綜合標音'] = 章物件.綜合標音(服務設定['字綜合標音'])
Expand All @@ -63,12 +58,12 @@ def Kaldi辨識(request):
except MultiValueDictKeyError:
啥人唸的 = '無註明'
try:
影音 = Kaldi語料辨識.匯入音檔(request.POST['語言'], 啥人唸的, 揣音檔出來(request), '')
Kaldi辨識 = Kaldi語料辨識.匯入音檔(request.POST['語言'], 啥人唸的, 揣音檔出來(request), '')
except MultiValueDictKeyError:
return HttpResponseBadRequest(
'設定「語言」參數以外,閣愛傳「blob」抑是「音檔」!!'
)
Kaldi辨識影音.delay(影音.編號())
Kaldi辨識影音.delay(Kaldi辨識.id)
return HttpResponse('上傳成功!!')


Expand All @@ -87,35 +82,30 @@ def blob2bytes(blob):


def 無辨識過的重訓練一擺():
for 影音 in 影音表.objects.filter(Kaldi辨識結果__辨識好猶未=False):
_Kaldi辨識影音(影音)
for Kaldi辨識 in Kaldi語料辨識.objects.filter(辨識好猶未=False):
Kaldi辨識.辨識()
return JsonResponse({'成功': '成功'})


@shared_task
def Kaldi辨識影音(影音編號):
_Kaldi辨識影音(影音表.objects.get(pk=影音編號))


def _Kaldi辨識影音(影音):
try:
章物件 = Kaldi語料辨識.辨識音檔(影音)
except OSError:
影音.Kaldi辨識結果.辨識失敗()
raise
else:
影音.Kaldi辨識結果.辨識成功(章物件.看分詞())
def Kaldi辨識影音(Kaldi辨識編號):
Kaldi語料辨識.objects.get(pk=Kaldi辨識編號).辨識()


@csrf_exempt
def Kaldi對齊(request):
語言 = request.POST['語言']
文本 = request.POST['文本']
語料對齊 = Kaldi語料對齊.匯入音檔(
語言, '無註明',
聲音檔.對資料轉(request.FILES['原始wav檔'].read()),
文本.replace('\r\n', '\n').replace('\r', '\n')
)
try:
語言 = request.POST['語言']
文本 = request.POST['文本']
語料對齊 = Kaldi語料對齊.匯入音檔(
語言, '無註明',
揣音檔出來(request),
文本.replace('\r\n', '\n').replace('\r', '\n')
)
except MultiValueDictKeyError:
return HttpResponseBadRequest(
'設定「語言」參數以外,閣愛傳「文本」佮「blob」抑是「音檔」!!'
)
Kaldi對齊影音.delay(語料對齊.pk)
return HttpResponse('上傳成功!!')

Expand All @@ -125,15 +115,13 @@ def 看對齊結果(request):
結果 = []
for 對齊結果 in (
Kaldi對齊結果.objects
.filter()
.select_related('影音__語言腔口', '欲切開的聽拍')
.order_by('-pk')[:300]
):
這筆 = {
'編號': 對齊結果.pk,
'原始wav檔網址': 對齊結果.影音.影音資料.url,
'分詞文本': 對齊結果.欲切開的聽拍.聽拍內容()[0]['內容'],
'語言': 對齊結果.影音.語言腔口.語言腔口,
'原始wav檔網址': 對齊結果.影音.url,
'分詞文本': 對齊結果.欲切開的聽拍,
'語言': 對齊結果.語言,
}
if not 對齊結果.對齊好猶未:
這筆['狀態'] = '對齊中…'
Expand All @@ -151,5 +139,4 @@ def 看對齊結果(request):

@shared_task
def Kaldi對齊影音(對齊編號):
語料對齊 = Kaldi語料對齊.objects.get(pk=對齊編號)
語料對齊.對齊音檔()
Kaldi語料對齊.objects.get(pk=對齊編號).對齊()
9 changes: 2 additions & 7 deletions 臺灣言語服務/Kaldi語料匯出.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ def _語句資訊(cls, 辭典資料, 辭典輸出物件, 語者名對應輸出
開始 = float(開始時間)
結束 = float(結束時間)
if 0.0 <= 開始 and 開始 + 0.1 < 結束 and 結束 <= 音檔長度:
if 原本語者 == '無註明':
if 原本語者 in ['', '無註明']:
語者 = '{0:07}無註明'.format(第幾个人)
第幾个人 += 1
else:
Expand Down Expand Up @@ -249,6 +249,7 @@ def _加新聲學單位(cls, 聲類, 韻類, 調類, 新聲類, 新韻類, 新

@classmethod
def _檢查有新聲學單位無(cls, 聲類, 韻類, 調類, 新聲類, 新韻類, 新調類):
'調免檢查,因為韻就會檢查掉矣'
for 新聲 in 新聲類:
if 新聲 not in 聲類:
raise RuntimeError('語料無這个音')
Expand All @@ -258,12 +259,6 @@ def _檢查有新聲學單位無(cls, 聲類, 韻類, 調類, 新聲類, 新韻
raise RuntimeError('語料無這个韻抑是調')
except KeyError:
raise RuntimeError('語料無這个韻抑是調')
for 調, 一个音素調 in 新調類:
try:
if 一个音素調 not in 調類[調]:
raise RuntimeError('語料無這个調')
except KeyError:
raise RuntimeError('語料無這个調')

@classmethod
def _寫檔(cls, 資料夾, 檔名):
Expand Down
Loading

0 comments on commit 7786647

Please sign in to comment.