Je me suis référé au site suivant. Le code source est essentiellement utilisé tel quel sans être réécrit.
[ http://aidiary.hatenablog.com/entry/20120701/1341126474 ] Comment utiliser l'installation de SPTK (1), le dessin de forme d'onde, la lecture audio
[ http://aidiary.hatenablog.com/entry/20150225/1424863972 ] Conversion vocale statistique (2) Faisons un changeur de voix
*** Now recording ... (10 sec)
*** extract pitch ...
*** extract mel cepstrum
*** modify parameters ...
'x2x' �́A�����R�}���h�܂��͊O���R�}���h�A
����\�ȃv���O�����܂��̓o�b�` �t�@�C���Ƃ��ĔF������Ă��܂���B
'x2x' �́A�����R�}���h�܂��͊O���R�}���h�A
����\�ȃv���O�����܂��̓o�b�` �t�@�C���Ƃ��ĔF������Ă��܂���B
'sopr' �́A�����R�}���h�܂��͊O���R�}���h�A
����\�ȃv���O�����܂��̓o�b�` �t�@�C���Ƃ��ĔF������Ă��܂���B
*** play!
'sopr' �́A�����R�}���h�܂��͊O���R�}���h�A
����\�ȃv���O�����܂��̓o�b�` �t�@�C���Ƃ��ĔF������Ă��܂���B
Traceback (most recent call last):
File "C:/Users/joho-2/PycharmProjects/R sound 10/R sound 10.py", line 127, in <module>
play("output.raw")
File "C:/Users/joho-2/PycharmProjects/R sound 10/R sound 10.py", line 78, in play
f = open(raw_file, "rb")
IOError: [Errno 2] No such file or directory: 'output.raw'
#coding: utf-8
import pyaudio
import struct
import subprocess
#Changeur de voix simple utilisant SPTK
CHANNELS = 1
RATE = 16000
CHUNK = 1024
def record(raw_file, record_seconds=5):
"""Enregistrer un fichier audio
La durée d'enregistrement est fixe. Je n'ai pas pu terminer la boucle lorsque j'ai appuyé sur le clavier ..."""
fp = open(raw_file, "wb")
for _ in range(0, int(RATE / CHUNK * record_seconds)):
data = stream.read(CHUNK)
fp.write(struct.pack('s' * CHUNK * 2, *data))
fp.close()
stream.stop_stream()
stream.close()
p.terminate()
def extract_pitch(raw_file, pitch_file):
"""Extraction des paramètres de hauteur"""
cmd = "x2x +sf %s | pitch -a 1 -s 16 -p 80 > %s" % (raw_file, pitch_file)
subprocess.call(cmd, shell=True)
def extract_mcep(raw_file, mcep_file):
"""Extraction des paramètres de Mercepstram"""
cmd = "x2x +sf %s | frame -p 80 | window | mcep -m 25 -a 0.42 > %s" % (raw_file, mcep_file)
subprocess.call(cmd, shell=True)
def modify_pitch(m, pitch_file, mcep_file, raw_file):
"""Déformer et resynthétiser la hauteur
m est supérieur à 1=>Voix basse
m est inférieur à 1=>Voix haute"""
cmd = "sopr -m %f %s | excite -p 80 | mlsadf -m 25 -a 0.42 -p 80 %s | clip -y -32000 32000 | x2x +fs > %s" % (m, pitch_file, mcep_file, raw_file)
subprocess.call(cmd, shell=True)
def modify_speed(frame_shift, pitch_file, mcep_file, raw_file):
"""Resynthétiser en transformant la vitesse de parole
frame_le décalage est petit=>Conversation rapide
frame_Le décalage est grand=>lentement"""
cmd = "excite -p %f %s | mlsadf -m 25 -a 0.42 -p %f %s | clip -y -32000 32000 | x2x +fs > %s" % (frame_shift, pitch_file, frame_shift, mcep_file, raw_file)
subprocess.call(cmd, shell=True)
def hoarse_voice(pitch_file, mcep_file, raw_file):
"""Chuchotement"""
modify_pitch(0, pitch_file, mcep_file, raw_file)
def robot_voice(frame_period, record_seconds, mcep_file, raw_file):
"""Voix de robot
frame_la période est petite=>Faible
frame_la période est longue=>haute"""
sequence_length = record_seconds * RATE * frame_period
cmd = "train -p %d -l %d | mlsadf -m 25 -a 0.42 -p 80 %s | clip -y -32000 32000 | x2x +fs > %s" % (frame_period, sequence_length, mcep_file, raw_file)
subprocess.call(cmd, shell=True)
def child_voice(pitch_file, mcep_file, raw_file):
"""Voix enfant"""
cmd = "sopr -m 0.4 %s | excite -p 80 | mlsadf -m 25 -a 0.1 -p 80 %s | clip -y -32000 32000 | x2x +fs > %s" % (pitch_file, mcep_file, raw_file)
subprocess.call(cmd, shell=True)
def deep_voice(pitch_file, mcep_file, raw_file):
"""Voix épaisse"""
cmd = "sopr -m 2.0 %s | excite -p 80 | mlsadf -m 25 -a 0.6 -p 80 %s | clip -y -32000 32000 | x2x +fs > %s" % (pitch_file, mcep_file, raw_file)
subprocess.call(cmd, shell=True)
def raw2wav(raw_file, wav_file):
cmd = "sox -e signed-integer -c %d -b 16 -r %d %s %s" % (CHANNELS, RATE, raw_file, wav_file)
subprocess.call(cmd, shell=True)
def play(raw_file):
"""Lire le fichier brut"""
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(2), channels=CHANNELS, rate=RATE, output=True)
f = open(raw_file, "rb")
data = f.read(CHUNK)
while data != '':
stream.write(data)
data = f.read(CHUNK)
stream.stop_stream()
stream.close()
p.terminate()
if __name__ == "__main__":
#Durée d'enregistrement (fixe)
record_seconds = 10
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
pitch_file = "temp.pitch"
mcep_file = "temp.mcep"
raw_file = "temp.raw"
output_file = "output.raw"
#Enregistrez l'audio d'origine et exportez-le sous forme de fichier brut
print "*** Now recording ... (%d sec)" % record_seconds
record(raw_file, record_seconds)
#Extraction de paramètres
print "*** extract pitch ..."
extract_pitch(raw_file, pitch_file)
print "*** extract mel cepstrum"
extract_mcep(raw_file, mcep_file)
#Diverses transformations de paramètres
print "*** modify parameters ..."
#Un seul peut être activé
modify_pitch(0.3, pitch_file, mcep_file, output_file)
# modify_speed(300, pitch_file, mcep_file, output_file)
# hoarse_voice(pitch_file, mcep_file, output_file)
# robot_voice(100, record_seconds, mcep_file, output_file)
# child_voice(pitch_file, mcep_file, output_file)
deep_voice(pitch_file, mcep_file, output_file)
#Lire l'audio converti
print "*** play!"
play("output.raw")
Je pensais que c'était un problème avec la version Python, donc j'ai changé de 3 à 2 mais cela n'a pas fonctionné ... Je pensais que je ne pouvais pas enregistrer en premier lieu, alors j'ai revu le site plusieurs fois et étudié. L'erreur n'est pas partie d'ici et cela n'a tout simplement pas fonctionné ;;
Je suis un débutant qui vient d'étudier Python récemment. Je serais très heureux si vous pouviez me donner quelques conseils. Merci beaucoup.
Recommended Posts