Ok. I would start by setting up a new technique to draw alpha channeled entities. Copy the 'spec' techinque, rename it, change 'AlphaBlendEnable' state to 'True' and set a new function for the pixel shader.

Code:
technique spec_trans // a new name for the new shader 
{
	pass one
	{		
		ZWriteEnable = True;
		AlphaBlendEnable = True; // Enable alpha blending

		VertexShader = compile vs_2_0 bump_VS();
		PixelShader = compile ps_2_0 specBumpTrans_PS(); // A new pixel shader function
	}
}



I copied the 'spec' technique, renamed it, changed 'AlphaBlendEnable' state to 'True' and set a new function for pixel shading.

'AlphaBlendEnable' tells to the shader compiler how to threat the returned color of the pixel shader, it merges the computed color with the target pixel color when is set to true. This little change makes the shader far slower because it has to retrieve the render targets pixel color and merge it with the return of the pixel shader, so be sure of assigning this new technique to actual alpha channeled entities only. Rendering solid entities with activated alpha blending is a big waste of resources that can ruin the whole rendering. This new technique has to be especified inside a new MATERIAL* struct.

Code:
MATERIAL *mtlSpecBumpTrans = {
   effect = "specBump.fx"; // the shader file
   technique = "spec_trans"; // the new technique
   flags = TRANSLUCENT; // not neccesary but you can ensure the entity is rendered by the translucent pass
}



The only thing left is to write the new pixel shader specified inside the new technique.

Code:
float4 specBumpTrans_PS(bumpOut In): COLOR
{
	float4 Base = tex2D(sBaseTex,In.Tex12.xy);
	float4 Normalmap = tex2D(sSkin2,In.Tex12.xy);
	Normalmap.xyz = Normalmap.xyz*2-1;
	float3 Diffuse = DoSpecular(In,Normalmap.xyz,Normalmap.w);	
	Base.xyz *= DoColor(Diffuse,In.Ambient);
	return Base;
}



I copied the 'specBump_PS' function and renamed it. I converted the 'NormalMap' vector to a 4 members vector (float4) so it also holds the alpha channels value. Since the specular value saved into the normal maps alpha channel is not compressed, I needed to uncompress the other three channels in a separate line of code while the alpha channel remains unchanged.

Code:
Normalmap.xyz = Normalmap.xyz*2-1;



The next code line computes the specular term. 'DoSpecular' function spects a three member vector as second parameter, so it needs the channels of 'NormalMap' (previously transformed to a 4 members vector) be specified. The third parameter of 'DoSpecular' is the specular factor which I modified to be the alpha channel of the 'NormalMap' vector.

Code:
float3 Diffuse = DoSpecular(In,Normalmap.xyz,Normalmap.w);



If you want to use a different bitmap to hold the specular term, you will only need to set up a new 'texture' and its 'sampler_state', retrieve its value in a new code line, same as the other two textures, and use it inside 'DoSpecular' parameters.

And that's all.
Salud!