Merge pull request #13 from fumiama/mono
feat: drop cython monotonic_align
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -158,3 +158,5 @@ cython_debug/
|
|||||||
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
||||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||||
#.idea/
|
#.idea/
|
||||||
|
|
||||||
|
/models
|
||||||
|
|||||||
1
bert/chinese-roberta-wwm-ext-large/.gitignore
vendored
Normal file
1
bert/chinese-roberta-wwm-ext-large/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
*.bin
|
||||||
@@ -1,19 +1,15 @@
|
|||||||
import numpy as np
|
from numpy import zeros, int32, float32
|
||||||
import torch
|
from torch import from_numpy
|
||||||
from .monotonic_align.core import maximum_path_c
|
|
||||||
|
|
||||||
|
from .core import maximum_path_jit
|
||||||
|
|
||||||
def maximum_path(neg_cent, mask):
|
def maximum_path(neg_cent, mask):
|
||||||
""" Cython optimized version.
|
|
||||||
neg_cent: [b, t_t, t_s]
|
|
||||||
mask: [b, t_t, t_s]
|
|
||||||
"""
|
|
||||||
device = neg_cent.device
|
device = neg_cent.device
|
||||||
dtype = neg_cent.dtype
|
dtype = neg_cent.dtype
|
||||||
neg_cent = neg_cent.data.cpu().numpy().astype(np.float32)
|
neg_cent = neg_cent.data.cpu().numpy().astype(float32)
|
||||||
path = np.zeros(neg_cent.shape, dtype=np.int32)
|
path = zeros(neg_cent.shape, dtype=int32)
|
||||||
|
|
||||||
t_t_max = mask.sum(1)[:, 0].data.cpu().numpy().astype(np.int32)
|
t_t_max = mask.sum(1)[:, 0].data.cpu().numpy().astype(int32)
|
||||||
t_s_max = mask.sum(2)[:, 0].data.cpu().numpy().astype(np.int32)
|
t_s_max = mask.sum(2)[:, 0].data.cpu().numpy().astype(int32)
|
||||||
maximum_path_c(path, neg_cent, t_t_max, t_s_max)
|
maximum_path_jit(path, neg_cent, t_t_max, t_s_max)
|
||||||
return torch.from_numpy(path).to(device=device, dtype=dtype)
|
return from_numpy(path).to(device=device, dtype=dtype)
|
||||||
|
|||||||
26530
monotonic_align/core.c
26530
monotonic_align/core.c
File diff suppressed because it is too large
Load Diff
35
monotonic_align/core.py
Normal file
35
monotonic_align/core.py
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import numba
|
||||||
|
|
||||||
|
|
||||||
|
@numba.jit(numba.void(numba.int32[:,:,::1], numba.float32[:,:,::1], numba.int32[::1], numba.int32[::1]), nopython=True, nogil=True)
|
||||||
|
def maximum_path_jit(paths, values, t_ys, t_xs):
|
||||||
|
b = paths.shape[0]
|
||||||
|
max_neg_val=-1e9
|
||||||
|
for i in range(int(b)):
|
||||||
|
path = paths[i]
|
||||||
|
value = values[i]
|
||||||
|
t_y = t_ys[i]
|
||||||
|
t_x = t_xs[i]
|
||||||
|
|
||||||
|
v_prev = v_cur = 0.0
|
||||||
|
index = t_x - 1
|
||||||
|
|
||||||
|
for y in range(t_y):
|
||||||
|
for x in range(max(0, t_x + y - t_y), min(t_x, y + 1)):
|
||||||
|
if x == y:
|
||||||
|
v_cur = max_neg_val
|
||||||
|
else:
|
||||||
|
v_cur = value[y-1, x]
|
||||||
|
if x == 0:
|
||||||
|
if y == 0:
|
||||||
|
v_prev = 0.
|
||||||
|
else:
|
||||||
|
v_prev = max_neg_val
|
||||||
|
else:
|
||||||
|
v_prev = value[y-1, x-1]
|
||||||
|
value[y, x] += max(v_prev, v_cur)
|
||||||
|
|
||||||
|
for y in range(t_y - 1, -1, -1):
|
||||||
|
path[y, index] = 1
|
||||||
|
if index != 0 and (index == y or value[y-1, index] < value[y-1, index-1]):
|
||||||
|
index = index - 1
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
cimport cython
|
|
||||||
from cython.parallel import prange
|
|
||||||
|
|
||||||
|
|
||||||
@cython.boundscheck(False)
|
|
||||||
@cython.wraparound(False)
|
|
||||||
cdef void maximum_path_each(int[:,::1] path, float[:,::1] value, int t_y, int t_x, float max_neg_val=-1e9) nogil:
|
|
||||||
cdef int x
|
|
||||||
cdef int y
|
|
||||||
cdef float v_prev
|
|
||||||
cdef float v_cur
|
|
||||||
cdef float tmp
|
|
||||||
cdef int index = t_x - 1
|
|
||||||
|
|
||||||
for y in range(t_y):
|
|
||||||
for x in range(max(0, t_x + y - t_y), min(t_x, y + 1)):
|
|
||||||
if x == y:
|
|
||||||
v_cur = max_neg_val
|
|
||||||
else:
|
|
||||||
v_cur = value[y-1, x]
|
|
||||||
if x == 0:
|
|
||||||
if y == 0:
|
|
||||||
v_prev = 0.
|
|
||||||
else:
|
|
||||||
v_prev = max_neg_val
|
|
||||||
else:
|
|
||||||
v_prev = value[y-1, x-1]
|
|
||||||
value[y, x] += max(v_prev, v_cur)
|
|
||||||
|
|
||||||
for y in range(t_y - 1, -1, -1):
|
|
||||||
path[y, index] = 1
|
|
||||||
if index != 0 and (index == y or value[y-1, index] < value[y-1, index-1]):
|
|
||||||
index = index - 1
|
|
||||||
|
|
||||||
|
|
||||||
@cython.boundscheck(False)
|
|
||||||
@cython.wraparound(False)
|
|
||||||
cpdef void maximum_path_c(int[:,:,::1] paths, float[:,:,::1] values, int[::1] t_ys, int[::1] t_xs) nogil:
|
|
||||||
cdef int b = paths.shape[0]
|
|
||||||
cdef int i
|
|
||||||
for i in prange(b, nogil=True):
|
|
||||||
maximum_path_each(paths[i], values[i], t_ys[i], t_xs[i])
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
from distutils.core import setup
|
|
||||||
from Cython.Build import cythonize
|
|
||||||
import numpy
|
|
||||||
|
|
||||||
setup(
|
|
||||||
name = 'monotonic_align',
|
|
||||||
ext_modules = cythonize("core.pyx"),
|
|
||||||
include_dirs=[numpy.get_include()]
|
|
||||||
)
|
|
||||||
@@ -2,6 +2,7 @@ Cython
|
|||||||
librosa==0.9.1
|
librosa==0.9.1
|
||||||
matplotlib
|
matplotlib
|
||||||
numpy
|
numpy
|
||||||
|
numba
|
||||||
phonemizer
|
phonemizer
|
||||||
scipy
|
scipy
|
||||||
tensorboard
|
tensorboard
|
||||||
|
|||||||
Reference in New Issue
Block a user