Skip to content
Snippets Groups Projects
Commit 733285cb authored by Yousef Harfoush's avatar Yousef Harfoush
Browse files

No commit message

No commit message
parent 272a6e9e
Branches
Tags
No related merge requests found
...@@ -17,52 +17,72 @@ ...@@ -17,52 +17,72 @@
# ##### END GPL LICENSE BLOCK ##### # ##### END GPL LICENSE BLOCK #####
bl_info = { bl_info = {
"name": "LipSync Importer", "name": "LipSync Importer & Blinker",
"author": "Yousef Harfoush - bat3a ;)", "author": "Yousef Harfoush - bat3a ;)",
"version": (0, 2, 0), "version": (0, 2, 6),
"blender": (2, 5, 4), "blender": (2, 5, 6),
"api": 32077, "api": 35816,
"location": "3D window > Tool Shelf", "location": "3D window > Tool Shelf",
"description": "Plot Papagayo's voice file to frames", "description": "Plot Papagayo's (or Jlipsync) voice file to frames and adds automatic blinking",
"warning": "", "warning": "",
"wiki_url": "", "wiki_url": "http://wiki.blender.org/index.php?title=Extensions:2.5/Py/Scripts/Import-Export/Lipsync_Importer",
"tracker_url": "", "tracker_url": "http://projects.blender.org/tracker/index.php?func=detail&aid=24080&group_id=153&atid=468",
"category": "Import-Export"} "category": "Import-Export"}
import bpy, re import bpy, re
from bpy.props import *
# intializing variables mnulast = '1'
obj = bpy.context.object
scn = bpy.context.scene
typ = bpy.types.Scene
var = bpy.props
scn['offset']=0 global phnmlst
scn['skscale']=0.8 phnmlst="rest"
scn['easeIn']=3
scn['easeOut']=3
# truning off relative path - it causes an error if it was true # truning off relative path - it causes an error if it was true
if bpy.context.user_preferences.filepaths.use_relative_paths == True: if bpy.context.user_preferences.filepaths.use_relative_paths == True:
bpy.context.user_preferences.filepaths.use_relative_paths = False bpy.context.user_preferences.filepaths.use_relative_paths = False
# add blinking
def blinker():
scn = bpy.context.scene
obj = bpy.context.object
global blink, blinkphnm
blink="off"
blinkphnm=1983
sk=len(obj.data.shape_keys.key_blocks)
for x in range(sk):
obj.active_shape_key_index = x
if obj.active_shape_key.name=="blink": blink="on"; blinkphnm=x
for y in range(scn['blinkNm']):
blinkSpm=scn["blinkSp"]*y
if blinkphnm!=1983: crtkey(blinkphnm, blinkSpm)
# mapping shape keys to phonemes vars. # mapping shape keys to phonemes vars.
def mapper(): def mapper():
obj = bpy.context.object
global AI, O, E, U, etc, L, WQ, MBP, FV, rest global AI, O, E, U, etc, L, WQ, MBP, FV, rest
global AIphnm, Ophnm, Ephnm, Uphnm, etcphnm, Lphnm global AIphnm, Ophnm, Ephnm, Uphnm, etcphnm, Lphnm
global WQphnm, MBPphnm, FVphnm, restphnm global WQphnm, MBPphnm, FVphnm, restphnm
AI="off"; O="off"; E="off"; U="off"; etc="off"; L="off" AI="off"; O="off"; E="off"; U="off"; etc="off"; L="off"
WQ="off"; MBP="off"; FV="off"; rest="off" WQ="off"; MBP="off"; FV="off"; rest="off"
sk=len(obj.data.shape_keys.keys) sk=len(obj.data.shape_keys.key_blocks)
for x in range(sk): for x in range(sk):
obj.active_shape_key_index = x obj.active_shape_key_index = x
if obj.active_shape_key.name=="AI": AI="on"; AIphnm=x if obj.active_shape_key.name=="AI": AI="on"; AIphnm=x
elif obj.active_shape_key.name=="O": O="on"; Ophnm=x elif obj.active_shape_key.name=="O": O="on"; Ophnm=x
elif obj.active_shape_key.name=="E": E="on"; Ephnm=x elif obj.active_shape_key.name=="E": E="on"; Ephnm=x
...@@ -73,70 +93,117 @@ def mapper(): ...@@ -73,70 +93,117 @@ def mapper():
elif obj.active_shape_key.name=="MBP": MBP="on"; MBPphnm=x elif obj.active_shape_key.name=="MBP": MBP="on"; MBPphnm=x
elif obj.active_shape_key.name=="FV": FV="on"; FVphnm=x elif obj.active_shape_key.name=="FV": FV="on"; FVphnm=x
elif obj.active_shape_key.name=="rest": rest="on"; restphnm=x elif obj.active_shape_key.name=="rest": rest="on"; restphnm=x
# calling file splitter # calling file splitter
spltr() splitter()
# reading imported file & creating keys # reading imported file & creating keys
def spltr(): def splitter():
scn = bpy.context.scene
f=open(scn.fpath) # importing file f=open(scn.fpath) # importing file
f.readline() # reading the 1st line that we don"t need f.readline() # reading the 1st line that we don"t need
print("hhhh")
for line in f: for line in f:
# removing new lines # removing new lines
lsta = re.split("\n+", line) lsta = re.split("\n+", line)
# building a list of frames & shapes indexes # building a list of frames & shapes indexes
lst = re.split(":? ", lsta[0]) lst = re.split(":? ", lsta[0])# making a list of a frame number &
frm = int(lst[0]) frm = int(lst[0])
# creating keys # passing to create keys
if lst[1]=="AI" and AI=="on": crtkey(AIphnm, frm) if lst[1]==("AI" or "A" or "I")and AI=="on": crtkey(AIphnm, frm)
elif lst[1]=="O" and O=="on": crtkey(Ophnm, frm) elif lst[1]=="O" and O=="on": crtkey(Ophnm, frm)
elif lst[1]=="E" and E=="on": crtkey(Ephnm, frm) elif lst[1]=="E" and E=="on": crtkey(Ephnm, frm)
elif lst[1]=="U" and U=="on": crtkey(Uphnm, frm) elif lst[1]=="U" and U=="on": crtkey(Uphnm, frm)
elif lst[1]=="etc" and etc=="on": crtkey(etcphnm, frm) elif lst[1]==("etc" or "C" or "D" or "G" or "K" or "N" or "R" or "S" or "TH" or "SH") and etc=="on": crtkey(etcphnm, frm)
elif lst[1]=="L" and L=="on": crtkey(Lphnm, frm) elif lst[1]=="L" and L=="on": crtkey(Lphnm, frm)
elif lst[1]=="WQ" and WQ=="on": crtkey(WQphnm, frm) elif lst[1]==("WQ" or "W" or "Q") and WQ=="on": crtkey(WQphnm, frm)
elif lst[1]=="MBP" and MBP=="on": crtkey(MBPphnm, frm) elif lst[1]==("MBP" or "M" or "P" or "B") and MBP=="on": crtkey(MBPphnm, frm)
elif lst[1]=="FV" and FV=="on": crtkey(FVphnm, frm) elif lst[1]==("FV" or "F" or "V") and FV=="on": crtkey(FVphnm, frm)
elif lst[1]=="rest" and rest=="on": crtkey(restphnm, frm) elif lst[1]==("rest" or "closed") and rest=="on": crtkey(restphnm, frm)
# creating keys with offset and eases # creating keys with offset and eases
def crtkey(phoneme, Skey): def crtkey(phoneme, Skey):
global phnmlst
scn = bpy.context.scene
obj = bpy.context.object
objSK=obj.data.shape_keys objSK=obj.data.shape_keys
obj.active_shape_key_index=phoneme obj.active_shape_key_index=phoneme
offst=scn['offset'] # offset value
skVlu=scn['skscale'] # shape key value
frmIn=scn['easeIn'] # ease in value
frmOut=scn['easeOut'] # ease out value
hldIn=scn['holdGap'] # holding time value
if bpy.context.scene['jlip'] == 1:
if phnmlst!=phoneme:
obj.active_shape_key.value=0.0
objSK.key_blocks[phoneme].keyframe_insert("value",
-1, offst+Skey-1, "Lipsync")
obj.active_shape_key.value=skVlu
objSK.key_blocks[phoneme].keyframe_insert("value",
-1, offst+Skey, "Lipsync")
obj.active_shape_key.value=0.0
objSK.key_blocks[phoneme].keyframe_insert("value",
-1, offst+Skey+1, "Lipsync")
phnmlst=phoneme
elif bpy.context.scene['jlip'] != 1:
obj.active_shape_key.value=0.0
objSK.key_blocks[phoneme].keyframe_insert("value",
-1, offst+Skey-frmIn, "Lipsync")
offst=scn['offset'] # offset value obj.active_shape_key.value=skVlu
skVlu=scn['skscale'] # shape key value objSK.key_blocks[phoneme].keyframe_insert("value",
frmIn=scn['easeIn'] # ease in value -1, offst+Skey, "Lipsync")
frmOut=scn['easeOut'] # ease out value
obj.active_shape_key.value=0.0 obj.active_shape_key.value=skVlu
objSK.keys[phoneme].keyframe_insert("value", objSK.key_blocks[phoneme].keyframe_insert("value",
-1, offst+Skey-frmIn, "Lipsync") -1, offst+Skey+hldIn, "Lipsync")
obj.active_shape_key.value=0.0
objSK.key_blocks[phoneme].keyframe_insert("value",
-1, offst+Skey+hldIn+frmOut, "Lipsync")
obj.active_shape_key.value=skVlu # clearing vars
objSK.keys[phoneme].keyframe_insert("value", def clear_properties():
-1, offst+Skey, "Lipsync")
obj.active_shape_key.value=0.0
objSK.keys[phoneme].keyframe_insert("value",
-1, offst+Skey+frmOut, "Lipsync")
# can happen on reload
if bpy.context.scene is None:
return
# creating ui button to running things props = ["offset", "skscale", "easeIn", "easeOut", "blinkSp", "blinkNm", "holdGap", "jlip"]
class LipSync_go(bpy.types.Operator): for p in props:
bl_idname = 'LipSync_go' if p in bpy.types.Scene.bl_rna.properties:
exec("del bpy.types.Scene."+p)
if p in bpy.context.scene:
del bpy.context.scene[p]
# creating ui button to run things
class Lipsyncer(bpy.types.Operator):
bl_idname = 'lipsync.go'
bl_label = 'Start Processing' bl_label = 'Start Processing'
bl_description = 'Plots the voice file keys to timeline' bl_description = 'Plots the voice file keys to timeline'
def execute(self, context): def execute(self, context):
scn = context.scene
obj = context.object
# testing if a mesh object with shape keys is selected # testing if a mesh object with shape keys is selected
if obj!=None and obj.type=="MESH": if obj!=None and obj.type=="MESH":
if obj.data.shape_keys!=None: if obj.data.shape_keys!=None:
...@@ -146,63 +213,139 @@ class LipSync_go(bpy.types.Operator): ...@@ -146,63 +213,139 @@ class LipSync_go(bpy.types.Operator):
else: print ("Object is not mesh or not selected ") else: print ("Object is not mesh or not selected ")
return {'FINISHED'} return {'FINISHED'}
# drawing the user intreface class Blinker_go(bpy.types.Operator):
class LipSync_viewer(bpy.types.Panel): bl_idname = 'blink.go'
bl_label = 'Start Processing'
bl_description = 'Adds Random or Specifice blinks'
def execute(self, context):
scn = context.scene
obj = context.object
# testing if a mesh object with blink shape keys is selected
if obj!=None and obj.type=="MESH":
if obj.data.shape_keys!=None:
blinker()
else: print("add shape keys PLEASE")
else: print ("Object is not mesh or not selected ")
return {'FINISHED'}
class mnuSelect(bpy.types.Operator):
bl_idname = 'view.operator'
bl_label = 'Operator'
# define possible operations
modes = EnumProperty(items=(('1', 'Lipsyncer', '1'), ('2', 'Blinker', '2')))
def execute(self, context):
global mnulast
# store the choosen selection
mnulast = self.properties.modes
return {'FINISHED'}
# drawing the user interface
class LipSyncUI(bpy.types.Panel):
bl_space_type = "VIEW_3D" bl_space_type = "VIEW_3D"
bl_region_type = "TOOL_PROPS" bl_region_type = "TOOL_PROPS"
bl_label = "LipSync Importer" bl_label = "LipSync Importer & Blinker"
typ = bpy.types.Scene
var = bpy.props
typ.fpath = var.StringProperty(name="Import File ", description="Select your voice file", subtype="FILE_PATH", default="")
typ.skscale = var.FloatProperty(description="Smoothing shape key values", min=0.1, max=1.0)
typ.offset = var.IntProperty(description="Offset your frames")
typ.easeIn = var.IntProperty(description="Smoothing In curve", min=1)
typ.easeOut = var.IntProperty(description="Smoothing Out curve", min=1)
typ.holdGap = var.IntProperty(description="Holding for slow keys", min=0)
typ.blinkSp = var.IntProperty(description="Space between blinks", min=1)
typ.blinkNm = var.IntProperty(description="Number of blinks", min=1)
typ.jlip = var.BoolProperty(description="Enable Jlipsync file")
def __init__(self):
# intializing variables
props = [("offset", 0), ("skscale", 0.8), ("easeIn", 3), ("easeOut", 3), ("blinkSp", 100), ("blinkNm", 10), ("holdGap", 0), ("jlip", 0)]
for p, num in props:
if not p in bpy.context.scene.keys():
bpy.context.scene[p] = num
def draw(self, context): def draw(self, context):
typ.fpath = var.StringProperty(name="Import File ", description="Select your voice file", subtype="FILE_PATH", default="") obj = bpy.context.object
typ.skscale = var.FloatProperty(description="Smoothing shape key values", min=0.1, max=1.0)
typ.offset = var.IntProperty(description="Offset your frames") global mnulast
typ.easeIn = var.IntProperty(description="Smoothing In curve", min=1)
typ.easeOut = var.IntProperty(description="Smoothing Out curve", min=1)
layout = self.layout layout = self.layout
col = layout.column()
if obj != None: if obj != None:
if obj.type == "MESH": if obj.type == "MESH":
col = layout.column()
split = col.split(align=True) split = col.split(align=True)
split.label(text="Selected object is: ", icon="OBJECT_DATA") split.label(text="Selected object is: ", icon="OBJECT_DATA")
split.label(obj.name, icon="EDITMODE_HLT") split.label(obj.name, icon="EDITMODE_HLT")
elif obj.type!="MESH": elif obj.type!="MESH":
layout.row().label(text="Object is not a Mesh", icon="OBJECT_DATA") layout.row().label(text="Object is not a Mesh", icon="OBJECT_DATA")
else: else:
layout.label(text="No object is selected", icon="OBJECT_DATA") layout.label(text="No object is selected", icon="OBJECT_DATA")
layout.prop(context.scene, "fpath")
layout = self.layout
col = layout.column() col = layout.column()
col.label("Select Mode :")
if eval(mnulast)==1:
col.operator_menu_enum('view.operator', 'modes', 'Lipsyncer')
col.prop(context.scene, "fpath")
col.prop(context.scene, "jlip", "Jlipsync Moho File")
if eval(mnulast)==2:
col.operator_menu_enum('view.operator', 'modes', 'Blinker')
split = col.split(align=True) split = col.split(align=True)
split.label("Shape Key Value :") split.label("Key Value :")
split.prop(context.scene, "skscale") split.prop(context.scene, "skscale")
col = layout.column()
split = col.split(align=True) split = col.split(align=True)
split.label("Frame Offset :") split.label("Frame Offset :")
split.prop(context.scene, "offset") split.prop(context.scene, "offset")
col = layout.column()
split = col.split(align=True)
split.prop(context.scene, "easeIn", "Ease In")
split.prop(context.scene, "easeOut", "Ease Out")
col = layout.column()
col.separator()
col.operator('LipSync_go', text='Plote Keys PLEASE')
if bpy.context.scene['jlip'] != 1:
split = col.split(align=True)
split.prop(context.scene, "easeIn", "Ease In")
split.prop(context.scene, "holdGap", "Hold Gap")
split.prop(context.scene, "easeOut", "Ease Out")
if eval(mnulast)==1:
col.operator('lipsync.go', text='Plote Keys PLEASE')
if eval(mnulast)==2:
col.prop(context.scene, "blinkSp", "Spacing")
col.prop(context.scene, "blinkNm", "Times")
col.operator('blink.go', text='Blink Keys PLEASE')
col.separator() col.separator()
col.label("Version 0.21 Updated 27/9/2010") col.label("Version 0.26")
col.label("Updated 30/03/2011")
col.label("Yousef Harfoush") col.label("Yousef Harfoush")
# registering the script # registering the script
def register(): def register():
pass bpy.utils.register_module(__name__)
def unregister(): def unregister():
pass bpy.utils.unregister_module(__name__)
clear_properties()
if __name__ == "__main__": if __name__ == "__main__":
register() register()
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment