精华内容
下载资源
问答
  • 文本转语音,一般会用在无障碍开发。下面介绍如何使用Python实现将文本文件转换成语音输出。准备我测试使用的Python版本为2.7.10,如果你的版本是Python3.5的话,这里就不太适合了。在windows上进行测试的话,这里有...

    文本转语音,一般会用在无障碍开发。下面介绍如何使用Python实现将文本文件转换成语音输出。

    准备

    我测试使用的Python版本为2.7.10,如果你的版本是Python3.5的话,这里就不太适合了。

    在windows上进行测试的话,这里有两种可选的方式:

    pyttsx :下载地址

    微软的Speech API : 这个需要安装pywin32,下载地址

    使用Speech API

    原理

    我们的想法是借助微软的语音接口,所以我们肯定是要进行调用 相关的接口。所以我们需要安装pywin32来帮助我们完成这一个底层的交互。

    示例代码

    import win32com.client

    speaker = win32com.client.Dispatch("SAPI.SpVoice")

    speaker.Speak("Hello, it works!")

    小总结

    是的,调用接口来实现语音功能就是这么简单,但是我们不得不来聊一聊这种方式的缺点。

    对中文支持的不够好,仅仅是这一点,估计在中国没几个用它的了。

    还有就是语速不能很好的控制,详细的API介绍可以参照这里API参考

    pyttsx方式

    原理

    pyttsx 是Python的一个关于文字转语音方面的很不错的库。我们还可以借助pyttsx来实现在线朗读rfc文件或者本地文件等等,最为关键的是,它对中文支持的还是不错的。

    示例代码

    # coding:utf-8

    import sys

    reload(sys)

    sys.setdefaultencoding('utf8')

    # __author__ = '郭 璞'

    # __date__ = '2016/8/6'

    # __Desc__ = 文字转语音输出

    import pyttsx

    engine = pyttsx.init()

    engine.say('hello world')

    engine.say('你好,郭璞')

    engine.runAndWait()

    # 朗读一次

    engine.endLoop()

    小总结

    使用pyttsx,我们可以借助其强大的API来实现我们基本的业务需求。很酷吧。

    pyttsx深入研究

    做完上面的小实验,你肯定会觉得怎么这么不过瘾呢?

    别担心,下面我们就一起走进pyttsx的世界,深入的研究一下其工作原理吧。

    语音引擎工厂

    类似于设计模式中的“工厂模式”,pyttsx通过初始化来获取语音引擎。当我们第一次调用init操作的时候,会返回一个pyttsx的engine对象,再次调用的时候,如果存在engine对象实例,就会使用现有的,否则再重新创建一个。

    pyttsx.init([driverName : string, debug : bool]) → pyttsx.Engine

    从方法声明上来看,第一个参数指定的是语音驱动的名称,这个在底层适合操作系统密切相关的。如下:

    drivename:由pyttsx.driver模块根据操作系统类型来调用,默认使用当前操作系统可以使用的最好的驱动

    sapi5 - SAPI5 on Windows

    nsss - NSSpeechSynthesizer on Mac OS X

    espeak - eSpeak on every other platform

    debug: 这第二个参数是指定要不要以调试状态输出,建议开发阶段设置为True

    引擎接口

    要想很好的运用一个库,不了解其API是不行的。下面来看看pyttsx。engine.Engine的引擎API。

    方法签名

    参数列表

    返回值

    简单释义

    connect(topic : string, cb : callable)

    topic:要描述的事件名称;cb:回调函数

    → dict

    在给定的topic上添加回调通知

    disconnect(token : dict)

    token:回调失联的返回标记

    Void

    结束连接

    endLoop()

    None

    → None

    简单来说就是结束事件循环

    getProperty(name : string)

    name有这些枚举值“rate, vioce,vioces,volumn

    → object

    获取当前引擎实例的属性值

    setProperty(name : string)

    name有这些枚举值“rate, vioce,vioces,volumn

    → object

    设置当前引擎实例的属性值

    say(text : unicode, name : string)

    text:要进行朗读的文本数据; name: 关联发音人,一般用不到

    → None

    预设要朗读的文本数据,这也是“万事俱备,只欠东风”中的“万事俱备”

    runAndWait()

    None

    → None

    这个方法就是“东风”了。当事件队列中事件全部清空的时候返回

    startLoop([useDriverLoop : bool])

    useDriverLoop:是否启用驱动循环

    → None

    开启事件队列

    元数据音调

    在pyttsx.voice.Voice中,处理合成器的发音。

    age

    发音人的年龄,默认为None

    gender

    以字符串为类型的发音人性别: male, female, or neutral.默认为None

    id

    关于Voice的字符串确认信息. 通过 pyttsx.engine.Engine.setPropertyValue()来设置活动发音签名. 这个属性总是被定义。

    languages

    发音支持的语言列表,如果没有,则为一个空的列表。

    name

    发音人名称,默认为None.

    更多测试

    朗读文本

    import pyttsx

    engine = pyttsx.init()

    engine.say('Sally sells seashells by the seashore.')

    engine.say('The quick brown fox jumped over the lazy dog.')

    engine.runAndWait()

    事件监听

    import pyttsx

    def onStart(name):

    print 'starting', name

    def onWord(name, location, length):

    print 'word', name, location, length

    def onEnd(name, completed):

    print 'finishing', name, completed

    engine = pyttsx.init()

    engine.say('The quick brown fox jumped over the lazy dog.')

    engine.runAndWait()

    打断发音

    import pyttsx

    def onWord(name, location, length):

    print 'word', name, location, length

    if location > 10:

    engine.stop()

    engine = pyttsx.init()

    engine.say('The quick brown fox jumped over the lazy dog.')

    engine.runAndWait()

    更换发音人声音

    engine = pyttsx.init()

    voices = engine.getProperty('voices')

    for voice in voices:

    engine.setProperty('voice', voice.id)

    engine.say('The quick brown fox jumped over the lazy dog.')

    engine.runAndWait()

    语速控制

    engine = pyttsx.init()

    rate = engine.getProperty('rate')

    engine.setProperty('rate', rate+50)

    engine.say('The quick brown fox jumped over the lazy dog.')

    engine.runAndWait()

    音量控制

    engine = pyttsx.init()

    volume = engine.getProperty('volume')

    engine.setProperty('volume', volume-0.25)

    engine.say('The quick brown fox jumped over the lazy dog.')

    engine.runAndWait()

    执行一个事件驱动循环

    engine = pyttsx.init()

    def onStart(name):

    print 'starting', name

    def onWord(name, location, length):

    print 'word', name, location, length

    def onEnd(name, completed):

    print 'finishing', name, completed

    if name == 'fox':

    engine.say('What a lazy dog!', 'dog')

    elif name == 'dog':

    engine.endLoop()

    engine = pyttsx.init()

    engine.say('The quick brown fox jumped over the lazy dog.', 'fox')

    engine.startLoop()

    使用一个外部的驱动循环

    engine = pyttsx.init()

    engine.say('The quick brown fox jumped over the lazy dog.', 'fox')

    engine.startLoop(False)

    # engine.iterate() must be called inside externalLoop()

    externalLoop()

    engine.endLoop()

    总结

    看完了上面的讲述,是不是感觉Python实现文本转语音还是蛮简单的?

    那么,快来尝试尝试吧。

    展开全文
  • 文字转语音UNITY_WSA平台处理过程和实现原理中文需要设置声音上代码使用方法一、部署好Unity3d HoloLens项目工程二、新建节点三、添加TTS组件并配置四、调用TTS功能五、测试、打包和运行参考地址源码地址: ...

    UNITY_WSA平台

    HoloLens2 是微软通用平台,使用的类主要是Windows.Media.SpeechSynthesis;

    处理过程和实现原理

    是把string内容转换成语音文件,并转换为audio clip 通过audio source组件进行播放。具体请看 代码,注释比较详细,请自行研究。

    中文需要设置声音

    声音如下TextToSpeechVoice枚举:

     public enum TextToSpeechVoice
        {
            /// <summary>
            ///系统默认声音.
            /// </summary>
            Default,
    
            /// <summary>
            /// 大卫 移动
            /// </summary>
            David,
    
            /// <summary>
            ///马克 移动
            /// </summary>
            Mark,
    
            /// <summary>
            /// 兹拉 移动
            /// </summary>
            Zira,
    
            /// <summary>
            /// 瑶瑶(谐音) 中文
            /// </summary>
            Yaoyao,
    
            /// <summary>
            /// 灰灰(谐音) 中文
            /// </summary>
            Huihui,
    
            /// <summary>
            /// 康康(谐音) 中文
            /// </summary>
            Kangkang,
        }
    

    中文选用Yaoyao,HuiHui或者KangKang。

    上代码

    using System;
    using UnityEngine;
    
    #if !UNITY_EDITOR && UNITY_WSA
    using Windows.Foundation;
    using Windows.Media.SpeechSynthesis;
    using Windows.Storage.Streams;
    using System.Linq;
    using System.Threading.Tasks;
    #endif
    
    namespace HoloToolkit.Unity
    {
        /// <summary>
        /// 知名的可用声音.
        /// </summary>
        public enum TextToSpeechVoice
        {
            /// <summary>
            ///系统默认声音.
            /// </summary>
            Default,
    
            /// <summary>
            /// 大卫 移动
            /// </summary>
            David,
    
            /// <summary>
            ///马克 移动
            /// </summary>
            Mark,
    
            /// <summary>
            /// 兹拉 移动
            /// </summary>
            Zira,
    
            /// <summary>
            /// 瑶瑶(谐音) 中文
            /// </summary>
            Yaoyao,
    
            /// <summary>
            /// 灰灰(谐音) 中文
            /// </summary>
            Huihui,
    
            /// <summary>
            /// 康康(谐音) 中文
            /// </summary>
            Kangkang,
        }
    
        /// <remarks>
        /// <see cref="SpeechSynthesizer"/>生成语音<see cref="SpeechSynthesisStream"/>. 
        /// 这个类将流转换为UnityAudioClip 并使用你在inspector中提供的AudioSource播放
        /// 这可以让你在3D空间中定位声音。推荐的方法是将AudioSource放置在空对象上,
        /// 并将它设为主摄像头的子对象,将其放置在相机上方的大约0.6个单位。
        /// 这个听起来类似于Cortana在操作系统中的讲话。
        /// </remarks>
        [RequireComponent(typeof(AudioSource))]
        public class TextToSpeech : MonoBehaviour
        {
            [Tooltip("播放语音的AudioSource")]
            [SerializeField]
            private AudioSource audioSource;
            public static TextToSpeech Instance = null;
            /// <summary>
            /// 获取或设置播放语音的AudioSource.
            /// </summary>
            public AudioSource AudioSource { get { return audioSource; } set { audioSource = value; } }
    
            /// <summary>
            ///获取或设置用于生成语音的声音.
            /// </summary>
            public TextToSpeechVoice Voice { get { return voice; } set { voice = value; } }
    
            [Tooltip("生成语音的声音")]
            [SerializeField]
            private TextToSpeechVoice voice;
    
    #if !UNITY_EDITOR && UNITY_WSA
            private SpeechSynthesizer synthesizer;
            private VoiceInformation voiceInfo;
            private bool speechTextInQueue = false;
    #endif
    
            /// <summary>
            /// 转换2个字节为-1至1的浮点数
            /// </summary>
            /// <param name="firstByte">第一个字节</param>
            /// <param name="secondByte">第二个字节</param>
            /// <returns>转换的值</returns>
            private static float BytesToFloat(byte firstByte, byte secondByte)
            {
                // 转换两个字节为short(从小到大)
                short s = (short)((secondByte << 8) | firstByte);
    
                // 转换为 -1 至 (略低于) 1
                return s / 32768.0F;
            }
    
            /// <summary>
            /// 转换字节数组为int.
            /// </summary>
            /// <param name="bytes"> 字节数组</param>
            /// <param name="offset"> 读取偏移.</param>
            /// <returns>转换后的int.</returns>
            private static int BytesToInt(byte[] bytes, int offset = 0)
            {
                int value = 0;
                for (int i = 0; i < 4; i++)
                {
                    value |= ((int)bytes[offset + i]) << (i * 8);
                }
                return value;
            }
    
            /// <summary>
            /// 动态创建一个AudioClip音频数据。
            /// </summary>
            /// <param name="name"> 动态生成的AudioClip的名称。</param>
            /// <param name="audioData">音频数据.</param>
            /// <param name="sampleCount">音频数据中的样本数。</param>
            /// <param name="frequency">音频数据的频率。</param>
            /// <returns>AudioClip</returns>
            private static AudioClip ToClip(string name, float[] audioData, int sampleCount, int frequency)
            {
                var clip = AudioClip.Create(name, sampleCount, 1, frequency, false);
                clip.SetData(audioData, 0);
                return clip;
            }
    
            /// <summary>
            /// 转换原始WAV数据为统一格式的音频数据。
            /// </summary>
            /// <param name="wavAudio">WAV数据.</param>
            /// <param name="sampleCount">音频数据中的样本数.</param>
            /// <param name="frequency">音频数据的频率.</param>
            /// <returns>统一格式的音频数据. </returns>
            private static float[] ToUnityAudio(byte[] wavAudio, out int sampleCount, out int frequency)
            {
                // 确定是单声道还是立体声
                int channelCount = wavAudio[22];
    
                // 获取频率
                frequency = BytesToInt(wavAudio, 24);
    
                // 通过所有其他子块,以获得数据子块:
                int pos = 12; // 第一个子块ID从12到16
    
                // 不断迭代,直到找到数据块 (即 64 61 74 61 ...... (即 100 97 116 97 十进制))
                while (!(wavAudio[pos] == 100 && wavAudio[pos + 1] == 97 && wavAudio[pos + 2] == 116 && wavAudio[pos + 3] == 97))
                {
                    pos += 4;
                    int chunkSize = wavAudio[pos] + wavAudio[pos + 1] * 256 + wavAudio[pos + 2] * 65536 + wavAudio[pos + 3] * 16777216;
                    pos += 4 + chunkSize;
                }
                pos += 8;
    
                // Pos现在被定位为开始实际声音数据。
                sampleCount = (wavAudio.Length - pos) / 2;    // 每个样本2字节(16位单声道)
                if (channelCount == 2) { sampleCount /= 2; }  // 每个样本4字节(16位立体声)
    
                // 分配内存(仅支持左通道)
                var unityData = new float[sampleCount];
    
                //写入数组:
                int i = 0;
                while (pos < wavAudio.Length)
                {
                    unityData[i] = BytesToFloat(wavAudio[pos], wavAudio[pos + 1]);
                    pos += 2;
                    if (channelCount == 2)
                    {
                        pos += 2;
                    }
                    i++;
                }
    
                return unityData;
            }
    
    #if !UNITY_EDITOR && UNITY_WSA
            /// <summary>
            /// 执行一个生成语音流的函数,然后在Unity中转换并播放它。
            /// </summary>
            /// <param name="text">
            /// 内容.
            /// </param>
            /// <param name="speakFunc">
            /// 执行以生成语音的实际函数
            /// </param>
            private void PlaySpeech(string text, Func<IAsyncOperation<SpeechSynthesisStream>> speakFunc)
            {
                //确保有内容
                if (speakFunc == null) throw new ArgumentNullException(nameof(speakFunc));
    
                if (synthesizer != null)
                {
                    try
                    {
                        speechTextInQueue = true;
                        // 需要await,因此大部分将作为一个新任务在自己的线程中运行。
                        // 这是件好事,因为它解放了Unity,让它可以继续运行。
                        Task.Run(async () =>
                        {
                            // 换声?
                            if (voice != TextToSpeechVoice.Default)
                            {
                                // 获得名称
                                var voiceName = Enum.GetName(typeof(TextToSpeechVoice), voice);
    
                                // 查看它是一直没被找到还是有改变
                                if ((voiceInfo == null) || (!voiceInfo.DisplayName.Contains(voiceName)))
                                {
                                    // 搜索声音信息
                                    voiceInfo = SpeechSynthesizer.AllVoices.Where(v => v.DisplayName.Contains(voiceName)).FirstOrDefault();
    
                                    // 如果找到则选中
                                    if (voiceInfo != null)
                                    {
                                        synthesizer.Voice = voiceInfo;
                                    }
                                    else
                                    {
                                        Debug.LogErrorFormat("TTS 无法找到声音 {0}。", voiceName);
                                    }
                                }
                            }
    
                            // 播放语音并获得流
                            var speechStream = await speakFunc();
    
                            // 获取原始流的大小
                            var size = speechStream.Size;
    
                            // 创建 buffer
                            byte[] buffer = new byte[(int)size];
    
                            // 获取输入流和原始流的大小
                            using (var inputStream = speechStream.GetInputStreamAt(0))
                            {
                                // 关闭原始的语音流,释放内存
                                speechStream.Dispose();
    
                                // 从输入流创建一个新的DataReader
                                using (var dataReader = new DataReader(inputStream))
                                {
                                    //将所有字节加载到reader
                                    await dataReader.LoadAsync((uint)size);
    
                                    // 复制reader到buffer
                                    dataReader.ReadBytes(buffer);
                                }
                            }
    
                            // 转换原始WAV数据为统一格式的音频数据
                            int sampleCount = 0;
                            int frequency = 0;
                            var unityData = ToUnityAudio(buffer, out sampleCount, out frequency);
    
                            // 剩下的工作须在Unity的主线程中完成
                            UnityEngine.WSA.Application.InvokeOnAppThread(() =>
                            {
                                // 转换为audio clip
                                var clip = ToClip("Speech", unityData, sampleCount, frequency);
    
                                // 设置audio clip的语音
                                audioSource.clip = clip;
    
                                // 播放声音
                                audioSource.Play();
                                speechTextInQueue = false;
                            }, false);
                        });
                    }
                    catch (Exception ex)
                    {
                        speechTextInQueue = false;
                        Debug.LogErrorFormat("语音生成错误: \"{0}\"", ex.Message);
                    }
                }
                else
                {
                    Debug.LogErrorFormat("语音合成器未初始化. \"{0}\"", text);
                }
            }
    #endif
    
            private void Awake()
            {
                try
                {
                    if (audioSource == null)
                    {
                        audioSource = GetComponent<AudioSource>();
                    }
    #if !UNITY_EDITOR && UNITY_WSA
                    synthesizer = new SpeechSynthesizer();
    #endif
                    Instance = this;
                }
                catch (Exception ex)
                {
                    Debug.LogError("不能开始语音合成: " + ex.Message);
                }
            }
    
            // 公共方法
    
            /// <summary>
            /// 播放指定SSML标记语音.
            /// </summary>
            /// <param name="ssml">SSML标记</param>
            public void SpeakSsml(string ssml)
            {
                // 确保内容不为空
                if (string.IsNullOrEmpty(ssml)) { return; }
    
                // 传递给辅助方法
    #if !UNITY_EDITOR && UNITY_WSA
                PlaySpeech(ssml, () => synthesizer.SynthesizeSsmlToStreamAsync(ssml));
    #else
                Debug.LogWarningFormat("文字转语音在编辑器下不支持.\n\"{0}\"", ssml);
    #endif
            }
    
            /// <summary>
            /// 播放指定文本语音.
            /// </summary>
            /// <param name="text">文本内容</param>
            public void StartSpeaking(string text)
            {
                // 确保内容不为空
                if (string.IsNullOrEmpty(text)) { return; }
    
                // 传递给辅助方法
    #if !UNITY_EDITOR && UNITY_WSA
                PlaySpeech(text, ()=> synthesizer.SynthesizeTextToStreamAsync(text));
    #else
                Debug.LogWarningFormat("文字转语音在编辑器下不支持.\n\"{0}\"", text);
    #endif
            }
    
            /// <summary>
            /// 返回一个文本是否被提交并被PlaySpeech方法处理
            /// 方便避免当文本提交,但音频剪辑还没有准备好,因为音频源还没有播放的情况。
            /// </summary>
            /// <returns></returns>
            public bool SpeechTextInQueue()
            {
    #if !UNITY_EDITOR && UNITY_WSA
                return speechTextInQueue;
    #else
                return false;
    #endif
            }
    
            /// <summary>
            /// 是否在播放语音.
            /// </summary>
            /// <returns>
            /// True, 在播放. False,未播放.
            /// </returns>
            public bool IsSpeaking()
            {
                if (audioSource != null)
                {
                    return audioSource.isPlaying;
                }
    
                return false;
            }
    
            /// <summary>
            /// 停止播放语音.
            /// </summary>
            public void StopSpeaking()
            {
                if (IsSpeaking())
                {
                    audioSource.Stop();
                }
            }
        }
    }
    

    使用方法

    一、部署好Unity3d HoloLens项目工程

    这一步请自行完成
    

    二、新建节点

    在这里插入图片描述
    如上图 在camera节点下新建节点,并添加audio source组件,将position.y设置为 0.6,这样听起来类似于Cortana在操作系统中的讲话。

    三、添加TTS组件并配置

    在这里插入图片描述
    选择voice 为YaoYao

    四、调用TTS功能

    if (TextToSpeech.Instance)
                    TextToSpeech.Instance.StartSpeaking("这是一条测试语音");
    

    五、测试、打包和运行

    在这里插入图片描述
    上图是编辑器下运行的效果图

    参考地址

    https://www.roadtomr.com/2016/05/04/1601/text-to-speech-for-hololens/

    源码地址:

    https://github.com/microsoft/MixedRealityToolkit-Unity/blob/htk_release/Assets/HoloToolkit/Utilities/Scripts/TextToSpeech.cs

    展开全文
  • 使用Speech API原理我们的想法是借助微软的语音接口,所以我们肯定是要进行调用 相关的接口。所以我们需要安装pywin32来帮助我们完成这一个底层的交互。示例代码小总结是的,调用接口来实现语音功能就是这么简单,...

    准备

    我测试使用的Python版本为2.7.10,如果你的版本是Python3.5的话,这里就不太适合了。

    使用Speech API

    原理

    我们的想法是借助微软的语音接口,所以我们肯定是要进行调用 相关的接口。所以我们需要安装pywin32来帮助我们完成这一个底层的交互。

    示例代码

    小总结

    是的,调用接口来实现语音功能就是这么简单,但是我们不得不来聊一聊这种方式的缺点。

    对中文支持的不够好,仅仅是这一点,估计在中国没几个用它的了。

    还有就是语速不能很好的控制

    pyttsx方式

    原理

    pyttsx 是Python的一个关于文字转语音方面的很不错的库。我们还可以借助pyttsx来实现在线朗读rfc文件或者本地文件等等,最为关键的是,它对中文支持的还是不错的。

    示例代码

    小总结

    使用pyttsx,我们可以借助其强大的API来实现我们基本的业务需求。很酷吧。

    pyttsx深入研究

    做完上面的小实验,你肯定会觉得怎么这么不过瘾呢?

    别担心,下面我们就一起走进pyttsx的世界,深入的研究一下其工作原理吧。

    语音引擎工厂

    类似于设计模式中的“工厂模式”,pyttsx通过初始化来获取语音引擎。当我们第一次调用init操作的时候,会返回一个pyttsx的engine对象,再次调用的时候,如果存在engine对象实例,就会使用现有的,否则再重新创建一个。

    从方法声明上来看,第一个参数指定的是语音驱动的名称,这个在底层适合操作系统密切相关的。如下:

    1.drivename:由pyttsx.driver模块根据操作系统类型来调用,默认使用当前操作系统可以使用的最好的驱动

    sapi5 - SAPI5 on Windows

    nsss - NSSpeechSynthesizer on Mac OS X

    espeak - eSpeak on every other platform

    2.debug:这第二个参数是指定要不要以调试状态输出,建议开发阶段设置为True

    引擎接口

    要想很好的运用一个库,不了解其API是不行的。下面来看看pyttsx。engine.Engine的引擎API。

    方法签名

    参数列表

    返回值

    简单释义

    connect(topic : string, cb : callable)

    topic:要描述的事件名称;cb:回调函数

    →   dict

    在给定的topic上添加回调通知

    disconnect(token : dict)

    token:回调失联的返回标记

    Void

    结束连接

    endLoop()

    None

    → None

    简单来说就是结束事件循环

    getProperty(name : string)

    name有这些枚举值“rate, vioce,vioces,volumn

    → object

    获取当前引擎实例的属性值

    setProperty(name : string)

    name有这些枚举值“rate, vioce,vioces,volumn

    → object

    设置当前引擎实例的属性值

    say(text : unicode, name : string)

    text:要进行朗读的文本数据; name: 关联发音人,一般用不到

    → None

    预设要朗读的文本数据,这也是“万事俱备,只欠东风”中的“万事俱备”

    runAndWait()

    None

    → None

    这个方法就是“东风”了。当事件队列中事件全部清空的时候返回

    startLoop([useDriverLoop : bool])

    useDriverLoop:是否启用驱动循环

    → None

    开启事件队列

    元数据音调

    在pyttsx.voice.Voice中,处理合成器的发音。

    age

    发音人的年龄,默认为None

    gender

    以字符串为类型的发音人性别: male, female, or neutral.默认为None

    id

    关于Voice的字符串确认信息. 通过 pyttsx.engine.Engine.setPropertyValue()来设置活动发音签名. 这个属性总是被定义。

    languages

    发音支持的语言列表,如果没有,则为一个空的列表。

    name

    发音人名称,默认为None.

    更多测试

    朗读文本

    事件监听

    打断发音

    更换发音人声音

    语速控制

    音量控制

    执行一个事件驱动循环

    使用一个外部的驱动循环

    总结

    以上就是Python如何实现文本转语音的全部内容,看完了上面的讲述,是不是感觉Python实现文本转语音还是蛮简单的?那么,大家快来尝试尝试吧。希望本文对大家学习Python有所帮助。

    展开全文
  • 小工具之录音(文字转语音) 文字转语音最好的办法当然是找个声优,完美的搞起。 不过显然很多时候需要很多时间,当在对语音要求并不高的时候自然也就有了投机取巧的方法。 工具: win7或win10自带的录音机。 ...

    小工具之录音(文字转语音)

    文字转语音最好的办法当然是找个声优,完美的搞起。

    不过显然很多时候需要很多时间,当在对语音要求并不高的时候自然也就有了投机取巧的方法。

    工具:

    win7或win10自带的录音机。

    原理及步骤:

    1.将需要的语音编辑好文档。

    2.将文档放在百度翻译一类的翻译软件上,点击发音按钮就可以听到不错的语音效果。

      

    3.用win7或win10自带的录音机将翻译软件的发音录下来。

      1)录音机打开方式:

      

      2)需要设置录音机录制的设备,在右下角声音图标上右击,弹出框中有录制设备选项。将麦克风禁用。

      

      3)录制保存。

    4.用格式工厂将录下来的.wma文件转换为.mp3文件即可。

    转载于:https://www.cnblogs.com/s313139232/p/7478244.html

    展开全文
  • 介绍了集成文字转语音处理芯片SD178A芯片的工作原理及应用,给出了SD178A与微处理器硬件接口电路及软件程序
  • 文本转语音,一般会用在无障碍开发。下面介绍如何使用Python实现将文本文件转换成语音输出。准备 使用Speech API 原理示例代码小总结 pyttsx方式 原理示例代码小总结 pyttsx深入研究 语音引擎工厂引擎接口元数据音调...
  • 简要给大家介绍一下语音怎么变文字的吧。需要说明的是,这篇文章为了易读性而牺牲了严谨性,因此文中的很多表述实际上是不准确的。对于有兴趣深入了解的同学,本文的末尾推荐了几份进阶阅读材料。下面我们开始。首先...
  • 上一次只是说了Google TTS API 的原理,这次自己用php实现了下,主要就一个函数参数为两个,第一个是需要朗读的文字,第二个参数是语言,另外发现一个问题,如果在语言为zh-cn的时候,里面包含的英文,朗读出来都是...
  • 1.导入讯飞SDK 把lib里的两个jar文件放到项目的Lib里;...原理就是,利用讯飞的java API,把生成的PCM 文件放到bae允许进行写操作的临时路径下,并成WAV格式,进行输出。 请求参数只有一个,text,值就是要转换的
  • QQ和微信这两款都是非常受人喜欢的聊天交友软件!...今天给大家介绍一下语音转文字原理!截图是没发现微信的语音识别在哪里!可能是小编微信玩少了吧,一般情况来讲都是不玩微信的!QQ语音识别微信语音要调用百...
  • 简要给大家介绍一下语音怎么变文字的吧。需要说明的是,这篇文章为了易读性而牺牲了严谨性,因此文中的很多表述实际上是不准确的。对于有兴趣深入了解的同学,本文的末尾推荐了几份进阶阅读材料。首先,我们知道声音...
  • 简要给大家介绍一下语音怎么变文字的吧。需要说明的是,这篇文章为了易读性而牺牲了严谨性,因此文中的很多表述实际上是不准确的。对于有兴趣深入了解的同学,本文的末尾推荐了几份进阶阅读材料。下面我们开始。首先...
  • 语音识别(Automatic Speech Recognition)是以语音为研究对象,通过语音信号处理和模式识别让机器自动识别和理解人类口述的语。语音识别技术就是让机器通过识别...语音识别的基本原理语音识别系统本质上是一种模式...
  • 语音识别(Automatic Speech Recognition)是以语音为研究对象,通过语音信号处理和模式识别让机器自动识别和理解人类口述的语。语音识别技术就是让机器通过识别和...语音识别的基本原理语音识别系统本质上是一种模式...
  • 重磅干货,第一时间送达一篇文章带你了解文本到语音转换步骤在《这篇文章》...然后继续了解gTTS模块的工作原理,并编写一个简单的程序以更好地掌握总体概念。最后将探索更多有关使用此模块可以完成的工作的想法,然...
  • QQ和微信这两款都是非常受人喜欢的聊天交友软件!...今天给大家介绍一下语音转文字原理!截图是没发现微信的语音识别在哪里!可能是小编微信玩少了吧,一般情况来讲都是不玩微信的!要调用百度AI开放平台的AP...
  • 语音识别原理

    千次阅读 2014-04-24 14:29:12
    简要给大家介绍一下语音怎么变文字的吧。 首先说一下作为输入的时域波形。我们知道声音实际上是一种波。常见的mp3、wmv等格式都是压缩格式,必须成非压缩的纯波形文件,比如Windows PCM文件,即wav文件来处理。...
  • 语音识别是十年来发展最快的技术之一,随着AI的不断发展,深度学习让语音识别技术得到了质的...语音识别技术是指机器自动将人的语音的内容文字,又称 Automatic Speech Recognition,即ASR技术。 语音识别是...
  • 语音识别是什么?他有什么价值,以及他的技术原理是什么...语音识别已经成为了一种很常见的技术,大家在日常生活中经常会用到:苹果的用户肯定都体验过 Siri ,就是典型的语音识别微信里有一个功能是”文字语音转文...
  • 语音识别的技术原理

    2018-08-28 16:10:12
    语音如何变成文字?这是一篇你能读懂的技术原理   语音识别的技术原理是什么?   简要给大家介绍一下语音怎么变文字的吧。希望这个介绍能让所有同学看懂。 首先,我们知道声音实际上是一种波。常见的 mp3、...
  • 语音识别技术原理

    2018-03-07 15:48:07
    简要给大家介绍一下语音怎么变文字的吧。希望这个介绍能让所有同学看懂。首先,我们知道声音实际上是一种波。常见的mp3、wmv等格式都是压缩格式,必须成非压缩的纯波形文件来处理,比如Windows PCM文件,也就是...
  • 简要给大家介绍一下语音怎么变文字的吧。需要说明的是,这篇文章为了易读性而牺牲了严谨性,因此文中的很多表述实际上是不准确的。对于有兴趣深入了解的同学,本文的末尾推荐了几份进阶阅读材料。下面我们开始。首先...
  • 简要给大家介绍一下语音怎么变文字的吧。需要说明的是,这篇文章为了易读性而牺牲了严谨性,因此文中的很多表述实际上是不准确的。首先,我们知道声音实际上是一种波。常见的mp3等格式都是压缩格式,必须成非压缩...
  • 5分钟弄懂语音识别技术原理

    千次阅读 2018-10-26 18:36:55
    5分钟弄懂语音识别技术原理     简要给大家介绍一下语音怎么变文字的吧。希望这个介绍能让所有同学看懂。   首先,我们知道声音实际上是一种波。常见的mp3、wmv等格式都是压缩格式,必须成非压缩的纯波形...
  • 导读本文将介绍语音识别框架kaldi中提出的chain...语音识别的公式化表达语音识别解决的是由音频转文字的任务,那么最优的词序列(即句子)是由解码器[1]在限定的解码词序列空间内,搜索到的使得P(O|W)和P(W)乘积最大的...
  • 语音怎么变文字,今天看到了一篇深入浅出的文章。 首先,我们知道声音实际上是一种波。常见的mp3、wmv等格式都是压缩格式,必须成非压缩的纯波形文件来处理,比如Windows PCM文件,也就是俗称的wav文件。wav文件里...
  • 5分钟弄懂:语音识别技术原理

    千次阅读 2019-07-10 14:33:49
    简要给大家介绍一下语音怎么变文字的吧。希望这个介绍能让所有同学看懂。 首先,我们知道声音实际上是一种波。常见的mp3、wmv等格式都是压缩格式,必须成非压缩的纯波形文件来处理,比如Windows PCM文件,也...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 132
精华内容 52
关键字:

文字转语音原理