刚到12月的第一天早上,刚刚泡好咖啡还没喝上一口,老板就走到我工位旁边,说有个新任务要我搞定——用鸿蒙的文本转语音(TextToSpeech)API开发一款能朗读文字的应用。他说客户有这个需求,想在他们的设备中增加语音提示功能,不但能朗读文本,还要支持多种语言和不同的语音风格。我拿着咖啡点点头,心里想着这事说起来不难,但具体怎么实现还得仔细研究。

初识TextToSpeech API

先入为主的是了解TextToSpeech的基本功能,我打开了华为的鸿蒙开发者官网,在鸿蒙Next API找到了TextToSpeech的文档。根据官方描述,这个API可以将输入的文本转换为语音输出,而且还支持多个语言的朗读,非常适合做语音提示或者播报功能。

说干就干,我先决定尝试一个最简单的用例——把一段文本朗读出来。根据文档,首先要初始化TTS引擎,然后调用speak方法来实现文本的朗读。

第一个Demo:朗读一段文本
首先,我先写了一个最简单的代码片段,来测试文本转语音的功能。代码如下:

import TextToSpeech from '@hmscore/hms-ai-texttospeech';

function startTextToSpeech() {
    let tts = TextToSpeech.getInstance();

    // 配置语音参数
    let config = {
        language: 'en-US',  // 选择语言
        person: 'en-US-st-1',  // 选择朗读的声音
        speed: 1.0,  // 语速
        volume: 1.0  // 音量
    };

    tts.init().then(() => {
        console.log('TTS 引擎初始化成功');
        
        // 朗读文本
        tts.speak('Hello, welcome to HarmonyOS text to speech!', config)
            .then(() => {
                console.log('文本朗读成功');
            })
            .catch((error) => {
                console.error('朗读失败:', error);
            });
    }).catch((error) => {
        console.error('TTS 引擎初始化失败:', error);
    });
}

startTextToSpeech();

上面的代码中,我首先通过TextToSpeech.getInstance()获取了TTS引擎的实例,然后调用init()方法进行初始化,接着就调用speak()方法来朗读一段简单的英文文本。这段代码在第一次运行的时候,其实很顺利,直接听到了设备传来一句“Hello, welcome to HarmonyOS text to speech!”的语音,瞬间让我有了一种成就感。

增加多语言支持

初步成功之后,老板对演示效果表示满意,但是马上又给我提出了新要求:“能不能加一些其他语言,比如中文和西班牙语,让我们产品更国际化?”好嘞,这个其实文档里有提到支持多种语言,那我就继续优化吧。

于是,我决定添加多语言的支持,这里是我改进后的代码:

function startTextToSpeech(text, language) {
    let tts = TextToSpeech.getInstance();

    // 配置多语言参数
    let config = {
        language: language,
        person: language === 'zh-CN' ? 'zh-CN-st-1' : 'es-ES-st-1',  // 根据语言选择不同声音
        speed: 1.0,
        volume: 1.0
    };

    tts.init().then(() => {
        console.log('TTS 引擎初始化成功');

        tts.speak(text, config)
            .then(() => {
                console.log(`${language} 文本朗读成功`);
            })
            .catch((error) => {
                console.error(`${language} 朗读失败:`, error);
            });
    }).catch((error) => {
        console.error('TTS 引擎初始化失败:', error);
    });
}

// 朗读中文文本
startTextToSpeech('你好,欢迎使用鸿蒙系统的文本转语音功能!', 'zh-CN');

// 朗读西班牙语文本
startTextToSpeech('Hola, bienvenido a la función de texto a voz de HarmonyOS!', 'es-ES');

这段代码增加了对中文和西班牙语的支持,我通过动态设置language参数来实现不同语言的朗读。当我运行这段代码时,设备发出了中文和西班牙语的朗读,声音清晰流畅,老板听到“Hola”时也忍不住笑了起来,说:“不错,这个国际化的感觉有了!”

添加暂停与继续功能

既然文本朗读基本功能已经实现得不错,老板又进一步提出了一个实际应用中的新需求:“语音朗读的时候用户可能需要暂停一下,或者继续朗读,能不能把这些功能也加进去?”

我查了文档,发现TextToSpeech模块中有相应的pause()和resume()方法,于是我决定再进一步优化代码,给用户提供更多的交互控制。

// 暂停与继续功能
let ttsInstance = null;

function startTextToSpeechWithControl(text, language) {
    ttsInstance = TextToSpeech.getInstance();

    let config = {
        language: language,
        person: 'zh-CN-st-1',
        speed: 1.0,
        volume: 1.0
    };

    ttsInstance.init().then(() => {
        console.log('TTS 引擎初始化成功');

        ttsInstance.speak(text, config)
            .then(() => {
                console.log('文本朗读成功');
            })
            .catch((error) => {
                console.error('朗读失败:', error);
            });
    }).catch((error) => {
        console.error('TTS 引擎初始化失败:', error);
    });
}

function pauseTTS() {
    if (ttsInstance) {
        ttsInstance.pause()
            .then(() => {
                console.log('朗读已暂停');
            })
            .catch((error) => {
                console.error('暂停失败:', error);
            });
    }
}

function resumeTTS() {
    if (ttsInstance) {
        ttsInstance.resume()
            .then(() => {
                console.log('朗读已继续');
            })
            .catch((error) => {
                console.error('继续朗读失败:', error);
            });
    }
}

// 测试代码
startTextToSpeechWithControl('测试暂停与继续功能,试试看效果如何。', 'zh-CN');

// 可以通过调用 pauseTTS() 和 resumeTTS() 进行控制

在这里,我添加了两个新函数:pauseTTS()和resumeTTS()。用户现在可以在朗读过程中随时暂停或者继续播放,这样在实际场景中,用户如果临时需要停一下再继续,也都能通过这两个功能实现。老板看到这个功能后,很满意地说:“这样用户体验就好了,实用!”

结束语:一路探索与成长

通过这次开发,从最初的文本朗读,到多语言支持,再到增加交互控制功能,我感觉自己对鸿蒙系统的AI能力有了更深入的理解。文档确实很详细,但是在实际开发中,还是会遇到一些小坑,比如权限问题、语音包的安装等,但这也正是开发中的乐趣所在——不断探索,不断解决问题,最终实现功能。

希望这篇文章能帮助那些也在探索鸿蒙开发的小伙伴们,了解如何利用鸿蒙的TextToSpeech API实现文本转语音的功能。开发的过程可能充满挑战,但每一次的成功都让我们离更好的产品更近一步。加油吧,一起在鸿蒙的世界里创造更多的可能性!

 

 

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐